资源:步骤
步骤表示作为执行的一部分执行的单个操作。步骤可用于表示工具的执行(例如测试运行器执行或编译器执行)。
步骤可以重叠(例如,如果某些操作并行完成,两个步骤可能具有相同的开始时间)。
这是一个示例,让我们考虑一下我们有一个连续构建,正在为每次迭代执行一个测试运行程序。工作流程如下所示: - 用户创建 id 1 的 Execution - 用户为 Execution 1 创建 id 100 的 TestExecutionStep - 用户更新 id 100 的 TestExecutionStep 以添加原始 xml 日志 + 服务解析 xml 日志并返回 TestExecutionStep更新了测试结果。 - 用户将 id 100 的 TestExecutionStep 的状态更新为 COMPLETE
Step 可以更新,直到其状态设置为 COMPLETE,此时它变得不可变。
JSON 表示 |
---|
{ "stepId": string, "creationTime": { object ( |
领域 | |
---|---|
stepId | 此步骤的执行中的唯一标识符。 如果调用者设置或覆盖该字段,则返回 INVALID_ARGUMENT。
|
creationTime | 创建步骤的时间。
|
completionTime | 步骤状态设置为完成的时间。 当状态转换为 COMPLETE 时,将自动设置该值。
|
name | 显示在 UI 中的人类可读的简短名称。最多 100 个字符。例如:干净的构建 如果新步骤与现有步骤共享其名称和维度值,则在创建新步骤时将返回 PRECONDITION_FAILED。如果两个步骤表示相似的操作,但具有不同的维度值,则它们应共享相同的名称。例如,如果同一组测试在两个不同的平台上运行,则这两个步骤应具有相同的名称。
|
description | 该工具的说明例如:mvn clean package -DskipTests=true
|
state | 初始状态为 IN_PROGRESS。唯一合法的状态转换是 * IN_PROGRESS -> COMPLETE 如果请求无效转换,将返回 PRECONDITION_FAILED。 创建状态设置为 COMPLETE 的步骤是有效的。该状态只能设置为 COMPLETE 一次。如果多次将状态设置为 COMPLETE,则将返回 PRECONDITION_FAILED。
|
outcome | 结果分类,例如成功或失败
|
hasImages | 此步骤的任何输出是否是可以使用thumbnails.list 获取其缩略图的图像。
|
labels | 用户提供的与步骤关联的任意键/值对。 用户负责管理密钥命名空间,以便密钥不会意外冲突。 如果标签数量超过 100 或者任何键或值的长度超过 100 个字符,则将返回 INVALID_ARGUMENT。
包含 |
dimensionValue | 如果包含此步骤的执行设置了任何dimension_definition,则此字段允许子级指定维度的值。 键必须与执行的维度定义完全匹配。 例如,如果执行具有 如果步骤不参与矩阵的某一维,则该维度的值应为空字符串。例如,如果其中一项测试是由不支持重试的运行程序执行的,则该步骤可能具有 如果该步骤不参与矩阵的任何维度,则可能会保留未设置的DimensionValue。 如果执行的维度定义中不存在任何键,则将返回 PRECONDITION_FAILED。 如果本次执行中的另一个步骤已经具有相同的名称和维度值,但其他数据字段不同,例如步骤字段不同,则将返回 PRECONDITION_FAILED。 如果设置了DimensionValue,并且执行中存在未指定为键之一的dimension_definition,则将返回PRECONDITION_FAILED。
包含 |
runDuration | 这一步运行需要多长时间。 如果未设置,则当步骤设置为 COMPLETE 状态时,此值将设置为creationTime 和completionTime 之间的差值。在某些情况下,单独设置此值是合适的:例如,如果创建了一个步骤,但它所代表的操作在执行之前排队了几分钟,那么最好不要将排队所花费的时间包含在其步骤中。运行持续时间。 如果尝试在已设置此字段的步骤上设置 runDuration,则将返回 PRECONDITION_FAILED。
|
deviceUsageDuration | 执行测试使用了多少设备资源。 这是用于计费目的的设备使用情况,与 runDuration 不同,例如,基础设施故障不会对设备使用情况进行计费。 如果尝试在已设置此字段的步骤上设置 device_usage,则将返回 PRECONDITION_FAILED。
|
multiStep | 当多个步骤以相同的配置作为一个组运行时的详细信息。这些详细信息可用于识别该步骤属于哪个组。它还标识了对所有组成员进行索引的组“主要步骤”。
|
联盟田 | |
testExecutionStep | 测试运行程序的执行。 |
toolExecutionStep | 工具的执行(用于我们未明确支持的步骤)。 |
测试执行步骤
代表运行测试的步骤。
它接受 ant-junit xml 文件,该文件将由服务解析为结构化测试结果。 Xml 文件路径会更新以附加更多文件,但无法删除它们。
用户还可以使用 test_result 字段手动添加测试结果。
JSON 表示 |
---|
{ "testSuiteOverviews": [ { object ( |
领域 | |
---|---|
testSuiteOverviews[] | 测试套件概述内容列表。这可以由服务器从 xUnit XML 日志中解析,也可以由用户直接上传。仅当测试套件完全解析或上传时才应调用此引用。 每个步骤允许的最大测试套件概览数量为 1000。
|
toolExecution | 代表测试运行器的执行。 该工具的退出代码将用于确定测试是否通过。
|
testIssues[] | 测试执行期间观察到的问题。 例如,如果被测移动应用在测试过程中崩溃了,可以在这里记录错误消息和堆栈跟踪内容以辅助调试。
|
testTiming | 测试执行的时间分解。
|
工具执行
任意工具的执行。它可以是测试运行程序或复制工件或部署代码的工具。
JSON 表示 |
---|
{ "commandLineArguments": [ string ], "toolLogs": [ { object ( |
领域 | |
---|---|
commandLineArguments[] | 完整的标记化命令行,包括程序名称(相当于 C 程序中的 argv)。
|
toolLogs[] | 对任何纯文本日志的引用都会输出工具执行情况。 可以在工具退出之前设置此字段,以便能够在工具运行时访问日志的实时视图。 每步允许的最大工具日志数量为 1000。
|
exitCode | 工具执行退出代码。该工具退出后将设置该字段。
|
toolOutputs[] | 对工具执行输出的任何格式的不透明文件的引用。 每步允许的最大工具输出数量为 1000。
|
工具退出代码
从工具执行中退出代码。
JSON 表示 |
---|
{ "number": integer } |
领域 | |
---|---|
number | 工具执行退出代码。值为 0 表示执行成功。
|
测试问题
在测试执行期间检测到发生的问题。
JSON 表示 |
---|
{ "errorMessage": string, "stackTrace": { object ( |
领域 | |
---|---|
errorMessage | 描述问题的简短的人类可读消息。必需的。 |
stackTrace | 已弃用,取而代之的是特定警告中的堆栈跟踪字段。 |
warning | 带有问题其他详细信息的警告消息。应始终是来自 com.google.devtools.toolresults.v1.warnings 的消息 |
severity | 问题的严重性。必需的。 |
type | 问题类型。必需的。 |
category | 问题类别。必需的。 |
任何
Any
包含任意序列化协议缓冲区消息以及描述序列化消息类型的 URL。
Protobuf 库支持以实用函数或 Any 类型的附加生成方法的形式打包/解包 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 表示形式使用反序列化的嵌入消息的常规表示形式,以及包含类型 URL 的附加字段@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 | 唯一标识序列化协议缓冲区消息类型的 URL/资源名称。该字符串必须至少包含一个“/”字符。 URL 路径的最后一段必须表示类型的完全限定名称(如 在实践中,团队通常将他们期望在 Any 上下文中使用的所有类型预编译到二进制文件中。但是,对于使用
注意:此功能目前在官方 protobuf 版本中不可用,并且不用于以 type.googleapis.com 开头的类型 URL。 除了 |
value | 必须是上述指定类型的有效序列化协议缓冲区。 Base64 编码的字符串。 |
严重性
问题的严重性。
枚举 | |
---|---|
unspecifiedSeverity | 默认未指定严重性。不使用。仅用于版本控制。 |
info | 非关键问题,为用户提供一些有关测试运行的信息。 |
suggestion | 非关键问题,为用户提供一些改善测试体验的提示,例如建议使用游戏循环。 |
warning | 潜在的关键问题。 |
severe | 关键问题。 |
类型
问题类型。
枚举 | |
---|---|
unspecifiedType | 默认未指定类型。不使用。仅用于版本控制。 |
fatalException | 问题是一个致命的异常。 |
nativeCrash | 问题是本机崩溃。 |
anr | 问题是 ANR 崩溃。 |
unusedRoboDirective | 问题是未使用的机器人指令。 |
compatibleWithOrchestrator | 问题是使用orchestrator的建议。 |
launcherActivityNotFound | 查找启动器活动时出现问题 |
startActivityNotFound | 解决用户提供的启动活动意图的问题 |
incompleteRoboScriptExecution | Robo 脚本未完全执行。 |
completeRoboScriptExecution | Robo 脚本已完全成功执行。 |
failedToInstall | APK 安装失败。 |
availableDeepLinks | 正在测试的应用程序具有深层链接,但没有提供给 Robo。 |
nonSdkApiUsageViolation | 应用程序访问非 sdk Api。 |
nonSdkApiUsageReport | 应用程序访问了非sdk Api(新的详细报告) |
encounteredNonAndroidUiWidgetScreen | Robo 抓取至少遇到一个屏幕,其中包含非 Android UI 小部件的元素。 |
encounteredLoginScreen | Robo 抓取至少遇到一个可能的登录屏幕。 |
performedGoogleLogin | Robo 已登录 Google。 |
iosException | iOS 应用程序因异常而崩溃。 |
iosCrash | iOS 应用程序无异常崩溃(例如被杀死)。 |
performedMonkeyActions | 机器人爬行涉及执行一些猴子动作。 |
usedRoboDirective | Robo 爬行使用 Robo 指令。 |
usedRoboIgnoreDirective | Robo 爬行使用 Robo 指令来忽略 UI 元素。 |
insufficientCoverage | Robo 没有抓取应用程序的一些潜在重要部分。 |
inAppPurchases | Robo 爬行涉及一些应用内购买。 |
crashDialogError | 测试执行期间检测到崩溃对话框 |
uiElementsTooDeep | UI元素深度大于阈值 |
blankScreen | Robo 爬行中发现空白屏幕 |
overlappingUiElements | Robo 爬行中发现重叠的 UI 元素 |
unityException | 检测到未捕获的 Unity 异常(这些异常不会导致应用程序崩溃)。 |
deviceOutOfMemory | 检测到设备内存不足 |
logcatCollectionError | 收集 logcat 时检测到的问题 |
detectedAppSplashScreen | Robo 检测到应用程序提供的启动屏幕(相对于 Android 操作系统启动屏幕)。 |
类别
问题的类别。
枚举 | |
---|---|
unspecifiedCategory | 默认未指定类别。不使用。仅用于版本控制。 |
common | 问题并不特定于特定的测试类型(例如,本机崩溃)。 |
robo | 问题是 Robo run 特有的。 |
测试计时
测试时间分解以了解阶段。
JSON 表示 |
---|
{
"testProcessDuration": {
object ( |
领域 | |
---|---|
testProcessDuration | 运行测试过程需要多长时间。
|
工具执行步骤
用于我们未明确支持的二进制文件的通用工具步骤。例如:运行 cp 将工件从一个位置复制到另一个位置。
JSON 表示 |
---|
{
"toolExecution": {
object ( |
领域 | |
---|---|
toolExecution | 工具执行。
|
多重步骤
当多个步骤以相同的配置作为一个组运行时的详细信息。
JSON 表示 |
---|
{
"primaryStepId": string,
"multistepNumber": integer,
"primaryStep": {
object ( |
领域 | |
---|---|
primaryStepId | 主要(原始)步骤的步骤 ID,可能是此步骤。 |
multistepNumber | 赋予每个步骤的唯一整数。范围从 0(含)到总步数(不含)。初级步长为 0。 |
primaryStep | 如果它是主要(原始)步骤,则存在。 |
主要步骤
存储作为一组运行的多个步骤的汇总测试状态以及每个单独步骤的结果。
JSON 表示 |
---|
{ "rollUp": enum ( |
领域 | |
---|---|
rollUp | 使用相同配置作为一个组运行的多个步骤的汇总测试状态。 |
individualOutcome[] | 步骤 ID 和每个步骤的结果。 |
个人成果
与具有相同配置的其他步骤作为一个组运行的每个单独步骤的步骤 ID 和结果。
JSON 表示 |
---|
{ "stepId": string, "outcomeSummary": enum ( |
领域 | |
---|---|
stepId | |
outcomeSummary | |
multistepNumber | 赋予每个步骤的唯一整数。范围从 0(含)到总步数(不含)。初级步长为 0。 |
runDuration | 这一步运行需要多长时间。 |
方法 | |
---|---|
| 列出给定步骤的可访问性集群 可能返回以下任何规范错误代码:
|
| 创建一个步骤。 |
| 获得一步。 |
| 检索 PerfMetricsSummary。 |
| 列出给定执行的步骤。 |
| 使用提供的部分实体更新现有步骤。 |
| 将 xml 文件发布到现有步骤。 |