- Ресурс: Шаг
- Шаг выполнения теста
- ИнструментВыполнение
- ToolExitCode
- TestIssue
- Любой
- Серьезность
- Тип
- Категория
- Тестирование времени
- Шаг выполнения инструмента
- Многошаговый
- ПервичныйШаг
- Индивидуальный результат
- Методы
Ресурс: Шаг
Шаг представляет собой одну операцию, выполняемую как часть выполнения. Шаг может использоваться для представления выполнения инструмента (например, выполнение средства запуска тестов или выполнение компилятора).
Шаги могут перекрываться (например, два шага могут иметь одинаковое время начала, если некоторые операции выполняются параллельно).
Вот пример: давайте предположим, что у нас непрерывная сборка, на каждой итерации выполняется тест-раннер. Рабочий процесс будет выглядеть следующим образом: - пользователь создает выполнение с идентификатором 1 - пользователь создает TestExecutionStep с идентификатором 100 для выполнения 1 - пользователь обновляет TestExecutionStep с идентификатором 100, чтобы добавить необработанный журнал XML + служба анализирует журналы XML и возвращает TestExecutionStep с обновлены результаты теста. - пользователь обновляет статус TestExecutionStep с идентификатором 100 до COMPLETE.
Шаг можно обновлять до тех пор, пока его состояние не станет ЗАВЕРШЕНО, после чего он станет неизменяемым.
JSON-представление |
---|
{ "stepId": string, "creationTime": { object ( |
Поля | |
---|---|
stepId | Уникальный идентификатор внутри выполнения для этого шага. Возвращает INVALID_ARGUMENT, если это поле установлено или перезаписано вызывающей стороной.
|
creationTime | Время создания шага.
|
completionTime | Время, когда статус шага был установлен как завершенный. Это значение будет установлено автоматически при переходе состояния в ЗАВЕРШЕНО.
|
name | Короткое удобочитаемое имя для отображения в пользовательском интерфейсе. Максимум 100 символов. Например: Чистая сборка PRECONDITION_FAILED будет возвращен при создании нового шага, если его имя и размерность совпадают с существующим шагом. Если два шага представляют собой похожее действие, но имеют разные значения измерения, они должны иметь одно и то же имя. Например, если один и тот же набор тестов выполняется на двух разных платформах, два шага должны иметь одно и то же имя.
|
description | Описание этого инструмента. Например: mvn clean package -DskipTests=true.
|
state | Исходное состояние — IN_PROGRESS. Единственные допустимые переходы состояний: * IN_PROGRESS -> COMPLETE. PRECONDITION_FAILED будет возвращен, если запрошен недопустимый переход. Допустимо создание шага с состоянием COMPLETE. Состояние может быть установлено в COMPLETE только один раз. PRECONDITION_FAILED будет возвращен, если состояние установлено на COMPLETE несколько раз.
|
outcome | Классификация результата, например, УСПЕХ или НЕУДАЧА.
|
hasImages | Являются ли какие-либо выходные данные этого шага изображениями, миниатюры которых можно получить с помощью Thumbnails.list.
|
labels | Произвольные пары ключ/значение, предоставленные пользователем, связанные с шагом. Пользователи несут ответственность за управление пространством имен ключей, чтобы ключи случайно не конфликтовали. INVALID_ARGUMENT будет возвращен, если количество меток превышает 100 или если длина любого из ключей или значений превышает 100 символов.
Объект, содержащий список пар |
dimensionValue | Если выполнение, содержащее этот шаг, имеет какой-либо набор Dimension_definition, то это поле позволяет дочернему элементу указывать значения измерений. Ключи должны точно соответствовать измерению_определения выполнения. Например, если выполнение имеет Если шаг не участвует в одном измерении матрицы, значением этого измерения должна быть пустая строка. Например, если один из тестов выполняется бегуном, который не поддерживает повторные попытки, шаг может иметь Если шаг не участвует ни в одном измерении матрицы, то параметр DimensionValue может остаться неустановленным. PRECONDITION_FAILED будет возвращен, если какой-либо из ключей не существует в измерении_определения выполнения. PRECONDITION_FAILED будет возвращен, если другой шаг в этом выполнении уже имеет то же имя и значение измерения, но отличается в других полях данных, например, поле шага отличается. PRECONDITION_FAILED будет возвращено, если установлено измерение ValueValue и при выполнении имеется измерение_определение, которое не указано в качестве одного из ключей.
Объект, содержащий список пар |
runDuration | Сколько времени потребовалось для выполнения этого шага. Если этот параметр не установлен, устанавливается разница между временем создания и временем завершения, когда шаг установлен в состояние ЗАВЕРШЕНО. В некоторых случаях уместно установить это значение отдельно: например, если шаг создан, но операция, которую он представляет, ставится в очередь на несколько минут перед выполнением, было бы целесообразно не включать время, проведенное в очереди, в его runDuration. PRECONDITION_FAILED будет возвращен, если вы попытаетесь установить runDuration для шага, для которого это поле уже установлено.
|
deviceUsageDuration | Сколько ресурсов устройства используется для выполнения теста. Это использование устройства, используемое для выставления счетов, которое отличается от runDuration, например, при сбое инфраструктуры плата за использование устройства не взимается. PRECONDITION_FAILED будет возвращен, если вы попытаетесь установить device_usage на шаге, для которого это поле уже установлено.
|
multiStep | Подробности, когда несколько шагов выполняются с той же конфигурацией, что и группа. Эти данные можно использовать для определения того, к какой группе относится этот шаг. Он также определяет «первичный шаг» группы, который индексирует всех членов группы.
|
| |
testExecutionStep | Выполнение тестового запуска. |
toolExecutionStep | Запуск инструмента (используется для шагов, которые мы явно не поддерживаем). |
Шаг выполнения теста
Шаг, представляющий выполнение тестов.
Он принимает XML-файлы ant-junit, которые будут преобразованы службой в структурированные результаты тестирования. Пути к файлам XML обновляются для добавления дополнительных файлов, однако их нельзя удалить.
Пользователи также могут добавлять результаты тестов вручную, используя поле test_result.
JSON-представление |
---|
{ "testSuiteOverviews": [ { object ( |
Поля | |
---|---|
testSuiteOverviews[] | Список содержимого обзора набора тестов. Это может быть проанализировано сервером из журнала xUnit XML или загружено непосредственно пользователем. Эти ссылки следует вызывать только тогда, когда наборы тестов полностью проанализированы или загружены. Максимально допустимое количество обзоров наборов тестов на шаг — 1000.
|
toolExecution | Представляет выполнение средства запуска тестов. Код завершения этого инструмента будет использоваться для определения того, пройден ли тест.
|
testIssues[] | Проблемы, обнаруженные во время выполнения теста. Например, если тестируемое мобильное приложение вышло из строя во время теста, здесь можно записать сообщение об ошибке и содержимое трассировки стека, чтобы облегчить отладку.
|
testTiming | Распределение времени выполнения теста.
|
ИнструментВыполнение
Исполнение произвольного инструмента. Это может быть программа запуска тестов или инструмент, копирующий артефакты или развертывающий код.
JSON-представление |
---|
{ "commandLineArguments": [ string ], "toolLogs": [ { object ( |
Поля | |
---|---|
commandLineArguments[] | Полная токенизированная командная строка, включая имя программы (эквивалент argv в программе C).
|
toolLogs[] | Ссылки на любые текстовые журналы отображают выполнение инструмента. Это поле можно задать до выхода из инструмента, чтобы иметь доступ к просмотру журналов в реальном времени во время работы инструмента. Максимально допустимое количество журналов инструментов на шаг — 1000.
|
exitCode | Код завершения выполнения инструмента. Это поле будет установлено после выхода из инструмента.
|
toolOutputs[] | Ссылки на непрозрачные файлы любого формата, выдаваемые при выполнении инструмента. Максимально допустимое количество выходов инструмента за шаг — 1000.
|
ToolExitCode
Код выхода из выполнения инструмента.
JSON-представление |
---|
{ "number": integer } |
Поля | |
---|---|
number | Код завершения выполнения инструмента. Значение 0 означает, что выполнение прошло успешно.
|
TestIssue
Обнаружена проблема, возникающая во время выполнения теста.
JSON-представление |
---|
{ "errorMessage": string, "stackTrace": { object ( |
Поля | |
---|---|
errorMessage | Краткое, понятное человеку сообщение с описанием проблемы. Необходимый. |
stackTrace | Устарело в пользу полей трассировки стека внутри определенных предупреждений. |
warning | Предупреждающее сообщение с дополнительной информацией о проблеме. Всегда должно быть сообщение от com.google.devtools.toolresults.v1.warnings. |
severity | Серьезность проблемы. Необходимый. |
type | Тип проблемы. Необходимый. |
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 | URL-адрес/имя ресурса, которое однозначно идентифицирует тип сериализованного сообщения буфера протокола. Эта строка должна содержать хотя бы один символ «/». Последний сегмент пути URL-адреса должен представлять полное имя типа (как в На практике команды обычно предварительно компилируют в двоичный файл все типы, которые, по их ожиданиям, будут использоваться в контексте Any. Однако для URL-адресов, использующих схему
Примечание. Эта функция в настоящее время недоступна в официальной версии protobuf и не используется для URL-адресов типов, начинающихся с type.googleapis.com. Схемы, отличные от |
value | Должен быть допустимым сериализованным буфером протокола указанного выше типа. Строка в кодировке Base64. |
Серьезность
Серьезность проблем.
Перечисления | |
---|---|
unspecifiedSeverity | Серьезность по умолчанию не указана. Не используйте. Только для версий. |
info | Некритическая проблема, предоставляющая пользователям некоторую информацию о тестовом запуске. |
suggestion | Некритическая проблема, предоставляющая пользователям некоторые подсказки по улучшению опыта тестирования, например, предложение использовать игровые циклы. |
warning | Потенциально критическая проблема. |
severe | Критическая проблема. |
Тип
Типы проблем.
Перечисления | |
---|---|
unspecifiedType | Неопределенный тип по умолчанию. Не используйте. Только для версий. |
fatalException | Проблема является фатальным исключением. |
nativeCrash | Проблема - родной сбой. |
anr | Проблема заключается в сбое ANR. |
unusedRoboDirective | Проблема — неиспользуемая директива робота. |
compatibleWithOrchestrator | Проблема заключается в предложении использовать оркестратор. |
launcherActivityNotFound | Проблема с поиском активности лаунчера |
startActivityNotFound | Проблема с разрешением предоставленного пользователем намерения начать действие |
incompleteRoboScriptExecution | Робо-скрипт не был полностью выполнен. |
completeRoboScriptExecution | Робо-скрипт был полностью и успешно выполнен. |
failedToInstall | APK не удалось установить. |
availableDeepLinks | Тестируемое приложение имеет глубокие ссылки, но Robo их не предоставило. |
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). |
assetIssue | В этом тесте возникла проблема с ресурсами. |
Категория
Категории проблем.
Перечисления | |
---|---|
unspecifiedCategory | Неопределенная категория по умолчанию. Не используйте. Только для версий. |
common | Проблема не относится к конкретному типу теста (например, к собственному сбою). |
robo | Проблема специфична для роботизированного запуска. |
Тестирование времени
Время тестирования разбивается на этапы.
JSON-представление |
---|
{
"testProcessDuration": {
object ( |
Поля | |
---|---|
testProcessDuration | Сколько времени потребовалось для запуска процесса тестирования.
|
Шаг выполнения инструмента
Общий шаг инструмента, который будет использоваться для двоичных файлов, которые мы явно не поддерживаем. Например: запуск cp для копирования артефактов из одного места в другое.
JSON-представление |
---|
{
"toolExecution": {
object ( |
Поля | |
---|---|
toolExecution | Инструментальное исполнение.
|
Многошаговый
Подробности, когда несколько шагов выполняются с той же конфигурацией, что и группа.
JSON-представление |
---|
{
"primaryStepId": string,
"multistepNumber": integer,
"primaryStep": {
object ( |
Поля | |
---|---|
primaryStepId | Идентификатор основного (исходного) шага, который может быть этим шагом. |
multistepNumber | Уникальный int, присвоенный каждому шагу. Диапазон значений от 0 (включительно) до общего количества шагов (не включая). Первый шаг – 0. |
primaryStep | Присутствует, если это основной (исходный) шаг. |
ПервичныйШаг
Сохраняет статус сводного теста нескольких шагов, которые выполнялись как группа, и результат каждого отдельного шага.
JSON-представление |
---|
{ "rollUp": enum ( |
Поля | |
---|---|
rollUp | Статус сводного теста нескольких шагов, которые выполнялись с той же конфигурацией, что и группа. |
individualOutcome[] | Идентификатор шага и результат каждого отдельного шага. |
Индивидуальный результат
Идентификатор шага и результат каждого отдельного шага, который выполнялся как группа с другими шагами с той же конфигурацией.
JSON-представление |
---|
{ "stepId": string, "outcomeSummary": enum ( |
Поля | |
---|---|
stepId | |
outcomeSummary | |
multistepNumber | Уникальный int, присвоенный каждому шагу. Диапазон значений от 0 (включительно) до общего количества шагов (не включая). Первый шаг – 0. |
runDuration | Сколько времени потребовалось для выполнения этого шага. |
Методы | |
---|---|
| Перечисляет кластеры доступности для данного шага. Может возвращать любой из следующих канонических кодов ошибок:
|
| Создает шаг. |
| Получает шаг. |
| Получает PerfMetricsSummary. |
| Перечисляет шаги для данного выполнения. |
| Обновляет существующий шаг с помощью предоставленного частичного объекта. |
| Опубликуйте XML-файлы в существующем шаге. |