- Risorsa: passo
- PassoEsecuzioneTest
- Esecuzione dello strumento
- StrumentoCodiceUscita
- Problema di prova
- Qualunque
- Gravità
- Tipo
- Categoria
- Test Timing
- PassoEsecuzioneStrumento
- Multifase
- Passaggio primario
- Risultato individuale
- Metodi
Risorsa: passo
Un passo rappresenta una singola operazione eseguita come parte dell'esecuzione. Un passo può essere utilizzato per rappresentare l'esecuzione di uno strumento (ad esempio l'esecuzione di un test runner o l'esecuzione di un compilatore).
Le fasi possono sovrapporsi (ad esempio due fasi potrebbero avere la stessa ora di inizio se alcune operazioni vengono eseguite in parallelo).
Ecco un esempio, consideriamo che abbiamo una build continua che esegue un test runner per ogni iterazione. Il flusso di lavoro sarebbe simile a: - l'utente crea un'esecuzione con id 1 - l'utente crea un TestExecutionStep con id 100 per l'esecuzione 1 - l'utente aggiorna TestExecutionStep con id 100 per aggiungere un log xml non elaborato + il servizio analizza i log xml e restituisce un TestExecutionStep con risultati del test aggiornati. - l'utente aggiorna lo stato di TestExecutionStep con ID 100 su COMPLETE
Un passaggio può essere aggiornato finché il suo stato non viene impostato su COMPLETE, a quel punto diventa immutabile.
Rappresentazione JSON |
---|
{ "stepId": string, "creationTime": { object ( |
Campi | |
---|---|
stepId | Un identificatore univoco all'interno di un'esecuzione per questo passaggio. Restituisce INVALID_ARGUMENT se questo campo viene impostato o sovrascritto dal chiamante.
|
creationTime | L'ora in cui è stato creato il passaggio.
|
completionTime | L'ora in cui lo stato del passaggio è stato impostato su completato. Questo valore verrà impostato automaticamente quando lo stato passa a COMPLETE.
|
name | Un nome breve leggibile da visualizzare nell'interfaccia utente. Massimo 100 caratteri. Ad esempio: build pulita Un PRECONDITION_FAILED verrà restituito al momento della creazione di un nuovo passaggio se condivide il nome e dimensionValue con un passaggio esistente. Se due passaggi rappresentano un'azione simile, ma hanno valori di dimensione diversi, dovrebbero condividere lo stesso nome. Ad esempio, se lo stesso set di test viene eseguito su due piattaforme diverse, i due passaggi dovrebbero avere lo stesso nome.
|
description | Una descrizione di questo strumento Ad esempio: mvn clean package -D skipTests=true
|
state | Lo stato iniziale è IN_PROGRESS. Le uniche transizioni di stato legali sono * IN_PROGRESS -> COMPLETE Se viene richiesta una transizione non valida verrà restituito un PRECONDITION_FAILED. È valido creare Step con uno stato impostato su COMPLETE. Lo stato può essere impostato su COMPLETE solo una volta. Verrà restituito un PRECONDITION_FAILED se lo stato viene impostato su COMPLETE più volte.
|
outcome | Classificazione del risultato, ad esempio in SUCCESSO o FALLIMENTO
|
hasImages | Indica se uno qualsiasi degli output di questo passaggio sono immagini le cui miniature possono essere recuperate con miniature.list.
|
labels | Coppie chiave/valore arbitrarie fornite dall'utente associate al passaggio. Gli utenti sono responsabili della gestione dello spazio dei nomi delle chiavi in modo che le chiavi non entrino in collisione accidentalmente. Verrà restituito un INVALID_ARGUMENT se il numero di etichette supera 100 o se la lunghezza di una qualsiasi delle chiavi o dei valori supera 100 caratteri.
Un oggetto contenente un elenco di coppie |
dimensionValue | Se l'esecuzione contenente questo passaggio ha una dimensione_definizione impostata, allora questo campo consente al figlio di specificare i valori delle dimensioni. Le chiavi devono corrispondere esattamente alla dimension_definition dell'esecuzione. Ad esempio, se l'esecuzione ha Se un passaggio non partecipa a una dimensione della matrice, il valore per quella dimensione dovrebbe essere una stringa vuota. Ad esempio, se uno dei test viene eseguito da un corridore che non supporta i tentativi, il passaggio potrebbe avere Se il passaggio non partecipa ad alcuna dimensione della matrice, potrebbe lasciare dimensionValue non impostato. Verrà restituito un PRECONDITION_FAILED se una qualsiasi delle chiavi non esiste nella dimension_definition dell'esecuzione. Verrà restituito un PRECONDITION_FAILED se un altro passaggio in questa esecuzione ha già lo stesso nome e dimensionValue, ma differisce in altri campi dati, ad esempio il campo del passaggio è diverso. Verrà restituito un PRECONDITION_FAILED se dimensionValue è impostato ed è presente un dimension_definition nell'esecuzione che non è specificato come una delle chiavi.
Un oggetto contenente un elenco di coppie |
runDuration | Quanto tempo è stato necessario per l'esecuzione di questo passaggio. Se non impostato, viene impostato sulla differenza tra CreationTime e CompleteTime quando il passaggio è impostato sullo stato COMPLETE. In alcuni casi è opportuno impostare questo valore separatamente: ad esempio, se viene creato un passo, ma l'operazione che rappresenta viene accodata per alcuni minuti prima di essere eseguita, sarebbe opportuno non includere nel suo runDuration. PRECONDITION_FAILED verrà restituito se si tenta di impostare un runDuration su un passaggio in cui è già impostato questo campo.
|
deviceUsageDuration | Quanto viene utilizzata la risorsa del dispositivo per eseguire il test. Si tratta dell'utilizzo del dispositivo utilizzato a scopo di fatturazione, che è diverso da runDuration, ad esempio, un guasto dell'infrastruttura non verrà addebitato per l'utilizzo del dispositivo. PRECONDITION_FAILED verrà restituito se si tenta di impostare un device_usage su un passaggio in cui è già impostato questo campo.
|
multiStep | Dettagli quando vengono eseguiti più passaggi con la stessa configurazione di un gruppo. Questi dettagli possono essere utilizzati per identificare di quale gruppo fa parte questo passaggio. Identifica inoltre il "passaggio primario" del gruppo che indicizza tutti i membri del gruppo.
|
| |
testExecutionStep | L'esecuzione di un test runner. |
toolExecutionStep | Un'esecuzione di uno strumento (utilizzato per passaggi che non supportiamo esplicitamente). |
PassoEsecuzioneTest
Un passaggio che rappresenta l'esecuzione dei test.
Accetta file xml ant-junit che verranno analizzati in risultati di test strutturati dal servizio. I percorsi dei file XML vengono aggiornati per aggiungere più file, ma non possono essere eliminati.
Gli utenti possono anche aggiungere manualmente i risultati del test utilizzando il campo test_result.
Rappresentazione JSON |
---|
{ "testSuiteOverviews": [ { object ( |
Campi | |
---|---|
testSuiteOverviews[] | Elenco dei contenuti della panoramica della suite di test. Questo può essere analizzato dal log XML di xUnit dal server o caricato direttamente dall'utente. Questi riferimenti dovrebbero essere chiamati solo quando le suite di test sono state completamente analizzate o caricate. Il numero massimo consentito di panoramiche della suite di test per passaggio è 1000.
|
toolExecution | Rappresenta l'esecuzione del test runner. Il codice di uscita di questo strumento verrà utilizzato per determinare se il test è stato superato.
|
testIssues[] | Problemi osservati durante l'esecuzione del test. Ad esempio, se l'app mobile sottoposta a test si è arrestato in modo anomalo durante il test, il messaggio di errore e il contenuto dell'analisi dello stack possono essere registrati qui per facilitare il debug.
|
testTiming | La suddivisione temporale dell'esecuzione del test.
|
Esecuzione dello strumento
L'esecuzione di uno strumento arbitrario. Potrebbe essere un test runner o uno strumento che copia artefatti o distribuisce codice.
Rappresentazione JSON |
---|
{ "commandLineArguments": [ string ], "toolLogs": [ { object ( |
Campi | |
---|---|
commandLineArguments[] | La riga di comando completamente tokenizzata, incluso il nome del programma (equivalente ad argv in un programma C).
|
toolLogs[] | I riferimenti a qualsiasi registro di testo normale indicano l'esecuzione dello strumento. Questo campo può essere impostato prima della chiusura dello strumento per poter accedere a una visualizzazione in tempo reale dei registri mentre lo strumento è in esecuzione. Il numero massimo consentito di registri utensili per passaggio è 1000.
|
exitCode | Codice di uscita dell'esecuzione dello strumento. Questo campo verrà impostato una volta uscito dallo strumento.
|
toolOutputs[] | Riferimenti a file opachi di qualsiasi formato generati dall'esecuzione dello strumento. Il numero massimo consentito di output dello strumento per passaggio è 1000.
|
StrumentoCodiceUscita
Codice di uscita dall'esecuzione di uno strumento.
Rappresentazione JSON |
---|
{ "number": integer } |
Campi | |
---|---|
number | Codice di uscita dell'esecuzione dello strumento. Un valore pari a 0 significa che l'esecuzione ha avuto successo.
|
Problema di prova
È stato rilevato un problema che si è verificato durante l'esecuzione di un test.
Rappresentazione JSON |
---|
{ "errorMessage": string, "stackTrace": { object ( |
Campi | |
---|---|
errorMessage | Un breve messaggio leggibile che descrive il problema. Necessario. |
stackTrace | Deprecato a favore dei campi di traccia dello stack all'interno di avvisi specifici. |
warning | Messaggio di avviso con ulteriori dettagli sul problema. Dovrebbe essere sempre un messaggio da com.google.devtools.toolresults.v1.warnings |
severity | Gravità del problema. Necessario. |
type | Tipo di problema. Necessario. |
category | Categoria di problema. Necessario. |
Qualunque
Any
contiene un messaggio buffer di protocollo serializzato arbitrario insieme a un URL che descrive il tipo di messaggio serializzato.
La libreria Protobuf fornisce supporto per comprimere/decomprimere valori Any sotto forma di funzioni di utilità o metodi generati aggiuntivi di tipo Any.
Esempio 1: comprimere e decomprimere un messaggio in C++.
Foo foo = ...;
Any any;
any.PackFrom(foo);
...
if (any.UnpackTo(&foo)) {
...
}
Esempio 2: comprimere e decomprimere un messaggio in Java.
Foo foo = ...;
Any any = Any.pack(foo);
...
if (any.is(Foo.class)) {
foo = any.unpack(Foo.class);
}
Esempio 3: comprimere e decomprimere un messaggio in Python.
foo = Foo(...)
any = Any()
any.Pack(foo)
...
if any.Is(Foo.DESCRIPTOR):
any.Unpack(foo)
...
Esempio 4: comprimere e decomprimere un messaggio in Go
foo := &pb.Foo{...}
any, err := ptypes.MarshalAny(foo)
...
foo := &pb.Foo{}
if err := ptypes.UnmarshalAny(any, foo); err != nil {
...
}
I metodi di pack forniti dalla libreria protobuf utilizzeranno per impostazione predefinita "type.googleapis.com/full.type.name" come URL di tipo e i metodi di unpack utilizzeranno solo il nome di tipo completo dopo l'ultimo "/" nell'URL di tipo, ad esempio "foo.bar.com/x/yz" restituirà il nome del tipo "yz".
JSON
La rappresentazione JSON di un valore Any
utilizza la rappresentazione regolare del messaggio incorporato deserializzato, con un campo aggiuntivo @type
che contiene l'URL del tipo. Esempio:
package google.profile;
message Person {
string first_name = 1;
string last_name = 2;
}
{
"@type": "type.googleapis.com/google.profile.Person",
"firstName": <string>,
"lastName": <string>
}
Se il tipo di messaggio incorporato è noto e ha una rappresentazione JSON personalizzata, tale rappresentazione verrà incorporata aggiungendo un value
di campo che contiene il JSON personalizzato oltre al campo @type
. Esempio (per il messaggio google.protobuf.Duration
):
{
"@type": "type.googleapis.com/google.protobuf.Duration",
"value": "1.212s"
}
Rappresentazione JSON |
---|
{ "typeUrl": string, "value": string } |
Campi | |
---|---|
typeUrl | Un nome URL/risorsa che identifica in modo univoco il tipo di messaggio del buffer del protocollo serializzato. Questa stringa deve contenere almeno un carattere "/". L'ultimo segmento del percorso dell'URL deve rappresentare il nome completo del tipo (come in In pratica, i team solitamente precompilano nel binario tutti i tipi che si aspettano che vengano utilizzati nel contesto di Any. Tuttavia, per gli URL che utilizzano lo schema
Nota: questa funzionalità non è attualmente disponibile nella versione ufficiale di protobuf e non viene utilizzata per gli URL di tipo che iniziano con type.googleapis.com. Schemi diversi da |
value | Deve essere un buffer di protocollo serializzato valido del tipo sopra specificato. Una stringa con codifica base64. |
Gravità
Gravità dei problemi.
Enumerazioni | |
---|---|
unspecifiedSeverity | Gravità predefinita non specificata. Non usare. Solo per il controllo delle versioni. |
info | Problema non critico, che fornisce agli utenti alcune informazioni sull'esecuzione del test. |
suggestion | Problema non critico, che fornisce agli utenti alcuni suggerimenti su come migliorare la loro esperienza di test, ad esempio suggerendo di utilizzare Game Loops. |
warning | Problema potenzialmente critico. |
severe | Problema critico. |
Tipo
Tipi di problemi.
Enumerazioni | |
---|---|
unspecifiedType | Tipo predefinito non specificato. Non usare. Solo per il controllo delle versioni. |
fatalException | Il problema è un'eccezione fatale. |
nativeCrash | Il problema è un arresto anomalo nativo. |
anr | Il problema è un arresto anomalo dell'ANR. |
unusedRoboDirective | Il problema è una direttiva robot inutilizzata. |
compatibleWithOrchestrator | Il problema è un suggerimento per utilizzare l'orchestratore. |
launcherActivityNotFound | Problema con la ricerca di un'attività di avvio |
startActivityNotFound | Problema con la risoluzione di un intento fornito dall'utente per avviare un'attività |
incompleteRoboScriptExecution | Uno script Robo non è stato eseguito completamente. |
completeRoboScriptExecution | Uno script Robo è stato eseguito completamente e con successo. |
failedToInstall | Impossibile installare l'APK. |
availableDeepLinks | L'app in fase di test presenta collegamenti diretti, ma a Robo non ne è stato fornito nessuno. |
nonSdkApiUsageViolation | L'app ha avuto accesso a un'API non SDK. |
nonSdkApiUsageReport | L'app ha avuto accesso a un'API non SDK (nuovo report dettagliato) |
encounteredNonAndroidUiWidgetScreen | La scansione Robo ha rilevato almeno una schermata con elementi che non sono widget dell'interfaccia utente di Android. |
encounteredLoginScreen | La scansione Robo ha rilevato almeno una probabile schermata di accesso. |
performedGoogleLogin | Robo ha effettuato l'accesso con Google. |
iosException | L'app iOS si è bloccata con un'eccezione. |
iosCrash | L'app iOS si è bloccata senza eccezioni (ad esempio, è stata uccisa). |
performedMonkeyActions | Il robot crawl prevedeva l'esecuzione di alcune azioni della scimmia. |
usedRoboDirective | La scansione Robo utilizzava una direttiva Robo. |
usedRoboIgnoreDirective | La scansione Robo utilizzava una direttiva Robo per ignorare un elemento dell'interfaccia utente. |
insufficientCoverage | Robo non ha eseguito la scansione di alcune parti potenzialmente importanti dell'app. |
inAppPurchases | La scansione robotica prevedeva alcuni acquisti in-app. |
crashDialogError | È stata rilevata una finestra di dialogo di arresto anomalo durante l'esecuzione del test |
uiElementsTooDeep | La profondità dell'elemento dell'interfaccia utente è maggiore della soglia |
blankScreen | Nella scansione di Robo viene trovata una schermata vuota |
overlappingUiElements | Gli elementi dell'interfaccia utente sovrapposti si trovano nella scansione di Robo |
unityException | È stata rilevata un'eccezione Unity non rilevata (queste non causano l'arresto anomalo delle app). |
deviceOutOfMemory | È stata rilevata l'esaurimento della memoria del dispositivo |
logcatCollectionError | Problemi rilevati durante la raccolta di logcat |
detectedAppSplashScreen | Robo ha rilevato una schermata iniziale fornita dall'app (rispetto alla schermata iniziale del sistema operativo Android). |
Categoria
Categorie di problemi.
Enumerazioni | |
---|---|
unspecifiedCategory | Categoria predefinita non specificata. Non usare. Solo per il controllo delle versioni. |
common | Il problema non è specifico per un particolare tipo di test (ad esempio, un arresto anomalo nativo). |
robo | Il problema è specifico di Robo Run. |
Test Timing
I tempi dei test vengono suddivisi per conoscere le fasi.
Rappresentazione JSON |
---|
{
"testProcessDuration": {
object ( |
Campi | |
---|---|
testProcessDuration | Quanto tempo è stato necessario per eseguire il processo di test.
|
PassoEsecuzioneStrumento
Passaggio dello strumento generico da utilizzare per i file binari che non supportiamo esplicitamente. Ad esempio: eseguire cp per copiare gli artefatti da una posizione all'altra.
Rappresentazione JSON |
---|
{
"toolExecution": {
object ( |
Campi | |
---|---|
toolExecution | A Esecuzione dello strumento.
|
Multifase
Dettagli quando vengono eseguiti più passaggi con la stessa configurazione di un gruppo.
Rappresentazione JSON |
---|
{
"primaryStepId": string,
"multistepNumber": integer,
"primaryStep": {
object ( |
Campi | |
---|---|
primaryStepId | ID passaggio del passaggio principale (originale), che potrebbe essere questo passaggio. |
multistepNumber | Int univoco assegnato a ogni passaggio. Varia da 0 (incluso) al numero totale di passaggi (escluso). Il passaggio principale è 0. |
primaryStep | Presente se si tratta di un passaggio primario (originale). |
Passaggio primario
Memorizza lo stato del test di rollup di più passaggi eseguiti come gruppo e il risultato di ogni singolo passaggio.
Rappresentazione JSON |
---|
{ "rollUp": enum ( |
Campi | |
---|---|
rollUp | Stato del test di rollup di più passaggi eseguiti con la stessa configurazione di un gruppo. |
individualOutcome[] | ID passaggio e risultato di ogni singolo passaggio. |
Risultato individuale
ID passaggio e risultato di ogni singolo passaggio eseguito in gruppo con altri passaggi con la stessa configurazione.
Rappresentazione JSON |
---|
{ "stepId": string, "outcomeSummary": enum ( |
Campi | |
---|---|
stepId | |
outcomeSummary | |
multistepNumber | Int univoco assegnato a ogni passaggio. Varia da 0 (incluso) al numero totale di passaggi (escluso). Il passaggio principale è 0. |
runDuration | Quanto tempo è stato necessario per l'esecuzione di questo passaggio. |
Metodi | |
---|---|
| Elenca i cluster di accessibilità per un determinato passaggio Può restituire uno dei seguenti codici di errore canonici:
|
| Crea un passaggio. |
| Ottiene un passaggio. |
| Recupera un PerfMetricsSummary. |
| Elenca i passaggi per una determinata esecuzione. |
| Aggiorna un passaggio esistente con l'entità parziale fornita. |
| Pubblica file xml in uno step esistente. |