REST Resource: projects.histories.executions.steps

資源:Step

「步驟」代表在「執行」中執行的單一作業。步驟可用來代表工具的執行作業 ( 例如測試執行器或編譯器的執行作業)。

步驟可以重疊 (舉例來說,如果某些作業同時進行,兩個步驟的開始時間可能會相同)。

以下範例說明,我們有持續的建構作業會在每次疊代時執行測試執行器。工作流程看起來會像這樣:- 使用者建立 ID 1 的 Execution - 使用者建立 ID 為 100 的 TestExecutionStep,使用者更新 ID 為 100 的 TestExecutionStep,以便新增原始 XML 紀錄 + 服務剖析 XML 紀錄,並傳回含更新 TestResult 的 TestExecutionStep。- 使用者將 TestExecutionStep (ID 100) 的狀態更新為 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

此步驟執行作業執行中的唯一 ID。

如果呼叫端設定或覆寫這個欄位,則傳回 INVALID_src。

  • 回應:一律設定
  • 在建立/更新要求中:永不設定
creationTime

object (Timestamp)

步驟的建立時間。

  • 回應:一律設定
  • 在建立/更新要求中:永不設定
completionTime

object (Timestamp)

步驟狀態設為完成的時間。

當狀態轉換為 COMPLETE 時,系統會自動設定這個值。

  • 回應:如果執行狀態是 COMPLETE,就會設定此參數。
  • 在建立/更新要求中:永不設定
name

string

使用者可理解的簡短名稱,會顯示在 UI 中。最多 100 個字元。例如:清理

如果新步驟與現有步驟使用相同的 nameValue 和 dimensionValue,系統將在建立新步驟時傳回 PRECONDITION_FAILED。如果兩個步驟代表相似的動作,但維度值不同,這兩個步驟應使用相同的名稱。舉例來說,如果在兩個不同的平台上執行同一組測試,這兩個步驟的名稱應相同。

  • 回應:一律設定
  • 在建立要求中:一律設定
  • 在更新要求中:永不設定
description

string

此工具的說明,例如:mvn clean package -DSkipTests=true

  • 回應:如果由建立/更新要求設定,就會顯示這個元素
  • 在建立/更新要求中:選填
state

enum (State)

初始狀態為 IN_PROGRESS。唯一法律狀態轉換的結果是 * IN_PROGRESS ->完成

如果要求無效的轉換,則會傳回 PRECONDITION_FAILED。

建立步驟時,狀態會設為 COMPLETE。狀態只能設為 COMPLETE 一次。如果狀態設為 COMPLETE 多次,系統會傳回 PRECONDITION_FAILED。

  • 回應:一律設定
  • 在建立/更新要求中:選填
outcome

object (Outcome)

結果的分類,例如「成功」或「失敗」

  • 回應:如果由建立/更新要求設定,就會顯示這個元素
  • 在建立/更新要求中:選填
hasImages

boolean

這個步驟的輸出內容是否為可擷取縮圖的圖片。

  • 回應:一律設定
  • 在建立/更新要求中:永不設定
labels

map (key: string, value: string)

任意由使用者提供的步驟/值組合,且該鍵/值組合與步驟相關聯。

使用者必須負責管理鍵命名空間,這樣鍵就不會意外相互衝突。

如果標籤數量超過 100,或是任一鍵/值的長度超出 100 個字元,系統就會傳回 INVALID_src。

  • 回應:一律設定
  • 建立要求:選填
  • 更新要求:選用;系統會將任何新的鍵/值組合加入對應,現有鍵的任何新值都將更新該鍵/值

包含 "key": value 組合清單的物件。範例:{ "name": "wrench", "mass": "1.3kg", "count": "3" }

dimensionValue

map (key: string, value: string)

如果包含此步驟的執行程序設有任何 dimension_definition 值,則這個欄位可讓子項指定維度值。

這些鍵必須與執行作業的 dimension_definition 完全相符。

舉例來說,如果執行作業包含 dimension_definition = ['attempt', 'device'],則步驟就必須定義這些維度的值,例如dimensionValue = ['attempt': '1', 'device': 'Nexus 6']

如果某個步驟未參與矩陣的某個維度,該維度的值必須為空字串。舉例來說,如果其中一項測試是由不支援重試的執行器執行,則該步驟可能會有 dimensionValue = ['attempt': '', 'device': 'Nexus 6']

如果步驟沒有參與矩陣的任何維度,可能會使 sizeValue 保持未設定狀態。

如果執行作業的 Dimensions_definition 中沒有任何鍵,就會傳回 PRECONDITION_FAILED。

如果此執行作業中的另一個步驟的名稱和 dimensionValue 相同,但其他資料欄位不同 (例如步驟欄位不同),系統會傳回 PRECONDITION_FAILED。

如果設定 dimensionValue 且在執行時有 dimension_definition 未指定為其中一個鍵,則會傳回 PRECONDITION_FAILED。

  • 回應:如果建立
  • 建立要求:選填
  • 在更新要求中:永不設定

包含 "key": value 組合清單的物件。範例:{ "name": "wrench", "mass": "1.3kg", "count": "3" }

runDuration

object (Duration)

執行這個步驟花費的時間。

如未設定,這會在步驟設為 COMPLETE 狀態時,將 createTime 和 completeTime 時間差。在某些情況下,您可以個別設定這個值。舉例來說,如果步驟已經建立,但代表作業會在執行前幾分鐘排入佇列,就不合適的做法在其 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 個。

  • 回應:一律設定
  • 建立要求:選填
  • 在更新要求中:永不 (請改用 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)

參照任何純文字記錄而輸出的工具執行記錄。

這個欄位可在工具結束之前設定,這樣才能在工具執行期間即時查看記錄。

每個步驟允許的工具記錄檔數量上限為 1,000 筆。

  • 回應:如果由建立/更新要求設定,就會顯示這個元素
  • 建立要求:選填
  • 在更新要求中:選用,您提供的任何值都會附加至現有清單
exitCode

object (ToolExitCode)

工具執行結束程式碼。這個欄位會在工具退出後設定。

  • 回應:如果由建立/更新要求設定,就會顯示這個元素
  • 建立要求:選填
  • 在更新要求中:選用時,如果已設定 exitCode,則會傳回 FAILED_PRECONDITION 錯誤。
toolOutputs[]

object (ToolOutputReference)

參照工具執行時任何格式的不透明檔案。

每個步驟允許的工具輸出數量上限為 1,000 個。

  • 回應:如果由建立/更新要求設定,就會顯示這個元素
  • 建立要求:選填
  • 在更新要求中:選用,您提供的任何值都會附加至現有清單

工具結束程式碼

結束工具執行作業的程式碼。

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 包含任意序列化通訊協定緩衝區訊息,以及描述序列化訊息類型的網址。

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 程式庫提供的 pack 方法預設會使用「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)。請使用標準格式的名稱 (例如不得使用開頭的「.」)。

實務上,團隊通常會在「任何」情境中,將預期使用的所有型別預先編譯為二進位檔。不過,如果網址使用 httphttps 或未設定配置,則可以選擇設定類型伺服器,將類型網址對應至訊息定義,如下所示:

  • 如未提供配置,系統會採用 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 尋找啟動器活動時發生問題
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 包含執行一些隨機式動作的 Robo 檢索作業。
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 作業系統啟動畫面)。
assetIssue 這項測試中的素材資源發生問題。

類別

問題類別。

列舉
unspecifiedCategory 預設未指定類別。請勿使用。僅適用於版本管理。
common 問題不限於特定測試種類 (例如原生程式碼發生錯誤)。
robo 問題只適用於 Robo 執行。

TestTiming

測試時間細項以掌握各個階段。

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_src - 如果要求格式錯誤
  • FAILED_PRECONDITION - 如果要求中的引數無效;例如:

create

可建立步驟。

get

取得步數。

getPerfMetricsSummary

擷取 PerfMetricsSummary。

list

列出特定執行作業的步驟。

patch

使用提供的部分實體更新現有的步驟。

publishXunitXmlFiles

將 XML 檔案發布至現有步驟。