REST Resource: projects.histories.executions.steps

Recurso: Paso

Un Paso representa una única operación realizada como parte de la Ejecución. Se puede utilizar un paso para representar la ejecución de una herramienta (por ejemplo, la ejecución de un ejecutor de pruebas 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 ejecutor 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 formato + 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 establezca en COMPLETO, momento en el que se vuelve inmutable.

Representación JSON
{
  "stepId": string,
  "creationTime": {
    object (Timestamp)
  },
  "completionTime": {
    object (Timestamp)
  },
  "name": string,
  "description": string,
  "state": enum (State),
  "outcome": {
    object (Outcome)
  },
  "hasImages": boolean,
  "labels": {
    string: string,
    ...
  },
  "dimensionValue": {
    string: string,
    ...
  },
  "runDuration": {
    object (Duration)
  },
  "deviceUsageDuration": {
    object (Duration)
  },
  "multiStep": {
    object (MultiStep)
  },

  // Union field step can be only one of the following:
  "testExecutionStep": {
    object (TestExecutionStep)
  },
  "toolExecutionStep": {
    object (ToolExecutionStep)
  }
  // End of list of possible types for union field step.
}
Campos
stepId

string

Un identificador único dentro de una ejecución para este paso.

Devuelve INVALID_ARGUMENT si la persona que llama establece o sobrescribe este campo.

  • En respuesta: siempre configurado
  • En solicitud de creación/actualización: nunca establecido
creationTime

object ( Timestamp )

La hora en que se creó el paso.

  • En respuesta: siempre configurado
  • En solicitud de creación/actualización: nunca establecido
completionTime

object ( Timestamp )

La hora a la que se configuró el estado del paso para completarse.

Este valor se establecerá automáticamente cuando el estado pase a COMPLETO.

  • En respuesta: establezca si el estado de ejecución es COMPLETO.
  • En solicitud de creación/actualización: nunca establecido
name

string

Un nombre breve legible por humanos para mostrar en la interfaz de usuario. Máximo de 100 caracteres. Por ejemplo: construcción limpia

Se devolverá un PRECONDITION_FAILED al crear un nuevo paso si comparte su nombre y valor de dimensión 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.

  • En respuesta: siempre configurado
  • En solicitud de creación: siempre configurado
  • En solicitud de actualización: nunca establecido
description

string

Una descripción de esta herramienta. Por ejemplo: mvn clean package -D skipTests=true

  • En respuesta: presente si lo establece la solicitud de creación/actualización
  • En solicitud de creación/actualización: opcional
state

enum ( 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 sólo se puede establecer en COMPLETO una vez. Se devolverá PRECONDITION_FAILED si el estado se establece en COMPLETE varias veces.

  • En respuesta: siempre configurado
  • En solicitud de creación/actualización: opcional
outcome

object ( Outcome )

Clasificación del resultado, por ejemplo en ÉXITO o FRACASO

  • En respuesta: presente si lo establece la solicitud de creación/actualización
  • En solicitud de creación/actualización: opcional
hasImages

boolean

Si alguno de los resultados de este paso son imágenes cuyas miniaturas se pueden recuperar con thumbnails.list.

  • En respuesta: siempre configurado
  • En solicitud de creación/actualización: nunca establecido
labels

map (key: string, value: string)

Pares clave/valor arbitrarios proporcionados por el usuario que están asociados con el paso.

Los usuarios son responsables de administrar el espacio de nombres de claves de manera que las claves no choquen accidentalmente.

Se devolverá un INVALID_ARGUMENT si el número de etiquetas supera los 100 o si la longitud de cualquiera de las claves o valores supera los 100 caracteres.

  • En respuesta: siempre configurado
  • En solicitud de creación: opcional
  • En solicitud de actualización: opcional; cualquier nuevo par clave/valor se agregará al mapa, y cualquier valor nuevo para una clave existente actualizará el valor de esa clave.

Un objeto que contiene una lista de pares "key": value . Ejemplo: { "name": "wrench", "mass": "1.3kg", "count": "3" } .

dimensionValue

map (key: string, value: string)

Si la ejecución que contiene este paso tiene alguna definición de dimensión establecida, entonces este campo permite al niño especificar los valores de las dimensiones.

Las claves deben coincidir exactamente con la dimensión_definición de la ejecución.

Por ejemplo, si la ejecución tiene dimension_definition = ['attempt', 'device'] entonces un paso debe definir valores para esas dimensiones, por ejemplo. dimensionValue = ['attempt': '1', 'device': 'Nexus 6']

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 dimensionValue = ['attempt': '', 'device': 'Nexus 6']

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 la dimensión_definición de la ejecución.

Se devolverá PRECONDITION_FAILED si otro paso en esta ejecución ya tiene el mismo nombre y valor de dimensión, pero difiere en otros campos de datos; por ejemplo, el campo de paso es diferente.

Se devolverá un PRECONDITION_FAILED si se establece dimensionValue y hay una dimension_definition en la ejecución que no está especificada como una de las claves.

  • En respuesta: presente si lo establece crear
  • En solicitud de creación: opcional
  • En solicitud de actualización: nunca establecido

Un objeto que contiene una lista de pares "key": value . Ejemplo: { "name": "wrench", "mass": "1.3kg", "count": "3" } .

runDuration

object ( Duration )

Cuánto tiempo tardó en ejecutarse este paso.

Si no se establece, se establece en la diferencia entre el tiempo de creación y el tiempo 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 está en cola durante unos minutos antes de ejecutarse, sería apropiado no incluir el tiempo pasado en cola en su duración de ejecución.

Se devolverá PRECONDITION_FAILED si se intenta establecer una duración de ejecución en un paso que ya tiene este campo establecido.

  • En respuesta: presente si se configuró previamente; siempre presente en el paso COMPLETO
  • En solicitud de creación: opcional
  • En solicitud de actualización: opcional
deviceUsageDuration

object ( Duration )

Cuánto se utiliza el recurso del dispositivo para realizar la prueba.

Este es el uso del dispositivo utilizado para fines de facturación, que es diferente de la duración de ejecución; por ejemplo, una falla de la infraestructura no se cobrará por el uso del dispositivo.

Se devolverá PRECONDITION_FAILED si se intenta establecer un uso de dispositivo en un paso que ya tiene este campo configurado.

  • En respuesta: presente si se configuró previamente.
  • En solicitud de creación: opcional
  • En solicitud de actualización: opcional
multiStep

object ( MultiStep )

Detalles cuando se ejecutan varios pasos con la misma configuración como grupo. Estos detalles se pueden utilizar para identificar de qué grupo forma parte este paso. También identifica el 'paso principal' del grupo que indexa a todos los miembros del grupo.

  • En respuesta: presente si se configuró previamente.
  • En crear solicitud: opcional, establezca si este paso se realizó más de una vez.
  • En solicitud de actualización: opcional

step de campo de unión.

step puede ser sólo uno de los siguientes:

testExecutionStep

object ( TestExecutionStep )

Una ejecución de un corredor de pruebas.

toolExecutionStep

object ( ToolExecutionStep )

Una ejecución de una herramienta (utilizada para pasos que no admitimos explícitamente).

Paso de ejecución de prueba

Un paso que representa la ejecución de pruebas.

Acepta archivos xml ant-junit que el servicio analizará en resultados de pruebas 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 utilizando el campo test_result.

Representación JSON
{
  "testSuiteOverviews": [
    {
      object (TestSuiteOverview)
    }
  ],
  "toolExecution": {
    object (ToolExecution)
  },
  "testIssues": [
    {
      object (TestIssue)
    }
  ],
  "testTiming": {
    object (TestTiming)
  }
}
Campos
testSuiteOverviews[]

object ( TestSuiteOverview )

Lista de contenidos de descripción general del conjunto de pruebas. Esto podría analizarse desde el registro XML de xUnit por el servidor o cargarse directamente por el usuario. Estas referencias solo deben invocarse cuando los conjuntos de pruebas estén completamente analizados o cargados.

El número máximo permitido de resúmenes de conjuntos de pruebas por paso es 1000.

  • En respuesta: siempre configurado
  • En solicitud de creación: opcional
  • En solicitud de actualización: nunca (use el método personalizado PublishXunitXmlFiles en su lugar)
toolExecution

object ( ToolExecution )

Representa la ejecución del corredor de pruebas.

El código de salida de esta herramienta se utilizará para determinar si la prueba pasó.

  • En respuesta: siempre configurado
  • En solicitud de creación/actualización: opcional
testIssues[]

object ( TestIssue )

Problemas observados durante la ejecución de la prueba.

Por ejemplo, si la aplicación móvil bajo prueba 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.

  • En respuesta: presente si lo establece crear o actualizar
  • En solicitud de creación/actualización: opcional
testTiming

object ( TestTiming )

El desglose del tiempo de ejecución de la prueba.

  • En respuesta: presente si lo establece crear o actualizar
  • En solicitud de creación/actualización: opcional

Ejecución de herramientas

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 (FileReference)
    }
  ],
  "exitCode": {
    object (ToolExitCode)
  },
  "toolOutputs": [
    {
      object (ToolOutputReference)
    }
  ]
}
Campos
commandLineArguments[]

string

La línea de comando tokenizada completa, incluido el nombre del programa (equivalente a argv en un programa C).

  • En respuesta: presente si lo establece la solicitud de creación
  • En solicitud de creación: opcional
  • En solicitud de actualización: nunca establecido
toolLogs[]

object ( FileReference )

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 salga 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.

  • En respuesta: presente si lo establece la solicitud de creación/actualización
  • En solicitud de creación: opcional
  • En solicitud de actualización: opcional, cualquier valor proporcionado se agregará a la lista existente
exitCode

object ( ToolExitCode )

Código de salida de ejecución de la herramienta. Este campo se configurará una vez que la herramienta haya salido.

  • En respuesta: presente si lo establece la solicitud de creación/actualización
  • En solicitud de creación: opcional
  • En la solicitud de actualización: opcional, se devolverá un error FAILED_PRECONDITION si ya se ha configurado un código de salida.
toolOutputs[]

object ( ToolOutputReference )

Referencias a archivos opacos de cualquier formato generados por la ejecución de la herramienta.

El número máximo permitido de salidas de herramientas por paso es 1000.

  • En respuesta: presente si lo establece la solicitud de creación/actualización
  • En solicitud de creación: opcional
  • En solicitud de actualización: opcional, cualquier valor proporcionado se agregará a la lista existente

HerramientaCódigo de salida

Salir del código de la ejecución de una herramienta.

Representación JSON
{
  "number": integer
}
Campos
number

integer

Código de salida de ejecución de la herramienta. Un valor de 0 significa que la ejecución fue exitosa.

  • En respuesta: siempre configurado
  • En solicitud de creación/actualización: siempre configurado

Problema de prueba

Se detectó un problema que ocurrió durante la ejecución de una prueba.

Representación JSON
{
  "errorMessage": string,
  "stackTrace": {
    object (StackTrace)
  },
  "warning": {
    object (Any)
  },
  "severity": enum (Severity),
  "type": enum (Type),
  "category": enum (Category)
}
Campos
errorMessage

string

Un breve mensaje legible por humanos que describe el problema. Requerido.

stackTrace
(deprecated)

object ( StackTrace )

En desuso en favor de los campos de seguimiento de la pila dentro de advertencias específicas.

warning

object ( Any )

Mensaje de advertencia con detalles adicionales del problema. Siempre debe haber un mensaje de com.google.devtools.toolresults.v1.warnings

severity

enum ( Severity )

Gravedad del problema. Requerido.

type

enum ( Type )

Tipo de problema. Requerido.

category

enum ( Category )

Categoría de asunto. 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 brinda soporte para empaquetar/desempaquetar cualquier valor en forma de funciones de utilidad o métodos generados adicionales de cualquier tipo.

Ejemplo 1: empaquetar y descomprimir un mensaje en C++.

Foo foo = ...;
Any any;
any.PackFrom(foo);
...
if (any.UnpackTo(&foo)) {
  ...
}

Ejemplo 2: empaquetar y descomprimir 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 descomprimir un mensaje en Python.

foo = Foo(...)
any = Any()
any.Pack(foo)
...
if any.Is(Foo.DESCRIPTOR):
  any.Unpack(foo)
  ...

Ejemplo 4: empaquetar y descomprimir 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 empaquetado proporcionados por la biblioteca protobuf usarán de forma predeterminada 'type.googleapis.com/full.type.name' como URL de tipo y los métodos de desempaquetado solo usarán el nombre de tipo completo después del último '/' en la URL de tipo. por ejemplo, "foo.bar.com/x/yz" generará el nombre del 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 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 contiene el JSON personalizado además del campo @type . Ejemplo (para mensaje google.protobuf.Duration ):

{
  "@type": "type.googleapis.com/google.protobuf.Duration",
  "value": "1.212s"
}
Representación JSON
{
  "typeUrl": string,
  "value": string
}
Campos
typeUrl

string

Una URL/nombre de recurso que identifica de forma exclusiva el tipo de mensaje del 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 path/google.protobuf.Duration ). El nombre debe estar en forma canónica (por ejemplo, no se acepta el "." inicial).

En la práctica, los equipos suelen precompilar en binario todos los tipos que esperan que se utilicen en el contexto de Any. Sin embargo, para las URL que utilizan el esquema http , https o ningún esquema, opcionalmente se puede configurar un servidor de tipos que asigne las URL de tipo a las definiciones de mensajes de la siguiente manera:

  • Si no se proporciona ningún esquema, se supone https .
  • Un GET HTTP en la URL debe generar un valor google.protobuf.Type en formato binario o producirá un error.
  • Las aplicaciones pueden almacenar en caché los resultados de las búsquedas en función de la URL o tenerlos precompilados en un binario para evitar cualquier búsqueda. Por lo tanto, es necesario preservar la compatibilidad binaria en los cambios de tipos. (Utilice nombres de tipos versionados para gestionar cambios importantes).

Nota: esta funcionalidad no está disponible actualmente en la versión oficial de protobuf y no se utiliza para URL de tipo que comienzan con type.googleapis.com.

Se pueden utilizar esquemas distintos de http , https (o el esquema vacío) con una semántica específica de la implementación.

value

string ( bytes format)

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 predeterminada no especificada. No utilice. Sólo para versiones.
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 proporciona a los usuarios algunas sugerencias para mejorar su experiencia de prueba, por ejemplo, sugiriendo 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. Sólo para versiones.
fatalException El problema es una excepción fatal.
nativeCrash El problema es un bloqueo nativo.
anr El problema es una falla de ANR.
unusedRoboDirective El problema es una directiva robo no utilizada.
compatibleWithOrchestrator El problema es una sugerencia para utilizar el orquestador.
launcherActivityNotFound Problema al encontrar una actividad de inicio
startActivityNotFound Problema al resolver una intención proporcionada por el usuario para iniciar una actividad
incompleteRoboScriptExecution Un script de Robo no se ejecutó por completo.
completeRoboScriptExecution Se ejecutó completa y exitosamente un script Robo.
failedToInstall El APK no se pudo instalar.
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 El rastreo robótico encontró al menos una pantalla con elementos que no son widgets de la interfaz de usuario de Android.
encounteredLoginScreen El rastreo robótico encontró al menos una pantalla de inicio de sesión probable.
performedGoogleLogin Robo inició sesión con Google.
iosException La aplicación iOS falló con una excepción.
iosCrash La aplicación iOS falló sin excepción (por ejemplo, murió).
performedMonkeyActions El rastreo robótico implicó realizar algunas acciones de mono.
usedRoboDirective Robo rastreo utilizó una directiva Robo.
usedRoboIgnoreDirective Robo Crawl utilizó una directiva Robo para ignorar un elemento de la interfaz de usuario.
insufficientCoverage Robo no rastreó algunas partes potencialmente importantes de la aplicación.
inAppPurchases El rastreo robótico implicó 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 Se encuentran elementos de interfaz de usuario superpuestos en el rastreo de Robo
unityException Se detectó una excepción de Unity no detectada (estas aplicaciones no bloquean).
deviceOutOfMemory Se detectó que el dispositivo se está quedando sin memoria
logcatCollectionError Problemas detectados al recopilar logcat
detectedAppSplashScreen Robo detectó una pantalla de presentación proporcionada por la aplicación (frente a la pantalla de presentación del sistema operativo Android).

Categoría

Categorías de cuestiones.

Enumeraciones
unspecifiedCategory Categoría no especificada predeterminada. No utilice. Sólo para versiones.
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 Robo Run.

Tiempo de prueba

Los tiempos de las pruebas se desglosan para conocer las fases.

Representación JSON
{
  "testProcessDuration": {
    object (Duration)
  }
}
Campos
testProcessDuration

object ( Duration )

Cuánto tiempo llevó ejecutar el proceso de prueba.

  • En respuesta: presente si se configuró previamente.
  • En solicitud de creación/actualización: opcional

HerramientaEjecuciónPaso

Paso de herramienta genérico que se utilizará 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 (ToolExecution)
  }
}
Campos
toolExecution

object ( ToolExecution )

Una ejecución de herramienta.

  • En respuesta: presente si lo establece la solicitud de creación/actualización
  • En solicitud de creación/actualización: opcional

Varios pasos

Detalles cuando se ejecutan varios pasos con la misma configuración como grupo.

Representación JSON
{
  "primaryStepId": string,
  "multistepNumber": integer,
  "primaryStep": {
    object (PrimaryStep)
  }
}
Campos
primaryStepId

string

Id. del paso principal (original), que podría ser este paso.

multistepNumber

integer

Int único dado a cada paso. Va desde 0 (inclusive) hasta el número total de pasos (exclusivo). El paso principal es 0.

primaryStep

object ( PrimaryStep )

Presente si es un paso primario (original).

Paso primario

Almacena el estado de la prueba acumulativa de varios pasos que se ejecutaron como grupo y el resultado de cada paso individual.

Representación JSON
{
  "rollUp": enum (OutcomeSummary),
  "individualOutcome": [
    {
      object (IndividualOutcome)
    }
  ]
}
Campos
rollUp

enum ( OutcomeSummary )

Estado de la prueba acumulativa de varios pasos que se ejecutaron con la misma configuración como grupo.

individualOutcome[]

object ( IndividualOutcome )

ID del paso y resultado de cada paso individual.

Resultado individual

Id. de paso y resultado de cada paso individual que se ejecutó como grupo con otros pasos con la misma configuración.

Representación JSON
{
  "stepId": string,
  "outcomeSummary": enum (OutcomeSummary),
  "multistepNumber": integer,
  "runDuration": {
    object (Duration)
  }
}
Campos
stepId

string

outcomeSummary

enum ( OutcomeSummary )

multistepNumber

integer

Int único dado a cada paso. Va desde 0 (inclusive) hasta el número total de pasos (exclusivo). El paso principal es 0.

runDuration

object ( Duration )

Cuánto tiempo tardó en ejecutarse este paso.

Métodos

accessibilityClusters

Enumera los grupos de accesibilidad para un paso determinado

Puede devolver cualquiera de los siguientes códigos de error canónicos:

  • PERMISSION_DENIED: si el usuario no está autorizado a leer el proyecto
  • INVALID_ARGUMENT: si la solicitud tiene un formato incorrecto
  • FAILED_PRECONDITION: si un argumento de la solicitud resulta no válido; p.ej

create

Crea un paso.

get

Obtiene un paso.

getPerfMetricsSummary

Recupera un PerfMetricsSummary.

list

Enumera los pasos para una ejecución determinada.

patch

Actualiza un paso existente con la entidad parcial proporcionada.

publishXunitXmlFiles

Publicar archivos xml en un paso existente.