REST Resource: projects.histories.executions.steps

资源:步骤

Step 表示作为 Execution 的一部分执行的单个操作。步骤可以用来表示工具的执行(例如,测试运行程序的执行或编译器的执行)。

步骤可以重叠(例如,如果某些操作是并行完成的,则两个步骤的开始时间可能相同)。

举个例子,假设我们的持续构建正在为每次迭代执行测试运行程序。工作流如下所示:- 用户创建了 ID 为 1 的执行 - 用户为执行 1 创建了 ID 为 100 的 TestExecutionStep - 用户更新 ID 为 100 的 TestExecutionStep 以添加原始 XML 日志 + 服务解析 xml 日志并返回带有更新的 TestResult 的 TestExecutionStep。- 用户将 ID 为 100 的 TestExecutionStep 的状态更新为“COMPLETE”

可以更新步骤,直到状态设置为 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。

  • 回复:Always set
  • 创建/更新请求中:永不设置
creationTime

object (Timestamp)

步骤的创建时间。

  • 回复:Always set
  • 创建/更新请求中:永不设置
completionTime

object (Timestamp)

步骤状态设为完成的时间。

当状态转换为 COMPLETE 时,系统会自动设置此值。

  • 响应时:在执行状态为 COMPLETE 时设置。
  • 创建/更新请求中:永不设置
name

string

显示在界面中的直观易懂的简短名称。最多 100 个字符。例如:干净 build

创建新步骤时,如果与现有步骤共享其名称和 dimensionValue,系统将返回 PRECONDITION_FAILED。如果两个步骤表示类似的操作,但具有不同的维度值,则它们的名称应相同。例如,如果在两个不同的平台上运行同一组测试,则两个步骤应具有相同的名称。

  • 回复:Always set
  • 在创建请求中:始终设置
  • 在更新请求中:从未设置
description

string

此工具的说明,例如:mvn clean package -DskipTests=true

  • 响应:如果通过创建/更新请求设置,则存在
  • 在创建/更新请求中:可选
state

enum (State)

初始状态为 IN_PROGRESS。仅有的合法状态转换为 * IN_PROGRESS ->完成

如果请求无效转换,则返回 PRECONDITION_FAILED。

可以创建状态设置为 COMPLETE 的步骤。状态只能设置为 COMPLETE 一次。如果多次将状态设置为 COMPLETE,则返回 PRECONDITION_FAILED。

  • 回复:Always set
  • 在创建/更新请求中:可选
outcome

object (Outcome)

结果的分类,例如划分为“SUCCESS”或“FAILURE”

  • 响应:如果通过创建/更新请求设置,则存在
  • 在创建/更新请求中:可选
hasImages

boolean

此步骤的任何输出是否是可通过 metadata.list 提取缩略图的图片。

  • 回复:Always set
  • 创建/更新请求中:永不设置
labels

map (key: string, value: string)

用户提供的与步骤关联的任意键值对。

用户负责管理密钥命名空间,以防密钥发生意外冲突。

如果标签数超过 100,或者任何键或值的长度超过 100 个字符,则返回 INVALID_ARGUMENT。

  • 回复:Always set
  • 在创建请求中:可选
  • 在更新请求中:可选;任何新键值对都将添加到映射中,并且现有键的任何新值都会更新该键的值

包含一系列 "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']

如果该步骤不参与矩阵的任何维度,则可能无法设置 DimensionsValue。

如果执行的维度定义中不存在任何键,则返回 PRECONDITION_FAILED。

如果此执行中的另一步骤已具有相同的名称和维度值,但其他数据字段有所不同(例如步骤字段不同),则系统将返回 PRECONDITION_FAILED。

如果已设置 dimensionValue,并且执行中有任何未指定为键之一的 dimension_definition,则会返回 PRECONDITION_FAILED。

  • 响应:如果由 create 设置,则存在
  • 在创建请求中:可选
  • 在更新请求中:从未设置

包含一系列 "key": value 对的对象。示例:{ "name": "wrench", "mass": "1.3kg", "count": "3" }

runDuration

object (Duration)

此步骤运行所需的时间。

如果未设置,则设为当步骤设为 COMPLETE 状态时 createdTime 和 completionTime 之间的差值。在某些情况下,可以单独设置该值:例如,如果步骤已创建,但其代表的操作在执行前排队等候了几分钟,则不宜将排队时间加入其 runDuration 中。

如果尝试对已设置此字段的步骤设置 runDuration,将返回 PRECONDITION_FAILED。

  • 响应:如果之前已设置,则为存在;在 COMPLETE 步骤中始终显示
  • 在创建请求中:可选
  • 在更新请求中:可选
deviceUsageDuration

object (Duration)

使用多少设备资源执行测试。

这是用于结算的设备用量,与 runDuration 不同,例如,对于基础架构故障,您无需为设备用量付费。

如果尝试在已设置此字段的步骤中设置 device_usage,系统将返回 PRECONDITION_FAILED。

  • 响应:如果之前已设置,则为存在。
  • 在创建请求中:可选
  • 在更新请求中:可选
multiStep

object (MultiStep)

详细说明使用一组相同的配置运行多个步骤的情况。这些详细信息可用于确定此步骤所属的群组。它还标识了组“主要步骤”以便将所有群组成员编入索引

  • 响应:如果之前已设置,则为存在。
  • 在创建请求中:可选,且仅当此步骤执行了多次时才设置。
  • 在更新请求中:可选

联合字段 step

step 只能是下列其中一项:

testExecutionStep

object (TestExecutionStep)

测试运行程序的执行。

toolExecutionStep

object (ToolExecutionStep)

工具的执行(用于我们未明确支持的步骤)。

TestExecutionStep

表示运行测试的步骤。

它接受 ant-junit xml 文件,这些文件将由服务解析为结构化测试结果。为了附加更多文件,系统会更新 XML 文件路径,但无法删除这些路径。

用户还可以使用 test_result 字段手动添加测试结果。

JSON 表示法
{
  "testSuiteOverviews": [
    {
      object (TestSuiteOverview)
    }
  ],
  "toolExecution": {
    object (ToolExecution)
  },
  "testIssues": [
    {
      object (TestIssue)
    }
  ],
  "testTiming": {
    object (TestTiming)
  }
}
字段
testSuiteOverviews[]

object (TestSuiteOverview)

测试套件概览内容列表。这可以通过服务器从 xUnit XML 日志中解析,也可以由用户直接上传。只有在测试套件完全解析或上传后,才能调用此引用。

每个步骤允许的最大测试套件概览数为 1,000。

  • 回复:Always set
  • 在创建请求中:可选
  • 在更新请求中:never(请改用 publishXunitXmlFiles 自定义方法)
toolExecution

object (ToolExecution)

表示测试运行程序的执行。

此工具的退出代码将用于确定测试是否通过。

  • 回复:Always set
  • 在创建/更新请求中:可选
testIssues[]

object (TestIssue)

测试执行期间发现的问题。

例如,如果被测移动应用在测试期间崩溃,系统会在此处记录错误消息和堆栈轨迹内容,以帮助进行调试。

  • 响应:如果通过 create 或 update 进行设置,则存在
  • 在创建/更新请求中:可选
testTiming

object (TestTiming)

测试作业的时间细分。

  • 响应:如果通过 create 或 update 进行设置,则存在
  • 在创建/更新请求中:可选

ToolExecution

执行任意工具。它可能是测试运行程序或复制工件或部署代码的工具。

JSON 表示法
{
  "commandLineArguments": [
    string
  ],
  "toolLogs": [
    {
      object (FileReference)
    }
  ],
  "exitCode": {
    object (ToolExitCode)
  },
  "toolOutputs": [
    {
      object (ToolOutputReference)
    }
  ]
}
字段
commandLineArguments[]

string

包含程序名称的完整令牌化命令行(相当于 C 程序中的 argv)。

  • 响应:如果由创建请求设置,则存在
  • 在创建请求中:可选
  • 在更新请求中:从未设置
toolLogs[]

object (FileReference)

对任何纯文本日志的引用会输出工具执行的内容。

您可以在工具退出之前设置此字段,以便在工具运行时访问日志的实时视图。

每个步骤允许的最大工具日志数为 1000。

  • 响应:如果通过创建/更新请求设置,则存在
  • 在创建请求中:可选
  • 在更新请求中:可选,提供的任何值都将附加到现有列表
exitCode

object (ToolExitCode)

工具执行退出代码。此字段将在工具退出后设置。

  • 响应:如果通过创建/更新请求设置,则存在
  • 在创建请求中:可选
  • 在更新请求中:可选。如果已设置 exitCode,则会返回 FAILED_PRECONDITION 错误。
toolOutputs[]

object (ToolOutputReference)

对工具执行输出的任何格式的不透明文件的引用。

每个步骤允许的最大工具输出数为 1000。

  • 响应:如果通过创建/更新请求设置,则存在
  • 在创建请求中:可选
  • 在更新请求中:可选,提供的任何值都将附加到现有列表

工具退出代码

从工具执行中退出代码。

JSON 表示法
{
  "number": integer
}
字段
number

integer

工具执行退出代码。值 0 表示执行成功。

  • 回复:Always set
  • 在创建/更新请求中:始终设置

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 包含任意序列化协议缓冲区消息,以及一个描述序列化消息类型的网址。

Protobuf 库支持以实用函数或其他生成的任何类型方法的形式打包/解压缩任何值。

示例 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”作为类型网址,而解压缩方法仅使用最后一个“/”后面的完全限定类型名称例如“foo.bar.com/x/y.z”将生成的类型名称为“y.z”。

JSON

Any 值的 JSON 表示法使用反序列化嵌入式消息的常规表示法,并带有一个包含网址类型的额外字段 @type。示例:

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,除了 @type 字段之外,该字段还包含自定义 JSON。示例(对于消息 google.protobuf.Duration):

{
  "@type": "type.googleapis.com/google.protobuf.Duration",
  "value": "1.212s"
}
JSON 表示法
{
  "typeUrl": string,
  "value": string
}
字段
typeUrl

string

唯一标识序列化协议缓冲区消息类型的网址/资源名称。此字符串必须包含至少一个“/”字符。网址路径的最后一部分必须表示相应类型的完全限定名称(如 path/google.protobuf.Duration 中所示)。名称应采用规范形式(例如,不接受前导“.”)。

在实践中,团队通常会将预期在“Any”上下文中使用的所有类型预编译到二进制文件中。不过,对于使用 httphttps 或不使用架构的网址,您可以选择设置一个类型服务器,将类型网址映射到消息定义,如下所示:

  • 如果未提供 scheme,则假定为 https
  • 网址的 HTTP GET 必须生成二进制格式的 google.protobuf.Type 值,或者会产生错误。
  • 应用可以基于网址缓存查询结果,或者将其预编译为二进制文件以避免任何查找。因此,在对类型进行更改时需要保持二进制文件兼容性。(使用带版本号的类型名称来管理重大更改。)

注意:官方 protobuf 版本中目前尚未提供此功能,此功能不用于以 type.googleapis.com 开头的类型网址。

httphttps(或空架构)以外的架构可以与实现特定的语义搭配使用。

value

string (bytes format)

必须是上述指定类型的有效序列化协议缓冲区。

使用 base64 编码的字符串。

严重程度

问题的严重程度。

枚举
unspecifiedSeverity 默认的未指定严重性。请勿使用。仅用于版本控制。
info 非严重问题,向用户提供有关测试运行的一些信息。
suggestion 非严重问题,向用户提供一些有关如何改进测试体验的提示,例如建议使用游戏循环。
warning 问题可能很严重。
severe 严重问题。

类型

问题类型。

枚举
unspecifiedType 默认的未指定类型。请勿使用。仅用于版本控制。
fatalException 问题属于严重异常。
nativeCrash 问题是原生代码崩溃。
anr 问题是 ANR 崩溃。
unusedRoboDirective 问题是未使用的 robo 指令。
compatibleWithOrchestrator 问题是建议使用 Orchestrator。
launcherActivityNotFound 查找启动器 activity 时出现问题
startActivityNotFound 解析用户提供的用于启动 activity 的 intent 时出现问题
incompleteRoboScriptExecution Robo 脚本未完全执行。
completeRoboScriptExecution Robo 脚本已完全成功执行。
failedToInstall APK 安装失败。
nonSdkApiUsageViolation 应用访问了非 SDK API。
nonSdkApiUsageReport 应用访问了非 SDK API(新的详细报告)
encounteredNonAndroidUiWidgetScreen Robo 爬虫遇到了至少一个屏幕包含非 Android 界面 widget 的元素。
encounteredLoginScreen Robo 爬虫遇到了至少一个疑似登录屏幕。
performedGoogleLogin Robo 已使用 Google 账号登录。
iosException iOS 应用崩溃并出现异常。
iosCrash iOS 应用崩溃,无异常(例如已终止)。
performedMonkeyActions Robo 抓取涉及执行一些 Monkey 操作。
usedRoboDirective Robo 抓取使用了 Robo 指令。
usedRoboIgnoreDirective Robo 抓取使用 Robo 指令忽略了界面元素。
insufficientCoverage Robo 未抓取该应用的某些可能很重要的部分。
inAppPurchases Robo 抓取涉及一些应用内购买。
crashDialogError 在测试执行期间检测到崩溃对话框
uiElementsTooDeep 界面元素深度大于阈值
blankScreen 在 Robo 抓取过程中发现空白屏幕
overlappingUiElements 在 Robo 抓取中找到重叠的界面元素
unityException 检测到未捕获的 Unity 异常(这些不会导致应用崩溃)。
deviceOutOfMemory 检测到设备内存不足
logcatCollectionError 收集 logcat 时检测到的问题
detectedAppSplashScreen Robo 检测到应用提供的启动画面(而非 Android OS 启动画面)。
assetIssue 此测试中的素材资源存在问题。

类别

问题的类别。

枚举
unspecifiedCategory 未指定的默认类别。请勿使用。仅用于版本控制。
common 问题并非特定于特定的测试类型(例如原生代码崩溃)。
robo 只有 Robo 运行才存在此问题。

TestTiming

测试时间明细以了解各个阶段。

JSON 表示法
{
  "testProcessDuration": {
    object (Duration)
  }
}
字段
testProcessDuration

object (Duration)

运行测试过程所需的时间。

  • 响应:如果之前已设置,则为存在。
  • 在创建/更新请求中:可选

ToolExecutionStep

用于我们未明确支持的二进制文件的通用工具步骤。例如:运行 cp 以将工件从一个位置复制到另一个位置。

JSON 表示法
{
  "toolExecution": {
    object (ToolExecution)
  }
}
字段
toolExecution

object (ToolExecution)

工具执行。

  • 响应:如果通过创建/更新请求设置,则存在
  • 在创建/更新请求中:可选

多步

详细说明使用一组相同的配置运行多个步骤的情况。

JSON 表示法
{
  "primaryStepId": string,
  "multistepNumber": integer,
  "primaryStep": {
    object (PrimaryStep)
  }
}
字段
primaryStepId

string

主要(原始)步骤的步骤 ID,可能是此步骤。

multistepNumber

integer

为每个步骤指定的唯一整数。范围是 0(含 0)到总步数(不含)。主要步骤为 0。

primaryStep

object (PrimaryStep)

指明步骤是否为主要(原始)步骤。

主要步骤

存储作为一组运行的多个步骤的汇总测试状态以及每个步骤的结果。

JSON 表示法
{
  "rollUp": enum (OutcomeSummary),
  "individualOutcome": [
    {
      object (IndividualOutcome)
    }
  ]
}
字段
rollUp

enum (OutcomeSummary)

作为一组使用相同配置运行的多个步骤的汇总测试状态。

individualOutcome[]

object (IndividualOutcome)

步骤 ID 和每个步骤的结果。

个人成果

按组(与其他采用相同配置的其他步骤)一起运行的每个步骤的步骤 ID 和结果。

JSON 表示法
{
  "stepId": string,
  "outcomeSummary": enum (OutcomeSummary),
  "multistepNumber": integer,
  "runDuration": {
    object (Duration)
  }
}
字段
stepId

string

outcomeSummary

enum (OutcomeSummary)

multistepNumber

integer

为每个步骤指定的唯一整数。范围是 0(含 0)到总步数(不含)。主要步骤为 0。

runDuration

object (Duration)

此步骤运行所需的时间。

方法

accessibilityClusters

列出给定步骤的无障碍功能集群

系统可能会返回以下任一规范错误代码:

  • PERMISSION_DENIED - 如果用户无权读取项目
  • INVALID_ARGUMENT - 如果请求格式错误
  • FAILED_PRECONDITION - 如果请求中的参数无效;例如

create

创建步骤。

get

获取步骤。

getPerfMetricsSummary

检索 PerfMetricsSummary。

list

列出给定执行的步骤。

patch

使用提供的部分实体更新现有步骤。

publishXunitXmlFiles

将 xml 文件发布到现有步骤。