REST Resource: projects.histories.executions.steps

资源:步骤

步骤表示作为执行的一部分执行的单个操作。步骤可用于表示工具的执行(例如测试运行器执行或编译器执行)。

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

这是一个示例,让我们考虑一下我们有一个连续构建,正在为每次迭代执行一个测试运行程序。工作流程如下所示: - 用户创建 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 (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 )

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

当状态转换为 COMPLETE 时,将自动设置该值。

  • 响应:如果执行状态为 COMPLETE,则设置。
  • 在创建/更新请求中:从不设置
name

string

显示在 UI 中的人类可读的简短名称。最多 100 个字符。例如:干净的构建

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

  • 响应:始终设置
  • 在创建请求中:始终设置
  • 在更新请求中:从未设置
description

string

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

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

enum ( State )

初始状态为 IN_PROGRESS。唯一合法的状态转换是 * IN_PROGRESS -> COMPLETE

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

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

  • 响应:始终设置
  • 在创建/更新请求中:可选
outcome

object ( Outcome )

结果分类,例如成功或失败

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

boolean

此步骤的任何输出是否是可以使用thumbnails.list 获取其缩略图的图像。

  • 响应:始终设置
  • 在创建/更新请求中:从不设置
labels

map (key: string, value: string)

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

用户负责管理密钥命名空间,以便密钥不会意外冲突。

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

  • 响应:始终设置
  • 在创建请求中:可选
  • 更新请求中:可选;任何新的键/值对都将添加到映射中,并且现有键的任何新值都将更新该键的值

包含"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。

如果设置了DimensionValue,并且执行中存在未指定为键之一的dimension_definition,则将返回PRECONDITION_FAILED。

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

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

runDuration

object ( Duration )

这一步运行需要多长时间。

如果未设置,则当步骤设置为 COMPLETE 状态时,此值将设置为creationTime 和completionTime 之间的差值。在某些情况下,单独设置此值是合适的:例如,如果创建了一个步骤,但它所代表的操作在执行之前排队了几分钟,那么最好不要将排队所花费的时间包含在其步骤中。运行持续时间。

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

  • 响应:如果之前设置则存在;始终出现在完成步骤中
  • 在创建请求中:可选
  • 更新请求中:可选
deviceUsageDuration

object ( Duration )

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

这是用于计费目的的设备使用情况,与 runDuration 不同,例如,基础设施故障不会对设备使用情况进行计费。

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

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

object ( MultiStep )

当多个步骤以相同的配置作为一个组运行时的详细信息。这些详细信息可用于识别该步骤属于哪个组。它还标识了对所有组成员进行索引的组“主要步骤”。

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

联盟田step

step只能是以下之一:

testExecutionStep

object ( TestExecutionStep )

测试运行程序的执行。

toolExecutionStep

object ( ToolExecutionStep )

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

测试执行步骤

代表运行测试的步骤。

它接受 ant-junit xml 文件,该文件将由服务解析为结构化测试结果。 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

完整的标记化命令行,包括程序名称(相当于 C 程序中的 argv)。

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

object ( FileReference )

对任何纯文本日志的引用都会输出工具执行情况。

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

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

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

object ( ToolExitCode )

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

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

object ( ToolOutputReference )

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

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

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

工具退出代码

从工具执行中退出代码。

JSON 表示
{
  "number": integer
}
领域
number

integer

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

  • 响应:始终设置
  • 在创建/更新请求中:始终设置

测试问题

在测试执行期间检测到发生的问题。

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 类型的附加生成方法的形式打包/解包 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

string

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

在实践中,团队通常将他们期望在 Any 上下文中使用的所有类型预编译到二进制文件中。但是,对于使用httphttps或无方案的 URL,可以选择设置一个类型服务器,将类型 URL 映射到消息定义,如下所示:

  • 如果未提供方案,则假定为https
  • URL 上的 HTTP GET 必须生成二进制格式的google.protobuf.Type值,否则会产生错误。
  • 应用程序可以根据 URL 缓存查找结果,或者将它们预编译成二进制文件以避免任何查找。因此,在类型更改时需要保留二进制兼容性。 (使用版本化类型名称来管理重大更改。)

注意:此功能目前在官方 protobuf 版本中不可用,并且不用于以 type.googleapis.com 开头的类型 URL。

除了httphttps (或空方案)之外的方案可以与实现特定的语义一起使用。

value

string ( bytes format)

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

Base64 编码的字符串。

严重性

问题的严重性。

枚举
unspecifiedSeverity默认未指定严重性。不使用。仅用于版本控制。
info非关键问题,为用户提供一些有关测试运行的信息。
suggestion非关键问题,为用户提供一些改善测试体验的提示,例如建议使用游戏循环。
warning潜在的关键问题。
severe关键问题。

类型

问题类型。

枚举
unspecifiedType默认未指定类型。不使用。仅用于版本控制。
fatalException问题是一个致命的异常。
nativeCrash问题是本机崩溃。
anr问题是 ANR 崩溃。
unusedRoboDirective问题是未使用的机器人指令。
compatibleWithOrchestrator问题是使用orchestrator的建议。
launcherActivityNotFound查找启动器活动时出现问题
startActivityNotFound解决用户提供的启动活动意图的问题
incompleteRoboScriptExecution Robo 脚本未完全执行。
completeRoboScriptExecution Robo 脚本已完全成功执行。
failedToInstall APK 安装失败。
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 (Duration)
  }
}
领域
testProcessDuration

object ( Duration )

运行测试过程需要多长时间。

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

工具执行步骤

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

JSON 表示
{
  "toolExecution": {
    object (ToolExecution)
  }
}
领域
toolExecution

object ( ToolExecution )

工具执行。

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

多重步骤

当多个步骤以相同的配置作为一个组运行时的详细信息。

JSON 表示
{
  "primaryStepId": string,
  "multistepNumber": integer,
  "primaryStep": {
    object (PrimaryStep)
  }
}
领域
primaryStepId

string

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

multistepNumber

integer

赋予每个步骤的唯一整数。范围从 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。

runDuration

object ( Duration )

这一步运行需要多长时间。

方法

accessibilityClusters

列出给定步骤的可访问性集群

可能返回以下任何规范错误代码:

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

create

创建一个步骤。

get

获得一步。

getPerfMetricsSummary

检索 PerfMetricsSummary。

list

列出给定执行的步骤。

patch

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

publishXunitXmlFiles

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