- Ressource : Étape
- Étape d'exécution de test
- OutilExécution
- Code de sortie de l'outil
- Problème de test
- N'importe lequel
- Gravité
- Taper
- Catégorie
- Calendrier des tests
- Étape d'exécution de l'outil
- Multi-étapes
- Étape primaire
- Résultat individuel
- Méthodes
Ressource : Étape
Une étape représente une opération unique effectuée dans le cadre de l'exécution. Une étape peut être utilisée pour représenter l'exécution d'un outil (par exemple l'exécution d'un lanceur de tests ou l'exécution d'un compilateur).
Les étapes peuvent se chevaucher (par exemple, deux étapes peuvent avoir la même heure de début si certaines opérations sont effectuées en parallèle).
Voici un exemple, considérons que nous avons une construction continue qui exécute un lanceur de tests pour chaque itération. Le flux de travail ressemblerait à : - l'utilisateur crée une exécution avec l'ID 1 - l'utilisateur crée un TestExecutionStep avec l'ID 100 pour l'exécution 1 - l'utilisateur met à jour TestExecutionStep avec l'ID 100 pour ajouter un journal XML brut + le service analyse les journaux XML et renvoie un TestExecutionStep avec Résultat(s) de test mis à jour. - l'utilisateur met à jour le statut de TestExecutionStep avec l'ID 100 sur COMPLETE
Une étape peut être mise à jour jusqu'à ce que son état soit défini sur COMPLETE, auquel cas elle devient immuable.
Représentation JSON |
---|
{ "stepId": string, "creationTime": { object ( |
Des champs | |
---|---|
stepId | Un identifiant unique au sein d'une exécution pour cette étape. Renvoie INVALID_ARGUMENT si ce champ est défini ou écrasé par l'appelant.
|
creationTime | Heure à laquelle l'étape a été créée.
|
completionTime | Heure à laquelle le statut de l'étape a été défini sur Terminer. Cette valeur sera définie automatiquement lorsque l’état passe à COMPLETE.
|
name | Un nom court et lisible par l'homme à afficher dans l'interface utilisateur. Maximum de 100 caractères. Par exemple : version propre Un PRECONDITION_FAILED sera renvoyé lors de la création d'une nouvelle étape si elle partage son nom et sa dimensionValue avec une étape existante. Si deux étapes représentent une action similaire, mais ont des valeurs de dimension différentes, elles doivent partager le même nom. Par exemple, si le même ensemble de tests est exécuté sur deux plates-formes différentes, les deux étapes doivent porter le même nom.
|
description | Une description de cet outil Par exemple : mvn clean package -D skipTests=true
|
state | L'état initial est IN_PROGRESS. Les seules transitions d'état légales sont * IN_PROGRESS -> COMPLETE Un PRECONDITION_FAILED sera renvoyé si une transition non valide est demandée. Il est possible de créer une étape avec un état défini sur COMPLETE. L’état ne peut être défini sur COMPLETE qu’une seule fois. Un PRECONDITION_FAILED sera renvoyé si l'état est défini plusieurs fois sur COMPLETE.
|
outcome | Classification du résultat, par exemple en SUCCÈS ou ÉCHEC
|
hasImages | Si l'une des sorties de cette étape est des images dont les vignettes peuvent être récupérées avec thumbnails.list.
|
labels | Paires clé/valeur arbitraires fournies par l’utilisateur et associées à l’étape. Les utilisateurs sont responsables de la gestion de l'espace de noms des clés de manière à ce que les clés n'entrent pas en collision accidentellement. Un INVALID_ARGUMENT sera renvoyé si le nombre d'étiquettes dépasse 100 ou si la longueur de l'une des clés ou valeurs dépasse 100 caractères.
Un objet contenant une liste de paires |
dimensionValue | Si l'exécution contenant cette étape a un ensemble dimension_definition, alors ce champ permet à l'enfant de spécifier les valeurs des dimensions. Les clés doivent correspondre exactement à la dimension_definition de l'exécution. Par exemple, si l'exécution a Si une étape ne participe pas à une dimension de la matrice, la valeur de cette dimension doit être une chaîne vide. Par exemple, si l'un des tests est exécuté par un exécuteur qui ne prend pas en charge les nouvelles tentatives, l'étape pourrait avoir Si l’étape ne participe à aucune dimension de la matrice, elle peut laisser dimensionValue non définie. Un PRECONDITION_FAILED sera renvoyé si l'une des clés n'existe pas dans la dimension_definition de l'exécution. Un PRECONDITION_FAILED sera renvoyé si une autre étape de cette exécution a déjà le même nom et la même dimensionValue, mais diffère sur d'autres champs de données, par exemple, le champ d'étape est différent. Un PRECONDITION_FAILED sera renvoyé si dimensionValue est défini et qu'il existe une dimension_definition dans l'exécution qui n'est pas spécifiée comme l'une des clés.
Un objet contenant une liste de paires |
runDuration | Combien de temps il a fallu pour que cette étape s'exécute. S'il n'est pas défini, il correspond à la différence entre CreationTime et CompletionTime lorsque l'étape est définie sur l'état COMPLETE. Dans certains cas, il est approprié de définir cette valeur séparément : Par exemple, si une étape est créée, mais que l'opération qu'elle représente est mise en file d'attente quelques minutes avant son exécution, il serait approprié de ne pas inclure le temps passé en file d'attente dans sa file d'attente. durée d'exécution. PRECONDITION_FAILED sera renvoyé si l'on tente de définir une runDuration sur une étape pour laquelle ce champ est déjà défini.
|
deviceUsageDuration | Quelle quantité de ressources de l'appareil est utilisée pour effectuer le test. Il s'agit de l'utilisation de l'appareil utilisée à des fins de facturation, qui est différente de la durée d'exécution. Par exemple, une panne d'infrastructure ne sera pas facturée pour l'utilisation de l'appareil. PRECONDITION_FAILED sera renvoyé si l'on tente de définir un device_usage sur une étape pour laquelle ce champ est déjà défini.
|
multiStep | Détails lorsque plusieurs étapes sont exécutées avec la même configuration en tant que groupe. Ces détails peuvent être utilisés pour identifier le groupe dont cette étape fait partie. Il identifie également « l'étape principale » du groupe qui indexe tous les membres du groupe.
|
| |
testExecutionStep | Une exécution d’un testeur. |
toolExecutionStep | Une exécution d'un outil (utilisé pour les étapes que nous ne prenons pas explicitement en charge). |
Étape d'exécution de test
Une étape qui représente l’exécution de tests.
Il accepte les fichiers XML Ant-junit qui seront analysés en résultats de tests structurés par le service. Les chemins des fichiers XML sont mis à jour afin d'ajouter davantage de fichiers, mais ils ne peuvent pas être supprimés.
Les utilisateurs peuvent également ajouter des résultats de test manuellement en utilisant le champ test_result.
Représentation JSON |
---|
{ "testSuiteOverviews": [ { object ( |
Des champs | |
---|---|
testSuiteOverviews[] | Liste du contenu de la présentation de la suite de tests. Cela pourrait être analysé à partir du journal XML xUnit par le serveur ou téléchargé directement par l'utilisateur. Ces références ne doivent être appelées que lorsque les suites de tests sont entièrement analysées ou téléchargées. Le nombre maximum autorisé de présentations de suites de tests par étape est de 1 000.
|
toolExecution | Représente l’exécution du programme d’exécution du test. Le code de sortie de cet outil sera utilisé pour déterminer si le test a réussi.
|
testIssues[] | Problèmes observés lors de l’exécution du test. Par exemple, si l'application mobile testée plante pendant le test, le message d'erreur et le contenu de la trace de la pile peuvent être enregistrés ici pour faciliter le débogage.
|
testTiming | Découpage du timing de l'exécution du test.
|
OutilExécution
Une exécution d’un outil arbitraire. Il peut s'agir d'un lanceur de tests ou d'un outil copiant des artefacts ou déployant du code.
Représentation JSON |
---|
{ "commandLineArguments": [ string ], "toolLogs": [ { object ( |
Des champs | |
---|---|
commandLineArguments[] | La ligne de commande complète tokenisée incluant le nom du programme (équivalent à argv dans un programme C).
|
toolLogs[] | Les références à tous les journaux en texte brut génèrent l’exécution de l’outil. Ce champ peut être paramétré avant la sortie de l'outil afin de pouvoir avoir accès à une vue en direct des logs pendant l'exécution de l'outil. Le nombre maximum autorisé de journaux d’outils par étape est de 1 000.
|
exitCode | Code de sortie d’exécution de l’outil. Ce champ sera défini une fois l’outil quitté.
|
toolOutputs[] | Références à des fichiers opaques de n’importe quel format générés par l’exécution de l’outil. Le nombre maximum autorisé de sorties d'outils par étape est de 1 000.
|
Code de sortie de l'outil
Quittez le code d’une exécution d’outil.
Représentation JSON |
---|
{ "number": integer } |
Des champs | |
---|---|
number | Code de sortie d’exécution de l’outil. Une valeur de 0 signifie que l'exécution a réussi.
|
Problème de test
Un problème détecté lors d’une exécution de test.
Représentation JSON |
---|
{ "errorMessage": string, "stackTrace": { object ( |
Des champs | |
---|---|
errorMessage | Un bref message lisible par l'homme décrivant le problème. Requis. |
stackTrace | Obsolète au profit des champs de trace de pile dans des avertissements spécifiques. |
warning | Message d'avertissement avec des détails supplémentaires sur le problème. Doit toujours être un message provenant de com.google.devtools.toolresults.v1.warnings |
severity | Gravité du problème. Requis. |
type | Type de problème. Requis. |
category | Catégorie de problème. Requis. |
N'importe lequel
Any
contient un message tampon de protocole sérialisé arbitraire ainsi qu'une URL qui décrit le type du message sérialisé.
La bibliothèque Protobuf prend en charge le regroupement/décompression des valeurs Any sous la forme de fonctions utilitaires ou de méthodes générées supplémentaires de type Any.
Exemple 1 : emballer et décompresser un message en C++.
Foo foo = ...;
Any any;
any.PackFrom(foo);
...
if (any.UnpackTo(&foo)) {
...
}
Exemple 2 : Packer et décompresser un message en Java.
Foo foo = ...;
Any any = Any.pack(foo);
...
if (any.is(Foo.class)) {
foo = any.unpack(Foo.class);
}
Exemple 3 : Packer et décompresser un message en Python.
foo = Foo(...)
any = Any()
any.Pack(foo)
...
if any.Is(Foo.DESCRIPTOR):
any.Unpack(foo)
...
Exemple 4 : emballer et décompresser un message dans Go
foo := &pb.Foo{...}
any, err := ptypes.MarshalAny(foo)
...
foo := &pb.Foo{}
if err := ptypes.UnmarshalAny(any, foo); err != nil {
...
}
Les méthodes pack fournies par la bibliothèque protobuf utiliseront par défaut « type.googleapis.com/full.type.name » comme URL de type et les méthodes de décompression n'utiliseront que le nom de type complet après le dernier « / » dans l'URL de type, par exemple "foo.bar.com/x/yz" donnera le nom de type "yz".
JSON
La représentation JSON d'une valeur Any
utilise la représentation régulière du message désérialisé et intégré, avec un champ supplémentaire @type
qui contient le type URL. Exemple:
package google.profile;
message Person {
string first_name = 1;
string last_name = 2;
}
{
"@type": "type.googleapis.com/google.profile.Person",
"firstName": <string>,
"lastName": <string>
}
Si le type de message intégré est bien connu et possède une représentation JSON personnalisée, cette représentation sera intégrée en ajoutant une value
de champ contenant le JSON personnalisé en plus du champ @type
. Exemple (pour le message google.protobuf.Duration
) :
{
"@type": "type.googleapis.com/google.protobuf.Duration",
"value": "1.212s"
}
Représentation JSON |
---|
{ "typeUrl": string, "value": string } |
Des champs | |
---|---|
typeUrl | Un nom d'URL/de ressource qui identifie de manière unique le type du message de tampon de protocole sérialisé. Cette chaîne doit contenir au moins un caractère "/". Le dernier segment du chemin de l'URL doit représenter le nom complet du type (comme dans En pratique, les équipes précompilent généralement dans le binaire tous les types qu'elles s'attendent à ce qu'il utilise dans le contexte d'Any. Cependant, pour les URL qui utilisent le schéma
Remarque : cette fonctionnalité n'est actuellement pas disponible dans la version officielle de protobuf et elle n'est pas utilisée pour les URL de type commençant par type.googleapis.com. Des schémas autres que |
value | Il doit s'agir d'un tampon de protocole sérialisé valide du type spécifié ci-dessus. Une chaîne codée en base64. |
Gravité
Gravité des problèmes.
Énumérations | |
---|---|
unspecifiedSeverity | Gravité par défaut non spécifiée. Ne pas utiliser. Pour la gestion des versions uniquement. |
info | Problème non critique, fournissant aux utilisateurs des informations sur le test. |
suggestion | Problème non critique, fournissant aux utilisateurs quelques conseils pour améliorer leur expérience de test, par exemple en suggérant d'utiliser des Game Loops. |
warning | Problème potentiellement critique. |
severe | Problème critique. |
Taper
Types de problèmes.
Énumérations | |
---|---|
unspecifiedType | Type par défaut non spécifié. Ne pas utiliser. Pour la gestion des versions uniquement. |
fatalException | Le problème est une exception fatale. |
nativeCrash | Le problème est un crash natif. |
anr | Le problème est un crash ANR. |
unusedRoboDirective | Le problème est une directive robot inutilisée. |
compatibleWithOrchestrator | Le problème est une suggestion d’utiliser Orchestrator. |
launcherActivityNotFound | Problème avec la recherche d'une activité de lanceur |
startActivityNotFound | Problème lié à la résolution d'une intention fournie par l'utilisateur de démarrer une activité |
incompleteRoboScriptExecution | Un script Robo n'a pas été entièrement exécuté. |
completeRoboScriptExecution | Un script Robo a été exécuté entièrement et avec succès. |
failedToInstall | L'APK n'a pas pu être installé. |
availableDeepLinks | L'application testée comporte des liens profonds, mais aucun n'a été fourni à Robo. |
nonSdkApiUsageViolation | L'application a accédé à une API non SDK. |
nonSdkApiUsageReport | L'application a accédé à une API non SDK (nouveau rapport détaillé) |
encounteredNonAndroidUiWidgetScreen | L'analyse robotique a rencontré au moins un écran contenant des éléments qui ne sont pas des widgets de l'interface utilisateur Android. |
encounteredLoginScreen | L'exploration robotique a rencontré au moins un écran de connexion probable. |
performedGoogleLogin | Robo s'est connecté avec Google. |
iosException | L'application iOS s'est écrasée avec une exception. |
iosCrash | L'application iOS s'est écrasée sans exception (par exemple tuée). |
performedMonkeyActions | Le robot crawl impliquait d'effectuer des actions de singe. |
usedRoboDirective | Robo Crawl a utilisé une directive Robo. |
usedRoboIgnoreDirective | Robo Crawl a utilisé une directive Robo pour ignorer un élément de l'interface utilisateur. |
insufficientCoverage | Robo n'a pas exploré certaines parties potentiellement importantes de l'application. |
inAppPurchases | Robo Crawl impliquait certains achats intégrés. |
crashDialogError | Une boîte de dialogue de crash a été détectée lors de l'exécution du test |
uiElementsTooDeep | La profondeur de l'élément d'interface utilisateur est supérieure au seuil |
blankScreen | Un écran vide est trouvé dans l'exploration du Robo |
overlappingUiElements | Des éléments d'interface utilisateur qui se chevauchent se trouvent dans l'analyse Robo |
unityException | Une exception Unity non interceptée a été détectée (celles-ci ne font pas planter les applications). |
deviceOutOfMemory | Un périphérique manquant de mémoire a été détecté |
logcatCollectionError | Problèmes détectés lors de la collecte du logcat |
detectedAppSplashScreen | Robo a détecté un écran de démarrage fourni par l'application (par rapport à l'écran de démarrage du système d'exploitation Android). |
Catégorie
Catégories de problèmes.
Énumérations | |
---|---|
unspecifiedCategory | Catégorie non spécifiée par défaut. Ne pas utiliser. Pour la gestion des versions uniquement. |
common | Le problème n'est pas spécifique à un type de test particulier (par exemple, un crash natif). |
robo | Le problème est spécifique à Robo Run. |
Calendrier des tests
Le calendrier des tests est décomposé pour connaître les phases.
Représentation JSON |
---|
{
"testProcessDuration": {
object ( |
Des champs | |
---|---|
testProcessDuration | Combien de temps il a fallu pour exécuter le processus de test.
|
Étape d'exécution de l'outil
Étape d'outil générique à utiliser pour les binaires que nous ne prenons pas explicitement en charge. Par exemple : exécuter cp pour copier des artefacts d’un emplacement à un autre.
Représentation JSON |
---|
{
"toolExecution": {
object ( |
Des champs | |
---|---|
toolExecution | Une exécution d'outil.
|
Multi-étapes
Détails lorsque plusieurs étapes sont exécutées avec la même configuration en tant que groupe.
Représentation JSON |
---|
{
"primaryStepId": string,
"multistepNumber": integer,
"primaryStep": {
object ( |
Des champs | |
---|---|
primaryStepId | ID d'étape de l'étape principale (originale), qui peut être cette étape. |
multistepNumber | Int unique donné à chaque étape. Va de 0 (inclus) au nombre total d’étapes (exclus). L'étape principale est 0. |
primaryStep | Présent s’il s’agit d’une étape principale (originale). |
Étape primaire
Stocke l’état des tests cumulatifs de plusieurs étapes exécutées en groupe et le résultat de chaque étape individuelle.
Représentation JSON |
---|
{ "rollUp": enum ( |
Des champs | |
---|---|
rollUp | État du test cumulatif de plusieurs étapes exécutées avec la même configuration en tant que groupe. |
individualOutcome[] | ID de l’étape et résultat de chaque étape individuelle. |
Résultat individuel
ID d’étape et résultat de chaque étape individuelle exécutée en groupe avec d’autres étapes avec la même configuration.
Représentation JSON |
---|
{ "stepId": string, "outcomeSummary": enum ( |
Des champs | |
---|---|
stepId | |
outcomeSummary | |
multistepNumber | Int unique donné à chaque étape. Va de 0 (inclus) au nombre total d’étapes (exclus). L'étape principale est 0. |
runDuration | Combien de temps il a fallu pour que cette étape s'exécute. |
Méthodes | |
---|---|
| Répertorie les clusters d'accessibilité pour une étape donnée Peut renvoyer l’un des codes d’erreur canoniques suivants :
|
| Crée une étape. |
| Obtient un pas. |
| Récupère un PerfMetricsSummary. |
| Répertorie les étapes d'une exécution donnée. |
| Met à jour une étape existante avec l’entité partielle fournie. |
| Publiez des fichiers XML sur une étape existante. |