REST Resource: projects.histories.executions.steps

Recurso: Paso

Un paso representa una única operación realizada como parte de una ejecución. Se puede usar un paso para representar la ejecución de una herramienta ( por ejemplo, la ejecución de un ejecutor de pruebas o 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 pruebas para cada iteración. El flujo de trabajo se vería de la siguiente manera: - El usuario crea una ejecución con el ID 1 - El usuario crea un TestExecutionStep con el ID 100 para la Ejecución 1 - El usuario actualiza TestExecutionStep con el ID 100 para agregar un registro XML sin procesar + el servicio analiza los registros XML y muestra un TestExecutionStep con TestResult(s) actualizados. - actualiza el estado de TestExecutionStep con el ID 100 a COMPLETE.

Un paso se puede actualizar hasta que su estado se configure como COMPLETE. En ese momento, se volverá 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.

Muestra INVALID_ARGUMENT si el llamador configuró o reemplazó este campo.

  • En respuesta: siempre establecido
  • En la solicitud de creación o actualización: nunca se establece
creationTime

object (Timestamp)

Indica la hora a la que se creó el paso.

  • En respuesta: siempre establecido
  • En la solicitud de creación o actualización: nunca se establece
completionTime

object (Timestamp)

Indica la hora a la que se configuró el estado del paso como completado.

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

  • En respuesta: Se establece si el estado de ejecución es COMPLETE.
  • En la solicitud de creación o actualización: nunca se establece
name

string

Es un nombre corto legible por humanos para mostrar en la IU. 100 caracteres como máximo. Por ejemplo: Compilación limpia

Se mostrará una PRECONDITION_FAILED después de crear un paso nuevo si este 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 el mismo conjunto de pruebas se ejecuta en dos plataformas diferentes, los dos pasos deben tener el mismo nombre.

  • En respuesta: siempre establecido
  • En la solicitud de creación: siempre se establece
  • En la solicitud de actualización: nunca se estableció
description

string

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

  • En respuesta: está presente si se establece mediante la solicitud de creación o actualización.
  • En la solicitud de creación o actualización: opcional
state

enum (State)

El estado inicial es IN_PROGRESS. Las únicas transiciones de estado legal son * IN_PROGRESS -> COMPLETA

Se mostrará una PRECONDITION_FAILED si se solicita una transición no válida.

Es válido crear un paso con un estado establecido en COMPLETE. El estado solo se puede establecer como COMPLETE una vez. Se mostrará una PRECONDITION_FAILED si el estado se configura como COMPLETE varias veces.

  • En respuesta: siempre establecido
  • En la solicitud de creación o actualización: opcional
outcome

object (Outcome)

Clasificación del resultado, por ejemplo, EXITOSO o FAILURE

  • En respuesta: está presente si se establece mediante la solicitud de creación o actualización.
  • En la solicitud de creación o actualización: opcional
hasImages

boolean

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

  • En respuesta: siempre establecido
  • En la solicitud de creación o actualización: nunca se establece
labels

map (key: string, value: string)

Pares clave-valor arbitrarios proporcionados por el usuario que se asocian con el paso.

Los usuarios son responsables de administrar el espacio de nombres de claves para que las claves no entren en conflicto de forma accidental.

Se mostrará un INVALID_ARGUMENT si la cantidad de etiquetas supera las 100 o si la longitud de cualquiera de las claves o los valores supera los 100 caracteres.

  • En respuesta: siempre establecido
  • En la solicitud de creación: opcional
  • En la solicitud de actualización: opcional; cualquier par clave-valor nuevo se agregará al mapa, y cualquier valor nuevo de 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 establecida alguna dimensión_definition, entonces este campo permite que el elemento secundario especifique los valores de las dimensiones.

Las claves deben coincidir exactamente con el valor de dimension_definition de la ejecución.

Por ejemplo, si la ejecución tiene dimension_definition = ['attempt', 'device'], un paso debe definir valores para esas dimensiones, p. ej., 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 un ejecutor que no admite reintentos ejecuta una de las pruebas, el paso podría tener dimensionValue = ['attempt': '', 'device': 'Nexus 6'].

Si el paso no participa en ninguna dimensión de la matriz, es posible que deje sin configurar dimensionValue.

Se mostrará un error PRECONDITION_FAILED si alguna de las claves no existe en la dimensión_definition de la ejecución.

Se mostrará un PRECONDITION_FAILED si otro paso de 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 mostrará un PRECONDITION_FAILED si se establece el valor de la dimensión y hay una definición de dimensión en la ejecución que no se especifica como una de las claves.

  • En respuesta: está presente si se establece mediante create
  • En la solicitud de creación: opcional
  • En la solicitud de actualización: nunca se estableció

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 la estableces, se establecerá como la diferencia entre creatorTime ycompletionTime cuando el paso se establece en el estado COMPLETE. En algunos casos, es apropiado configurar 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 en cola en su runDuration.

Se mostrará PRECONDITION_FAILED si se intenta establecer una runDuration en un paso que ya tiene configurado este campo.

  • En respuesta: está presente si se configuró anteriormente. siempre presente en el paso COMPLETE.
  • En la solicitud de creación: opcional
  • En la solicitud de actualización: opcional
deviceUsageDuration

object (Duration)

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

Este es el uso del dispositivo con fines de facturación, que es diferente de runDuration. Por ejemplo, no se cobrará por el uso del dispositivo ante fallas de infraestructura.

Se mostrará PRECONDITION_FAILED si se intenta configurar un elemento device_usage en un paso que ya tiene configurado este campo.

  • En respuesta: Está presente si se configuró anteriormente.
  • En la solicitud de creación: opcional
  • En la solicitud de actualización: opcional
multiStep

object (MultiStep)

Se detalla cuando se ejecutan varios pasos con la misma configuración que un grupo. Estos detalles se pueden usar para identificar a qué grupo forma parte este paso. También identifica el "paso principal" del grupo. que indexa todos los miembros del grupo.

  • En respuesta: Está presente si se configuró anteriormente.
  • En la solicitud de creación: opcional, se establece si este paso se realizó más de una vez.
  • En la solicitud de actualización: opcional

Campo de unión step.

step puede ser una de las siguientes opciones:

testExecutionStep

object (TestExecutionStep)

Es la ejecución de un ejecutor de pruebas.

toolExecutionStep

object (ToolExecutionStep)

La ejecución de una herramienta (que se usa en pasos que no admitimos de forma explícita).

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 prueba estructurados. Las rutas de los archivos XML se actualizan para agregar más archivos, pero no se pueden borrar.

Los usuarios también pueden agregar los resultados de la prueba de forma manual con 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 la descripción general del paquete de pruebas. Esto se puede analizar desde el registro XML de xUnit por servidor o se puede subir directamente por el usuario. Solo se debe llamar a estas referencias cuando los conjuntos de pruebas se analizan o se suben por completo.

La cantidad máxima permitida de descripciones generales de paquetes de pruebas por paso es 1,000.

  • En respuesta: siempre establecido
  • En la solicitud de creación: opcional
  • En la solicitud de actualización: nunca (usa el método personalizado publishXunitXmlFiles en su lugar)
toolExecution

object (ToolExecution)

Representa la ejecución del ejecutor de pruebas.

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

  • En respuesta: siempre establecido
  • En la solicitud de creación o actualización: opcional
testIssues[]

object (TestIssue)

Problemas observados durante la ejecución de prueba.

Por ejemplo, si la aplicación para dispositivos móviles sometida a prueba falló durante el proceso, el mensaje de error y el contenido del seguimiento de pila se pueden registrar aquí para facilitar la depuración.

  • En respuesta: está presente si se establece mediante create o update
  • En la solicitud de creación o actualización: opcional
testTiming

object (TestTiming)

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

  • En respuesta: está presente si se establece mediante create o update
  • En la solicitud de creación o actualización: opcional

Ejecución de herramientas

La ejecución de una herramienta arbitraria. Puede 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 comandos con asignación de token completa que incluye el nombre del programa (equivalente a argv en un programa en C).

  • En respuesta: está presente si se establece mediante una solicitud de creación.
  • En la solicitud de creación: opcional
  • En la solicitud de actualización: nunca se estableció
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 tener acceso a una visualización en vivo de los registros mientras se ejecuta la herramienta.

La cantidad máxima permitida de registros de herramientas por paso es 1,000.

  • En respuesta: está presente si se establece mediante la solicitud de creación o actualización.
  • En la solicitud de creación: opcional
  • En una solicitud de actualización: opcional, cualquier valor proporcionado se agregará a la lista existente
exitCode

object (ToolExitCode)

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

  • En respuesta: está presente si se establece mediante la solicitud de creación o actualización.
  • En la solicitud de creación: opcional
  • En la solicitud de actualización: Opcional, se mostrará un error FAILED_PRECONDITION si ya se configuró un exitCode.
toolOutputs[]

object (ToolOutputReference)

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

La cantidad máxima permitida de resultados de la herramienta por paso es 1,000.

  • En respuesta: está presente si se establece mediante la solicitud de creación o actualización.
  • En la solicitud de creación: opcional
  • En una solicitud de actualización: opcional, cualquier valor proporcionado se agregará a la lista existente

Código de salida de la herramienta

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

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

integer

Código de salida de la ejecución de la herramienta. El valor 0 significa que la ejecución se realizó correctamente.

  • En respuesta: siempre establecido
  • En la solicitud de creación o actualización: siempre se establece

Problemadeprueba

Se detectó un problema que ocurre durante una ejecución de 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. Obligatorio.

stackTrace
(deprecated)

object (StackTrace)

Obsoleto y se reemplazó por los campos de seguimiento de pila dentro de advertencias específicas.

warning

object (Any)

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

severity

enum (Severity)

Gravedad del problema. Obligatorio.

type

enum (Type)

Tipo de problema. Obligatorio.

category

enum (Category)

Categoría del problema. Obligatorio.

Cualquiera

Any contiene un mensaje de búfer de protocolo serializado arbitrario junto con una URL que describe el tipo de mensaje serializado.

La biblioteca de Protobuf proporciona compatibilidad para empaquetar y desempaquetar cualquier valor en forma de funciones de utilidad o métodos generados adicionales de cualquier tipo.

Ejemplo 1: Empaqueta y descomprime un mensaje en C++.

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

Ejemplo 2: Empaqueta y descomprime un mensaje en Java.

Foo foo = ...;
Any any = Any.pack(foo);
...
if (any.is(Foo.class)) {
  foo = any.unpack(Foo.class);
}

Ejemplo 3: Empaqueta y descomprime un mensaje en Python.

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

Ejemplo 4: Empaqueta y desempaqueta 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 que proporciona la biblioteca de protobuf usarán, de forma predeterminada, “type.googleapis.com/full.type.name”. ya que la URL de tipo y los métodos de desempaquetado solo usan el nombre del tipo completamente calificado después del último '/' en la URL de tipo, por ejemplo, "foo.bar.com/x/y.z" generará el nombre de tipo "y.z".

JSON

La representación JSON de un valor Any usa la representación normal del mensaje incorporado 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 incorporado es conocido y tiene una representación JSON personalizada, esa representación se incorporará, agregando un campo value que, además del campo @type, contiene el JSON personalizado. 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

string

Un nombre de URL o recurso que identifica de forma única el tipo de mensaje del búfer de protocolo serializado. Esta cadena debe contener al menos una “/” carácter. El último segmento de la ruta de acceso de la URL debe representar el nombre completamente calificado del tipo (como en path/google.protobuf.Duration). El nombre debe estar en formato canónico (p.ej., no se acepta el carácter "." inicial).

En la práctica, los equipos suelen precompilar en el objeto binario todos los tipos que esperan que use en el contexto de Any. Sin embargo, en el caso de las URLs que usen el esquema http, https o ningún esquema, es posible configurar de manera opcional un servidor de tipos que asigne las URLs de tipo a las definiciones de mensajes de la siguiente manera:

  • Si no se proporciona ningún esquema, se supone que es https.
  • Un GET de 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 búsqueda en función de la URL o hacer que se compilen previamente en un objeto binario para evitar cualquier búsqueda. Por lo tanto, se debe conservar la compatibilidad binaria en los cambios de tipos. (Usa nombres de tipo con control de versiones para gestionar los cambios rotundos).

Nota: Por el momento, esta funcionalidad no está disponible en la versión oficial de protobuf y no se usa para URLs de tipos que comiencen con type.googleapis.com.

Se pueden usar esquemas que no sean http, https (o el esquema vacío) con semántica específica de implementación.

value

string (bytes format)

Debe ser un búfer de protocolo serializado válido del tipo especificado anteriormente.

String codificada en base64.

Gravedad

Gravedad de los problemas.

Enums
unspecifiedSeverity Gravedad predeterminada sin especificar. No se debe usar. Solo para control de 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, p.ej., sugerencias para usar bucles de juego.
warning Problema potencialmente crítico.
severe Problema crítico.

Tipo

Tipos de problemas.

Enums
unspecifiedType Tipo predeterminado sin especificar. No se debe usar. Solo para control de versiones.
fatalException El problema es una excepción irrecuperable.
nativeCrash El problema es una falla por error en código nativo.
anr El problema es una falla de ANR.
unusedRoboDirective El problema es una directiva de Robo no utilizada.
compatibleWithOrchestrator El problema es una sugerencia para usar Orchestrator.
launcherActivityNotFound Problema al encontrar una actividad de selector
startActivityNotFound Problema con la resolución de un intent proporcionado por el usuario para iniciar una actividad
incompleteRoboScriptExecution No se ejecutó por completo una secuencia de comandos de Robo.
completeRoboScriptExecution Una secuencia de comandos de Robo se ejecutó de forma completa y correcta.
failedToInstall No se pudo instalar el APK.
nonSdkApiUsageViolation La app accedió a una API que no es del SDK.
nonSdkApiUsageReport La app accedió a una API que no es del SDK (nuevo informe detallado)
encounteredNonAndroidUiWidgetScreen El rastreo de Robo encontró al menos una pantalla con elementos que no son widgets de la IU de Android.
encounteredLoginScreen El rastreo de Robo encontró al menos una pantalla de acceso probable.
performedGoogleLogin Robo accedió con Google.
iosException La app para iOS falló con una excepción.
iosCrash La app para iOS falló sin una excepción (p.ej., cerrada).
performedMonkeyActions El rastreo de Robo implicó realizar algunas acciones de prueba semialeatorias.
usedRoboDirective El rastreo de Robo usó una directiva de Robo.
usedRoboIgnoreDirective El rastreo de Robo usó una directiva de Robo para ignorar un elemento de la IU.
insufficientCoverage Robo no rastreó algunas partes potencialmente importantes de la app.
inAppPurchases El rastreo de Robo involucró algunas compras directas desde la aplicación.
crashDialogError Se detectó un diálogo de falla durante la ejecución de prueba
uiElementsTooDeep La profundidad de los elementos de la IU es mayor que el umbral
blankScreen Se encontró una pantalla en blanco en el rastreo de Robo
overlappingUiElements Se encontraron elementos superpuestos de la IU en el rastreo de Robo
unityException Se detectó una excepción de Unity no detectada (estas apps no generan fallas).
deviceOutOfMemory Se detectó que el dispositivo se está quedando sin memoria
logcatCollectionError Se detectaron problemas durante la recopilación de logcat
detectedAppSplashScreen Robo detectó una pantalla de presentación que proporcionó la app (en comparación con una pantalla de presentación del SO Android).
assetIssue Hubo un problema con los elementos de esta prueba.

Categoría

Categorías de problemas.

Enums
unspecifiedCategory Categoría predeterminada sin especificar. No se debe usar. Solo para control de versiones.
common El problema no es específico de un tipo de prueba en particular (p.ej., una falla por error en código nativo).
robo El problema es específico de la ejecución Robo.

Tiempo de prueba

Las pruebas se desglosan para conocer las fases.

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

object (Duration)

El tiempo que se tardó en ejecutar el proceso de prueba.

  • En respuesta: Está presente si se configuró anteriormente.
  • En la solicitud de creación o actualización: opcional

Paso de ejecución de herramienta

Es un paso genérico de la herramienta que se usará para objetos 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: está presente si se establece mediante la solicitud de creación o actualización.
  • En la solicitud de creación o actualización: opcional

Varios pasos

Se detalla cuando se ejecutan varios pasos con la misma configuración que un grupo.

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

string

Es el ID del paso principal (original), que podría ser este paso.

multistepNumber

integer

Int único asignado a cada paso. Va de 0(inclusive) a la cantidad total de pasos(exclusivo). El paso principal es 0.

primaryStep

object (PrimaryStep)

Está presente si es un paso principal (original).

Paso principal

Almacena el estado de la prueba de fusión 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 de fusión de varios pasos que se ejecutaron con la misma configuración que un grupo.

individualOutcome[]

object (IndividualOutcome)

ID del paso y resultado de cada paso individual.

Resultado individual

El ID del paso y el 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 (OutcomeSummary),
  "multistepNumber": integer,
  "runDuration": {
    object (Duration)
  }
}
Campos
stepId

string

outcomeSummary

enum (OutcomeSummary)

multistepNumber

integer

Int único asignado a cada paso. Va de 0(inclusive) a la cantidad 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 clústeres de accesibilidad para un paso determinado

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

  • PERMISSION_DENIED: Si el usuario no está autorizado para leer el proyecto.
  • INVALID_ARGUMENT: Si la solicitud está malformada.
  • FAILED_PRECONDITION: Si un argumento en la solicitud no es válido; p.ej.,

create

Crea un paso.

get

Recibe un paso.

getPerfMetricsSummary

Recupera un PerfMetricsSummary.

list

Enumera los pasos de una ejecución determinada.

patch

Actualiza un paso existente con la entidad parcial proporcionada.

publishXunitXmlFiles

Publica archivos XML en un paso existente.