REST Resource: projects.histories.executions.steps

Ресурс: Шаг

Шаг представляет собой одну операцию, выполняемую как часть выполнения. Шаг может использоваться для представления выполнения инструмента (например, выполнение средства запуска тестов или выполнение компилятора).

Шаги могут перекрываться (например, два шага могут иметь одинаковое время начала, если некоторые операции выполняются параллельно).

Вот пример: давайте предположим, что у нас непрерывная сборка, на каждой итерации выполняется тест-раннер. Рабочий процесс будет выглядеть следующим образом: - пользователь создает выполнение с идентификатором 1 - пользователь создает TestExecutionStep с идентификатором 100 для выполнения 1 - пользователь обновляет TestExecutionStep с идентификатором 100, чтобы добавить необработанный журнал XML + служба анализирует журналы XML и возвращает TestExecutionStep с обновлены результаты теста. - пользователь обновляет статус TestExecutionStep с идентификатором 100 до COMPLETE.

Шаг можно обновлять до тех пор, пока его состояние не станет ЗАВЕРШЕНО, после чего он станет неизменяемым.

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.
}
Поля
stepId

string

Уникальный идентификатор внутри выполнения для этого шага.

Возвращает INVALID_ARGUMENT, если это поле установлено или перезаписано вызывающей стороной.

  • В ответ: всегда устанавливаю
  • В запросе на создание/обновление: никогда не устанавливать
creationTime

object ( Timestamp )

Время создания шага.

  • В ответ: всегда устанавливаю
  • В запросе на создание/обновление: никогда не устанавливать
completionTime

object ( Timestamp )

Время, когда статус шага был установлен как завершенный.

Это значение будет установлено автоматически при переходе состояния в ЗАВЕРШЕНО.

  • В ответ: устанавливается, если состояние выполнения ЗАВЕРШЕНО.
  • В запросе на создание/обновление: никогда не устанавливать
name

string

Короткое удобочитаемое имя для отображения в пользовательском интерфейсе. Максимум 100 символов. Например: Чистая сборка

PRECONDITION_FAILED будет возвращен при создании нового шага, если его имя и размерность совпадают с существующим шагом. Если два шага представляют собой похожее действие, но имеют разные значения измерения, они должны иметь одно и то же имя. Например, если один и тот же набор тестов выполняется на двух разных платформах, два шага должны иметь одно и то же имя.

  • В ответ: всегда устанавливаю
  • В запросе на создание: всегда устанавливается
  • В запросе на обновление: никогда не устанавливать
description

string

Описание этого инструмента. Например: mvn clean package -DskipTests=true.

  • В ответ: присутствует, если установлено запросом на создание/обновление.
  • В запросе на создание/обновление: необязательно.
state

enum ( State )

Исходное состояние — IN_PROGRESS. Единственные допустимые переходы состояний: * IN_PROGRESS -> COMPLETE.

PRECONDITION_FAILED будет возвращен, если запрошен недопустимый переход.

Допустимо создание шага с состоянием COMPLETE. Состояние может быть установлено в COMPLETE только один раз. PRECONDITION_FAILED будет возвращен, если состояние установлено на COMPLETE несколько раз.

  • В ответ: всегда устанавливаю
  • В запросе на создание/обновление: необязательно.
outcome

object ( Outcome )

Классификация результата, например, УСПЕХ или НЕУДАЧА.

  • В ответ: присутствует, если установлено запросом на создание/обновление.
  • В запросе на создание/обновление: необязательно.
hasImages

boolean

Являются ли какие-либо выходные данные этого шага изображениями, миниатюры которых можно получить с помощью Thumbnails.list.

  • В ответ: всегда устанавливаю
  • В запросе на создание/обновление: никогда не устанавливать
labels

map (key: string, value: string)

Произвольные пары ключ/значение, предоставленные пользователем, связанные с шагом.

Пользователи несут ответственность за управление пространством имен ключей, чтобы ключи случайно не конфликтовали.

INVALID_ARGUMENT будет возвращен, если количество меток превышает 100 или если длина любого из ключей или значений превышает 100 символов.

  • В ответ: всегда устанавливаю
  • В запросе на создание: необязательно
  • В запросе на обновление: необязательно; любая новая пара ключ/значение будет добавлена ​​на карту, и любое новое значение для существующего ключа обновит значение этого ключа.

Объект, содержащий список пар "key": value . Пример: { "name": "wrench", "mass": "1.3kg", "count": "3" } .

dimensionValue

map (key: string, value: string)

Если выполнение, содержащее этот шаг, имеет какой-либо набор Dimension_definition, то это поле позволяет дочернему элементу указывать значения измерений.

Ключи должны точно соответствовать измерению_определения выполнения.

Например, если выполнение имеет dimension_definition = ['attempt', 'device'] , тогда шаг должен определить значения для этих измерений, например. dimensionValue = ['attempt': '1', 'device': 'Nexus 6']

Если шаг не участвует в одном измерении матрицы, значением этого измерения должна быть пустая строка. Например, если один из тестов выполняется бегуном, который не поддерживает повторные попытки, шаг может иметь dimensionValue = ['attempt': '', 'device': 'Nexus 6']

Если шаг не участвует ни в одном измерении матрицы, то параметр DimensionValue может остаться неустановленным.

PRECONDITION_FAILED будет возвращен, если какой-либо из ключей не существует в измерении_определения выполнения.

PRECONDITION_FAILED будет возвращен, если другой шаг в этом выполнении уже имеет то же имя и значение измерения, но отличается в других полях данных, например, поле шага отличается.

PRECONDITION_FAILED будет возвращено, если установлено измерение ValueValue и при выполнении имеется измерение_определение, которое не указано в качестве одного из ключей.

  • В ответ: присутствует, если установлено при создании
  • В запросе на создание: необязательно
  • В запросе на обновление: никогда не устанавливать

Объект, содержащий список пар "key": value . Пример: { "name": "wrench", "mass": "1.3kg", "count": "3" } .

runDuration

object ( Duration )

Сколько времени потребовалось для выполнения этого шага.

Если этот параметр не установлен, устанавливается разница между временем создания и временем завершения, когда шаг установлен в состояние ЗАВЕРШЕНО. В некоторых случаях уместно установить это значение отдельно: например, если шаг создан, но операция, которую он представляет, ставится в очередь на несколько минут перед выполнением, было бы целесообразно не включать время, проведенное в очереди, в его runDuration.

PRECONDITION_FAILED будет возвращен, если вы попытаетесь установить runDuration для шага, для которого это поле уже установлено.

  • В ответ: присутствует, если было установлено ранее; всегда присутствует на шаге COMPLETE
  • В запросе на создание: необязательно
  • В запросе на обновление: необязательно
deviceUsageDuration

object ( Duration )

Сколько ресурсов устройства используется для выполнения теста.

Это использование устройства, используемое для выставления счетов, которое отличается от runDuration, например, при сбое инфраструктуры не будет взиматься плата за использование устройства.

PRECONDITION_FAILED будет возвращен, если вы попытаетесь установить device_usage на шаге, для которого это поле уже установлено.

  • В ответ: присутствует, если было установлено ранее.
  • В запросе на создание: необязательно
  • В запросе на обновление: необязательно
multiStep

object ( MultiStep )

Подробности, когда несколько шагов выполняются с той же конфигурацией, что и группа. Эти данные можно использовать для определения того, к какой группе относится этот шаг. Он также определяет «первичный шаг» группы, который индексирует всех членов группы.

  • В ответ: присутствует, если было установлено ранее.
  • В запросе на создание: необязательно, установите, если этот шаг был выполнен более одного раза.
  • В запросе на обновление: необязательно

step поля Союза.

step может быть только одним из следующих:

testExecutionStep

object ( TestExecutionStep )

Выполнение тестового запуска.

toolExecutionStep

object ( ToolExecutionStep )

Запуск инструмента (используется для шагов, которые мы явно не поддерживаем).

Шаг выполнения теста

Шаг, представляющий выполнение тестов.

Он принимает XML-файлы ant-junit, которые будут преобразованы службой в структурированные результаты тестирования. Пути к файлам XML обновляются для добавления дополнительных файлов, однако их нельзя удалить.

Пользователи также могут добавлять результаты тестов вручную, используя поле test_result.

JSON-представление
{
  "testSuiteOverviews": [
    {
      object (TestSuiteOverview)
    }
  ],
  "toolExecution": {
    object (ToolExecution)
  },
  "testIssues": [
    {
      object (TestIssue)
    }
  ],
  "testTiming": {
    object (TestTiming)
  }
}
Поля
testSuiteOverviews[]

object ( TestSuiteOverview )

Список содержимого обзора набора тестов. Это может быть проанализировано сервером из журнала xUnit XML или загружено непосредственно пользователем. Эти ссылки следует вызывать только тогда, когда наборы тестов полностью проанализированы или загружены.

Максимально допустимое количество обзоров наборов тестов на шаг — 1000.

  • В ответ: всегда устанавливаю
  • В запросе на создание: необязательно
  • В запросе на обновление: никогда (вместо этого используйте собственный методPublishXunitXmlFiles)
toolExecution

object ( ToolExecution )

Представляет выполнение средства запуска тестов.

Код завершения этого инструмента будет использоваться для определения того, пройден ли тест.

  • В ответ: всегда устанавливаю
  • В запросе на создание/обновление: необязательно.
testIssues[]

object ( TestIssue )

Проблемы, обнаруженные во время выполнения теста.

Например, если тестируемое мобильное приложение вышло из строя во время теста, здесь можно записать сообщение об ошибке и содержимое трассировки стека, чтобы облегчить отладку.

  • В ответ: присутствует, если установлено при создании или обновлении.
  • В запросе на создание/обновление: необязательно.
testTiming

object ( TestTiming )

Распределение времени выполнения теста.

  • В ответ: присутствует, если установлено при создании или обновлении.
  • В запросе на создание/обновление: необязательно.

ИнструментВыполнение

Исполнение произвольного инструмента. Это может быть программа запуска тестов или инструмент, копирующий артефакты или развертывающий код.

JSON-представление
{
  "commandLineArguments": [
    string
  ],
  "toolLogs": [
    {
      object (FileReference)
    }
  ],
  "exitCode": {
    object (ToolExitCode)
  },
  "toolOutputs": [
    {
      object (ToolOutputReference)
    }
  ]
}
Поля
commandLineArguments[]

string

Полная токенизированная командная строка, включая имя программы (эквивалент argv в программе C).

  • В ответ: присутствует, если установлено запросом на создание.
  • В запросе на создание: необязательно
  • В запросе на обновление: никогда не устанавливать
toolLogs[]

object ( FileReference )

Ссылки на любые текстовые журналы отображают выполнение инструмента.

Это поле можно задать до выхода из инструмента, чтобы иметь доступ к просмотру журналов в реальном времени во время работы инструмента.

Максимально допустимое количество журналов инструментов на шаг — 1000.

  • В ответ: присутствует, если установлено запросом на создание/обновление.
  • В запросе на создание: необязательно
  • В запросе на обновление: необязательно, любое предоставленное значение будет добавлено к существующему списку.
exitCode

object ( ToolExitCode )

Код завершения выполнения инструмента. Это поле будет установлено после выхода из инструмента.

  • В ответ: присутствует, если установлено запросом на создание/обновление.
  • В запросе на создание: необязательно
  • В запросе на обновление: необязательно, будет возвращена ошибка FAILED_PRECONDITION, если код выхода уже установлен.
toolOutputs[]

object ( ToolOutputReference )

Ссылки на непрозрачные файлы любого формата, выдаваемые при выполнении инструмента.

Максимально допустимое количество выходов инструмента за шаг — 1000.

  • В ответ: присутствует, если установлено запросом на создание/обновление.
  • В запросе на создание: необязательно
  • В запросе на обновление: необязательно, любое предоставленное значение будет добавлено к существующему списку.

ToolExitCode

Код выхода из выполнения инструмента.

JSON-представление
{
  "number": integer
}
Поля
number

integer

Код завершения выполнения инструмента. Значение 0 означает, что выполнение прошло успешно.

  • В ответ: всегда устанавливаю
  • В запросе на создание/обновление: всегда устанавливается

TestIssue

Обнаружена проблема, возникающая во время выполнения теста.

JSON-представление
{
  "errorMessage": string,
  "stackTrace": {
    object (StackTrace)
  },
  "warning": {
    object (Any)
  },
  "severity": enum (Severity),
  "type": enum (Type),
  "category": enum (Category)
}
Поля
errorMessage

string

Краткое, понятное человеку сообщение с описанием проблемы. Необходимый.

stackTrace
(deprecated)

object ( StackTrace )

Устарело в пользу полей трассировки стека внутри определенных предупреждений.

warning

object ( Any )

Предупреждающее сообщение с дополнительной информацией о проблеме. Всегда должно быть сообщение от com.google.devtools.toolresults.v1.warnings.

severity

enum ( Severity )

Серьезность проблемы. Необходимый.

type

enum ( Type )

Тип проблемы. Необходимый.

category

enum ( Category )

Категория вопроса. Необходимый.

Любой

Any содержит произвольное сериализованное сообщение буфера протокола вместе с URL-адресом, описывающим тип сериализованного сообщения.

Библиотека Protobuf обеспечивает поддержку упаковки/распаковки любых значений в виде служебных функций или дополнительных сгенерированных методов типа Any.

Пример 1. Упаковка и распаковка сообщения на C++.

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

Пример 2. Упаковка и распаковка сообщения на Java.

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

Пример 3. Упаковка и распаковка сообщения в Python.

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

Пример 4. Упаковка и распаковка сообщения в Go

 foo := &pb.Foo{...}
 any, err := ptypes.MarshalAny(foo)
 ...
 foo := &pb.Foo{}
 if err := ptypes.UnmarshalAny(any, foo); err != nil {
   ...
 }

Методы упаковки, предоставляемые библиотекой protobuf, по умолчанию будут использовать type.googleapis.com/full.type.name в качестве URL-адреса типа, а методы распаковки используют только полное имя типа после последнего символа «/» в URL-адресе типа. например, "foo.bar.com/x/yz" даст имя типа "yz".

JSON

Представление значения Any в формате JSON использует обычное представление десериализованного внедренного сообщения с дополнительным полем @type , которое содержит URL-адрес типа. Пример:

package google.profile;
message Person {
  string first_name = 1;
  string last_name = 2;
}

{
  "@type": "type.googleapis.com/google.profile.Person",
  "firstName": <string>,
  "lastName": <string>
}

Если тип встроенного сообщения хорошо известен и имеет пользовательское представление JSON, это представление будет внедрено с добавлением value поля, которое содержит пользовательский JSON в дополнение к полю @type . Пример (для сообщения google.protobuf.Duration ):

{
  "@type": "type.googleapis.com/google.protobuf.Duration",
  "value": "1.212s"
}
JSON-представление
{
  "typeUrl": string,
  "value": string
}
Поля
typeUrl

string

URL-адрес/имя ресурса, которое однозначно идентифицирует тип сериализованного сообщения буфера протокола. Эта строка должна содержать хотя бы один символ «/». Последний сегмент пути URL-адреса должен представлять полное имя типа (как в path/google.protobuf.Duration ). Имя должно быть в канонической форме (например, «.» в начале не допускается).

На практике команды обычно предварительно компилируют в двоичный файл все типы, которые, по их ожиданиям, будут использоваться в контексте Any. Однако для URL-адресов, использующих схему http , https или отсутствие схемы, можно дополнительно настроить сервер типов, который сопоставляет URL-адреса типов с определениями сообщений следующим образом:

  • Если схема не указана, предполагается https .
  • HTTP GET для URL-адреса должен возвращать значение google.protobuf.Type в двоичном формате или выдавать ошибку.
  • Приложениям разрешено кэшировать результаты поиска на основе URL-адреса или предварительно скомпилировать их в двоичный файл, чтобы избежать какого-либо поиска. Следовательно, при изменении типов необходимо сохранять двоичную совместимость. (Используйте имена версионных типов для управления критическими изменениями.)

Примечание. Эта функция в настоящее время недоступна в официальной версии protobuf и не используется для URL-адресов типов, начинающихся с type.googleapis.com.

Схемы, отличные от http , https (или пустой схемы), могут использоваться с семантикой, специфичной для реализации.

value

string ( bytes format)

Должен быть допустимым сериализованным буфером протокола указанного выше типа.

Строка в кодировке Base64.

Строгость

Серьезность проблем.

Перечисления
unspecifiedSeverity Серьезность по умолчанию не указана. Не использовать. Только для версий.
info Некритическая проблема, предоставляющая пользователям некоторую информацию о тестовом запуске.
suggestion Некритическая проблема, предоставляющая пользователям некоторые подсказки по улучшению опыта тестирования, например, предложение использовать игровые циклы.
warning Потенциально критическая проблема.
severe Критическая ошибка.

Тип

Типы проблем.

Перечисления
unspecifiedType Неопределенный тип по умолчанию. Не использовать. Только для версий.
fatalException Проблема является фатальным исключением.
nativeCrash Проблема - родной сбой.
anr Проблема заключается в сбое ANR.
unusedRoboDirective Проблема — неиспользуемая директива робота.
compatibleWithOrchestrator Проблема заключается в предложении использовать оркестратор.
launcherActivityNotFound Проблема с поиском активности лаунчера
startActivityNotFound Проблема с разрешением предоставленного пользователем намерения начать действие
incompleteRoboScriptExecution Робо-скрипт не был полностью выполнен.
completeRoboScriptExecution Робо-скрипт был полностью и успешно выполнен.
failedToInstall APK не удалось установить.
nonSdkApiUsageViolation Приложение получило доступ к API, отличному от SDK.
nonSdkApiUsageReport Приложение получило доступ к API, отличному от SDK (новый подробный отчет)
encounteredNonAndroidUiWidgetScreen При сканировании роботом был обнаружен как минимум один экран с элементами, не являющимися виджетами пользовательского интерфейса Android.
encounteredLoginScreen Роботизированное сканирование обнаружило как минимум один вероятный экран входа в систему.
performedGoogleLogin Робо вошел в систему через Google.
iosException Приложение iOS аварийно завершилось с исключением.
iosCrash Приложение iOS вылетало без исключения (например, убито).
performedMonkeyActions Робо-ползание включало в себя выполнение некоторых обезьяньих действий.
usedRoboDirective Робо-сканирование использовало директиву Robo.
usedRoboIgnoreDirective Роботизированное сканирование использовало директиву Robo для игнорирования элемента пользовательского интерфейса.
insufficientCoverage Робо не просканировал некоторые потенциально важные части приложения.
inAppPurchases Робо-сканирование включало некоторые покупки внутри приложения.
crashDialogError Во время выполнения теста был обнаружен диалог сбоя
uiElementsTooDeep Глубина элемента пользовательского интерфейса превышает пороговое значение
blankScreen При сканировании роботом обнаружен пустой экран
overlappingUiElements Перекрывающиеся элементы пользовательского интерфейса обнаруживаются при сканировании роботом.
unityException Обнаружено неперехваченное исключение Unity (они не приводят к сбою приложений).
deviceOutOfMemory Обнаружено, что устройству не хватает памяти
logcatCollectionError Проблемы, обнаруженные при сборе logcat
detectedAppSplashScreen Robo обнаружил заставку, предоставленную приложением (в отличие от заставки ОС Android).

Категория

Категории проблем.

Перечисления
unspecifiedCategory Неопределенная категория по умолчанию. Не использовать. Только для версий.
common Проблема не относится к конкретному типу теста (например, к собственному сбою).
robo Проблема специфична для роботизированного запуска.

Тестирование времени

Время тестирования разбивается на этапы.

JSON-представление
{
  "testProcessDuration": {
    object (Duration)
  }
}
Поля
testProcessDuration

object ( Duration )

Сколько времени потребовалось для запуска процесса тестирования.

  • В ответ: присутствует, если было установлено ранее.
  • В запросе на создание/обновление: необязательно.

Шаг выполнения инструмента

Общий шаг инструмента, который будет использоваться для двоичных файлов, которые мы явно не поддерживаем. Например: запуск cp для копирования артефактов из одного места в другое.

JSON-представление
{
  "toolExecution": {
    object (ToolExecution)
  }
}
Поля
toolExecution

object ( ToolExecution )

Инструментальное исполнение.

  • В ответ: присутствует, если установлено запросом на создание/обновление.
  • В запросе на создание/обновление: необязательно.

Многошаговый

Подробности, когда несколько шагов выполняются с той же конфигурацией, что и группа.

JSON-представление
{
  "primaryStepId": string,
  "multistepNumber": integer,
  "primaryStep": {
    object (PrimaryStep)
  }
}
Поля
primaryStepId

string

Идентификатор основного (исходного) шага, который может быть этим шагом.

multistepNumber

integer

Уникальный int, присвоенный каждому шагу. Диапазон значений от 0 (включительно) до общего количества шагов (не включая). Первый шаг — 0.

primaryStep

object ( PrimaryStep )

Присутствует, если это основной (исходный) шаг.

ПервичныйШаг

Сохраняет статус сводного теста нескольких шагов, которые выполнялись как группа, и результат каждого отдельного шага.

JSON-представление
{
  "rollUp": enum (OutcomeSummary),
  "individualOutcome": [
    {
      object (IndividualOutcome)
    }
  ]
}
Поля
rollUp

enum ( OutcomeSummary )

Статус сводного теста нескольких шагов, которые выполнялись с той же конфигурацией, что и группа.

individualOutcome[]

object ( IndividualOutcome )

Идентификатор шага и результат каждого отдельного шага.

Индивидуальный результат

Идентификатор шага и результат каждого отдельного шага, который выполнялся как группа с другими шагами с той же конфигурацией.

JSON-представление
{
  "stepId": string,
  "outcomeSummary": enum (OutcomeSummary),
  "multistepNumber": integer,
  "runDuration": {
    object (Duration)
  }
}
Поля
stepId

string

outcomeSummary

enum ( OutcomeSummary )

multistepNumber

integer

Уникальный int, присвоенный каждому шагу. Диапазон значений от 0 (включительно) до общего количества шагов (не включая). Первый шаг — 0.

runDuration

object ( Duration )

Сколько времени потребовалось для выполнения этого шага.

Методы

accessibilityClusters

Перечисляет кластеры доступности для данного шага.

Может возвращать любой из следующих канонических кодов ошибок:

  • PERMISSION_DENIED - если пользователь не авторизован для чтения проекта
  • INVALID_ARGUMENT — если запрос имеет неверный формат
  • FAILED_PRECONDITION — если аргумент в запросе оказался недействительным; например

create

Создает шаг.

get

Получает шаг.

getPerfMetricsSummary

Получает PerfMetricsSummary.

list

Перечисляет шаги для данного выполнения.

patch

Обновляет существующий шаг с помощью предоставленного частичного объекта.

publishXunitXmlFiles

Опубликуйте XML-файлы в существующем шаге.