- Recurso: Paso
- TestExecutionStep
- Ejecución de herramienta
- ToolExitCode
- Problema de prueba
- Cualquier
- Gravedad
- Tipo
- Categoría
- tiempo de prueba
- HerramientaEjecuciónPaso
- Varios pasos
- Paso primario
- Resultado individual
- Métodos
Recurso: Paso
Un paso representa una sola operación realizada como parte de la ejecución. Un paso se puede utilizar para representar la ejecución de una herramienta (por ejemplo, la ejecución de un corredor de prueba o la ejecución de un compilador).
Los pasos pueden superponerse (por ejemplo, dos pasos pueden tener la misma hora de inicio si algunas operaciones se realizan en paralelo).
Aquí hay un ejemplo, consideremos que tenemos una compilación continua que ejecuta un corredor de prueba para cada iteración. El flujo de trabajo se vería así: - el usuario crea una ejecución con id 1 - el usuario crea un TestExecutionStep con id 100 para la ejecución 1 - el usuario actualiza TestExecutionStep con id 100 para agregar un registro xml sin procesar + el servicio analiza los registros xml y devuelve un TestExecutionStep con Resultados de prueba actualizados. - el usuario actualiza el estado de TestExecutionStep con id 100 para COMPLETAR
Un paso se puede actualizar hasta que su estado se establece en COMPLETO, momento en el que se vuelve inmutable.
Representación JSON |
---|
{ "stepId": string, "creationTime": { object ( |
Campos | |
---|---|
stepId | Un identificador único dentro de una ejecución para este paso. Devuelve INVALID_ARGUMENT si la persona que llama establece o sobrescribe este campo.
|
creationTime | La hora en que se creó el paso.
|
completionTime | La hora a la que el estado del paso se configuró para completar. Este valor se establecerá automáticamente cuando el estado cambie a COMPLETO.
|
name | Un nombre corto legible por humanos para mostrar en la interfaz de usuario. Máximo de 100 caracteres. Por ejemplo: compilación limpia Se devolverá PRECONDITION_FAILED al crear un nuevo paso si comparte su nombre y dimensionValue con un paso existente. Si dos pasos representan una acción similar, pero tienen valores de dimensión diferentes, deben compartir el mismo nombre. Por ejemplo, si se ejecuta el mismo conjunto de pruebas en dos plataformas diferentes, los dos pasos deben tener el mismo nombre.
|
description | Una descripción de esta herramienta Por ejemplo: mvn clean package -D skipTests=true
|
state | El estado inicial es IN_PROGRESS. Las únicas transiciones de estado legales son * IN_PROGRESS -> COMPLETE Se devolverá PRECONDITION_FAILED si se solicita una transición no válida. Es válido crear un Paso con un estado establecido en COMPLETO. El estado solo se puede establecer en COMPLETO una vez. Se devolverá PRECONDITION_FAILED si el estado se establece en COMPLETE varias veces.
|
outcome | Clasificación del resultado, por ejemplo en ÉXITO o FALLO
|
hasImages | Si alguna de las salidas de este paso son imágenes cuyas miniaturas se pueden obtener con thumbnails.list.
|
labels | Pares arbitrarios de clave/valor proporcionados por el usuario que están asociados con el paso. Los usuarios son responsables de administrar el espacio de nombres clave de manera que las claves no colisionen accidentalmente. Se devolverá un INVALID_ARGUMENT si el número de etiquetas supera las 100 o si la longitud de cualquiera de las claves o valores supera los 100 caracteres.
Un objeto que contiene una lista de |
dimensionValue | Si la ejecución que contiene este paso tiene definida una definición de dimensión, este campo permite que el elemento secundario especifique los valores de las dimensiones. Las claves deben coincidir exactamente con la definición de dimensión de la ejecución. Por ejemplo, si la ejecución tiene Si un paso no participa en una dimensión de la matriz, el valor de esa dimensión debe ser una cadena vacía. Por ejemplo, si una de las pruebas la ejecuta un corredor que no admite reintentos, el paso podría tener Si el paso no participa en ninguna dimensión de la matriz, puede dejar dimensionValue sin establecer. Se devolverá PRECONDITION_FAILED si alguna de las claves no existe en dimension_definition de la ejecución. Se devolverá PRECONDITION_FAILED si otro paso en esta ejecución ya tiene el mismo nombre y dimensionValue, pero difiere en otros campos de datos, por ejemplo, el campo de paso es diferente. Se devolverá PRECONDITION_FAILED si se establece dimensionValue y hay una dimension_definition en la ejecución que no está especificada como una de las claves.
Un objeto que contiene una lista de |
runDuration | El tiempo que tardó en ejecutarse este paso. Si no se establece, se establece en la diferencia entre la hora de creación y la hora de finalización cuando el paso se establece en el estado COMPLETO. En algunos casos, es apropiado establecer este valor por separado: por ejemplo, si se crea un paso, pero la operación que representa se pone en cola durante unos minutos antes de ejecutarse, sería apropiado no incluir el tiempo en cola en su runDuration. Se devolverá PRECONDITION_FAILED si se intenta establecer una duración de ejecución en un paso que ya tiene este campo establecido.
|
deviceUsageDuration | Cuánto se utiliza el recurso del dispositivo para realizar la prueba. Este es el uso del dispositivo utilizado con fines de facturación, que es diferente de la duración de la ejecución; por ejemplo, no se cobrará por el uso del dispositivo si falla la infraestructura. Se devolverá PRECONDITION_FAILED si se intenta establecer un uso de dispositivo en un paso que ya tiene este campo establecido.
|
multiStep | Detalles cuando se ejecutan varios pasos con la misma configuración que un grupo. Estos detalles se pueden utilizar para identificar de qué grupo forma parte este paso. También identifica el 'paso principal' de los grupos que indexa a todos los miembros del grupo.
|
| |
testExecutionStep | Una ejecución de un corredor de prueba. |
toolExecutionStep | Una ejecución de una herramienta (usada para pasos que no admitimos explícitamente). |
TestExecutionStep
Un paso que representa ejecutar pruebas.
Acepta archivos xml ant-junit que el servicio analizará en resultados de prueba estructurados. Las rutas de los archivos xml se actualizan para agregar más archivos, sin embargo, no se pueden eliminar.
Los usuarios también pueden agregar resultados de pruebas manualmente usando el campo test_result.
Representación JSON |
---|
{ "testSuiteOverviews": [ { object ( |
Campos | |
---|---|
testSuiteOverviews[] | Lista de contenidos de descripción general del conjunto de pruebas. Esto podría ser analizado desde el registro XML de xUnit por el servidor o cargado directamente por el usuario. Estas referencias solo deben llamarse cuando los conjuntos de pruebas se analizan o cargan por completo. El número máximo permitido de resúmenes de conjuntos de pruebas por paso es 1000.
|
toolExecution | Representa la ejecución del corredor de prueba. El código de salida de esta herramienta se utilizará para determinar si pasó la prueba.
|
testIssues[] | Problemas observados durante la ejecución de la prueba. Por ejemplo, si la aplicación móvil que se está probando falla durante la prueba, el mensaje de error y el contenido del seguimiento de la pila se pueden registrar aquí para ayudar en la depuración.
|
testTiming | El desglose de tiempo de la ejecución de la prueba.
|
Ejecución de herramienta
Una ejecución de una herramienta arbitraria. Podría ser un ejecutor de pruebas o una herramienta que copia artefactos o implementa código.
Representación JSON |
---|
{ "commandLineArguments": [ string ], "toolLogs": [ { object ( |
Campos | |
---|---|
commandLineArguments[] | La línea de comando tokenizada completa, incluido el nombre del programa (equivalente a argv en un programa C).
|
toolLogs[] | Las referencias a cualquier registro de texto sin formato generan la ejecución de la herramienta. Este campo se puede configurar antes de que la herramienta haya salido para poder tener acceso a una vista en vivo de los registros mientras la herramienta se está ejecutando. El número máximo permitido de registros de herramientas por paso es 1000.
|
exitCode | Código de salida de ejecución de herramienta. Este campo se establecerá una vez que la herramienta haya salido.
|
toolOutputs[] | Referencias a archivos opacos de cualquier formato generados por la ejecución de la herramienta. El número máximo permitido de salidas de herramienta por paso es 1000.
|
ToolExitCode
Código de salida de la ejecución de una herramienta.
Representación JSON |
---|
{ "number": integer } |
Campos | |
---|---|
number | Código de salida de ejecución de herramienta. Un valor de 0 significa que la ejecución fue exitosa.
|
Problema de prueba
Un problema detectado durante la ejecución de una prueba.
Representación JSON |
---|
{ "errorMessage": string, "stackTrace": { object ( |
Campos | |
---|---|
errorMessage | Un breve mensaje legible por humanos que describe el problema. Requerido. |
stackTrace | En desuso a favor de campos de seguimiento de pila dentro de advertencias específicas. |
warning | Mensaje de advertencia con detalles adicionales del problema. Siempre debe ser un mensaje de com.google.devtools.toolresults.v1.warnings |
severity | Gravedad del problema. Requerido. |
type | Tipo de problema. Requerido. |
category | Categoría de problema. Requerido. |
Cualquier
Any
contiene un mensaje de búfer de protocolo serializado arbitrario junto con una URL que describe el tipo de mensaje serializado.
La biblioteca Protobuf proporciona soporte para empaquetar/desempaquetar valores Any en forma de funciones de utilidad o métodos generados adicionales del tipo Any.
Ejemplo 1: empaquetar y desempaquetar un mensaje en C++.
Foo foo = ...;
Any any;
any.PackFrom(foo);
...
if (any.UnpackTo(&foo)) {
...
}
Ejemplo 2: Empaquetar y desempaquetar un mensaje en Java.
Foo foo = ...;
Any any = Any.pack(foo);
...
if (any.is(Foo.class)) {
foo = any.unpack(Foo.class);
}
Ejemplo 3: Empaquetar y desempaquetar un mensaje en Python.
foo = Foo(...)
any = Any()
any.Pack(foo)
...
if any.Is(Foo.DESCRIPTOR):
any.Unpack(foo)
...
Ejemplo 4: Empaquetar y desempaquetar un mensaje en Go
foo := &pb.Foo{...}
any, err := ptypes.MarshalAny(foo)
...
foo := &pb.Foo{}
if err := ptypes.UnmarshalAny(any, foo); err != nil {
...
}
Los métodos de paquete proporcionados por la biblioteca protobuf usarán de manera predeterminada 'type.googleapis.com/full.type.name' como URL de tipo y los métodos de desempaquetado solo usan el nombre de tipo completo después del último '/' en la URL de tipo, por ejemplo, "foo.bar.com/x/yz" generará el nombre de tipo "yz".
JSON
La representación JSON de un valor Any
utiliza la representación normal del mensaje incrustado deserializado, con un campo adicional @type
que contiene el tipo de URL. Ejemplo:
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 el tipo de mensaje incrustado es conocido y tiene una representación JSON personalizada, esa representación se incrustará agregando un value
de campo que contenga el JSON personalizado además del campo @type
. Ejemplo (para el mensaje google.protobuf.Duration
):
{
"@type": "type.googleapis.com/google.protobuf.Duration",
"value": "1.212s"
}
Representación JSON |
---|
{ "typeUrl": string, "value": string } |
Campos | |
---|---|
typeUrl | Un nombre de URL/recurso que identifica de forma exclusiva el tipo de mensaje de búfer de protocolo serializado. Esta cadena debe contener al menos un carácter "/". El último segmento de la ruta de la URL debe representar el nombre completo del tipo (como en En la práctica, los equipos generalmente precompilan en el binario todos los tipos que esperan que use en el contexto de Any. Sin embargo, para las URL que utilizan el esquema
Nota: esta funcionalidad no está disponible actualmente en la versión oficial de protobuf y no se usa para las URL de tipo que comienzan con type.googleapis.com. Los esquemas que no sean |
value | Debe ser un búfer de protocolo serializado válido del tipo especificado anteriormente. Una cadena codificada en base64. |
Gravedad
Gravedad de los problemas.
Enumeraciones | |
---|---|
unspecifiedSeverity | Gravedad no especificada predeterminada. No utilice. Solo para versionado. |
info | Problema no crítico, que proporciona a los usuarios información sobre la ejecución de la prueba. |
suggestion | Problema no crítico, que brinda a los usuarios algunos consejos para mejorar su experiencia de prueba, por ejemplo, sugerir el uso de Game Loops. |
warning | Problema potencialmente crítico. |
severe | Tema crítico. |
Tipo
Tipos de problemas.
Enumeraciones | |
---|---|
unspecifiedType | Tipo predeterminado no especificado. No utilice. Solo para versionado. |
fatalException | El problema es una excepción fatal. |
nativeCrash | El problema es un bloqueo nativo. |
anr | El problema es un bloqueo de ANR. |
unusedRoboDirective | El problema es una directiva de robo no utilizada. |
compatibleWithOrchestrator | El problema es una sugerencia para usar orquestador. |
launcherActivityNotFound | Problema al encontrar una actividad de lanzador |
startActivityNotFound | Problema con la resolución de una intención proporcionada por el usuario para iniciar una actividad |
incompleteRoboScriptExecution | Un script de Robo no se ejecutó por completo. |
completeRoboScriptExecution | Un script de Robo se ejecutó por completo y con éxito. |
failedToInstall | El APK no se pudo instalar. |
availableDeepLinks | La aplicación bajo prueba tiene enlaces profundos, pero Robo no recibió ninguno. |
nonSdkApiUsageViolation | La aplicación accedió a una API que no es SDK. |
nonSdkApiUsageReport | La aplicación accedió a una Api que no es SDK (nuevo informe detallado) |
encounteredNonAndroidUiWidgetScreen | Robo crawl encontró al menos una pantalla con elementos que no son widgets de la interfaz de usuario de Android. |
encounteredLoginScreen | Robo crawl encontró al menos una probable pantalla de inicio de sesión. |
performedGoogleLogin | Robo inició sesión con Google. |
iosException | La aplicación iOS se bloqueó con una excepción. |
iosCrash | La aplicación iOS se estrelló sin excepción (por ejemplo, se eliminó). |
performedMonkeyActions | Robo crawl implicó realizar algunas acciones de mono. |
usedRoboDirective | Robo crawl usó una directiva Robo. |
usedRoboIgnoreDirective | El rastreo de Robo usó una directiva de Robo para ignorar un elemento de la interfaz de usuario. |
insufficientCoverage | Robo no rastreó algunas partes potencialmente importantes de la aplicación. |
inAppPurchases | Robo crawl involucró algunas compras dentro de la aplicación. |
crashDialogError | Se detectó un cuadro de diálogo de bloqueo durante la ejecución de la prueba |
uiElementsTooDeep | La profundidad del elemento de la interfaz de usuario es mayor que el umbral |
blankScreen | Se encuentra una pantalla en blanco en el rastreo de Robo |
overlappingUiElements | Los elementos de la interfaz de usuario superpuestos se encuentran en el rastreo de Robo |
unityException | Se detectó una excepción de Unity no detectada (estas aplicaciones no fallan). |
deviceOutOfMemory | Se detectó un dispositivo que se está quedando sin memoria |
logcatCollectionError | Problemas detectados al recopilar logcat |
detectedAppSplashScreen | Robo detectó una pantalla de inicio proporcionada por la aplicación (frente a la pantalla de inicio del sistema operativo Android). |
Categoría
Categorías de problemas.
Enumeraciones | |
---|---|
unspecifiedCategory | Categoría predeterminada no especificada. No utilice. Solo para versionado. |
common | El problema no es específico de un tipo de prueba en particular (por ejemplo, un bloqueo nativo). |
robo | El problema es específico de la ejecución de Robo. |
tiempo de prueba
El tiempo de prueba se desglosa para conocer las fases.
Representación JSON |
---|
{
"testProcessDuration": {
object ( |
Campos | |
---|---|
testProcessDuration | Cuánto tiempo se tardó en ejecutar el proceso de prueba.
|
HerramientaEjecuciónPaso
Paso de herramienta genérico que se usará para archivos binarios que no admitimos explícitamente. Por ejemplo: ejecutar cp para copiar artefactos de una ubicación a otra.
Representación JSON |
---|
{
"toolExecution": {
object ( |
Campos | |
---|---|
toolExecution | Una ejecución de herramienta.
|
Varios pasos
Detalles cuando se ejecutan varios pasos con la misma configuración que un grupo.
Representación JSON |
---|
{
"primaryStepId": string,
"multistepNumber": integer,
"primaryStep": {
object ( |
Campos | |
---|---|
primaryStepId | Id. de paso del paso principal (original), que podría ser este paso. |
multistepNumber | Int único dado a cada paso. Va desde 0 (inclusive) hasta el número total de pasos (exclusivo). El paso principal es 0. |
primaryStep | Presente si es un paso primario (original). |
Paso primario
Almacena el estado de la prueba acumulada de varios pasos que se ejecutaron como grupo y el resultado de cada paso individual.
Representación JSON |
---|
{ "rollUp": enum ( |
Campos | |
---|---|
rollUp | Estado de prueba acumulativa de varios pasos que se ejecutaron con la misma configuración que un grupo. |
individualOutcome[] | ID de paso y resultado de cada paso individual. |
Resultado individual
Id. de paso y resultado de cada paso individual que se ejecutó como un grupo con otros pasos con la misma configuración.
Representación JSON |
---|
{ "stepId": string, "outcomeSummary": enum ( |
Campos | |
---|---|
stepId | |
outcomeSummary | |
multistepNumber | Int único dado a cada paso. Va desde 0 (inclusive) hasta el número total de pasos (exclusivo). El paso principal es 0. |
runDuration | El tiempo que tardó en ejecutarse este paso. |
Métodos | |
---|---|
| Enumera los clústeres de accesibilidad para un paso determinado Puede devolver cualquiera de los siguientes códigos de error canónicos:
|
| Crea un paso. |
| Obtiene un Paso. |
| Recupera un PerfMetricsSummary. |
| Enumera los pasos para una ejecución determinada. |
| Actualiza un paso existente con la entidad parcial suministrada. |
| Publique archivos xml en un paso existente. |