자원: 단계
단계는 실행의 일부로 수행되는 단일 작업을 나타냅니다. 단계는 도구 실행(예: 테스트 실행기 실행 또는 컴파일러 실행)을 나타내는 데 사용할 수 있습니다.
단계는 겹칠 수 있습니다(예를 들어 일부 작업이 병렬로 수행되는 경우 두 단계의 시작 시간이 동일할 수 있음).
다음은 예입니다. 각 반복마다 테스트 실행기를 실행하는 연속 빌드가 있다고 가정해 보겠습니다. 워크플로우는 다음과 같습니다. - 사용자는 ID 1로 실행을 생성합니다. - 사용자는 실행 1에 대해 ID 100으로 TestExecutionStep을 생성합니다. - 사용자는 ID 100으로 TestExecutionStep을 업데이트하여 원시 xml 로그를 추가합니다. + 서비스는 xml 로그를 구문 분석하고 다음을 사용하여 TestExecutionStep을 반환합니다. TestResult가 업데이트되었습니다. - 사용자는 ID가 100인 TestExecutionStep의 상태를 COMPLETE로 업데이트합니다.
단계는 상태가 COMPLETE로 설정되어 변경할 수 없게 될 때까지 업데이트될 수 있습니다.
JSON 표현 |
---|
{ "stepId": string, "creationTime": { object ( |
필드 | |
---|---|
stepId | 이 단계에 대한 실행 내의 고유 식별자입니다. 호출자가 이 필드를 설정하거나 덮어쓴 경우 INVALID_ARGUMENT를 반환합니다.
|
creationTime | 단계가 생성된 시간입니다.
|
completionTime | 단계 상태가 완료로 설정된 시간입니다. 이 값은 상태가 COMPLETE로 전환될 때 자동으로 설정됩니다.
|
name | UI에 표시할 사람이 읽을 수 있는 짧은 이름입니다. 최대 100자입니다. 예: 클린 빌드 기존 단계와 이름 및 차원 값을 공유하는 경우 새 단계를 생성할 때 PRECONDITION_FAILED가 반환됩니다. 두 단계가 유사한 작업을 나타내지만 차원 값이 다른 경우 동일한 이름을 공유해야 합니다. 예를 들어 동일한 테스트 세트가 서로 다른 두 플랫폼에서 실행되는 경우 두 단계의 이름은 동일해야 합니다.
|
description | 이 도구에 대한 설명 예: mvn clean package -D SkipTests=true
|
state | 초기 상태는 IN_PROGRESS입니다. 유일한 합법적인 상태 전환은 * IN_PROGRESS -> COMPLETE입니다. 잘못된 전환이 요청되면 PRECONDITION_FAILED가 반환됩니다. 상태가 COMPLETE로 설정된 단계를 생성하는 것은 유효합니다. 상태는 한 번만 COMPLETE로 설정할 수 있습니다. 상태가 COMPLETE로 여러 번 설정된 경우 PRECONDITION_FAILED가 반환됩니다.
|
outcome | 결과 분류(예: SUCCESS 또는 FAILURE)
|
hasImages | 이 단계의 출력이 Thumbnails.list를 사용하여 썸네일을 가져올 수 있는 이미지인지 여부입니다.
|
labels | 단계와 연관된 임의의 사용자 제공 키/값 쌍입니다. 사용자는 키가 실수로 충돌하지 않도록 키 네임스페이스를 관리할 책임이 있습니다. 라벨 수가 100개를 초과하거나 키 또는 값의 길이가 100자를 초과하는 경우 INVALID_ARGUMENT가 반환됩니다.
|
dimensionValue | 이 단계를 포함하는 실행에 차원 정의가 설정된 경우 이 필드를 통해 하위 항목이 차원 값을 지정할 수 있습니다. 키는 실행의 차원 정의와 정확히 일치해야 합니다. 예를 들어 실행 단계가 행렬의 한 차원에 참여하지 않는 경우 해당 차원의 값은 빈 문자열이어야 합니다. 예를 들어 재시도를 지원하지 않는 실행기에 의해 테스트 중 하나가 실행되는 경우 해당 단계 단계가 행렬의 차원에 참여하지 않는 경우 차원 값이 설정되지 않은 상태로 남아 있을 수 있습니다. 실행의 차원 정의에 키가 없으면 PRECONDITION_FAILED가 반환됩니다. 이 실행의 다른 단계에 이미 동일한 이름과 차원 값이 있지만 다른 데이터 필드가 다른 경우(예: 단계 필드가 다른 경우) PRECONDITION_FAILED가 반환됩니다. 차원 값이 설정되어 있고 실행 시 키 중 하나로 지정되지 않은 차원 정의가 있는 경우 PRECONDITION_FAILED가 반환됩니다.
|
runDuration | 이 단계를 실행하는 데 걸린 시간입니다. 설정되지 않은 경우 단계가 COMPLETE 상태로 설정될 때 CreationTime과 CompletionTime의 차이로 설정됩니다. 어떤 경우에는 이 값을 별도로 설정하는 것이 적절합니다. 예를 들어 단계가 생성되었지만 해당 작업이 실행되기 전에 몇 분 동안 대기열에 있는 경우 해당 단계에 대기열에 있는 데 소요된 시간을 포함하지 않는 것이 적절할 것입니다. runDuration. 이 필드가 이미 설정된 단계에서 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 유형의 추가 생성 메서드 형태로 모든 값을 압축/압축해제하는 지원을 제공합니다.
예제 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'을 유형 URL로 사용하고 unpack 메소드는 유형 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 표현이 있는 경우 해당 표현은 @type
필드 외에 사용자 정의 JSON을 보유하는 필드 value
추가하여 포함됩니다. 예( 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 | 문제는 사용되지 않은 robo 지시어입니다. |
compatibleWithOrchestrator | 문제는 오케스트레이터를 사용하라는 제안입니다. |
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 | 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 OS 스플래시 화면과 비교)을 감지했습니다. |
범주
문제 카테고리.
열거형 | |
---|---|
unspecifiedCategory | 기본 미지정 카테고리입니다. 사용하지 마세요. 버전 관리 전용입니다. |
common | 문제는 특정 테스트 종류(예: 기본 충돌)에만 국한되지 않습니다. |
robo | 문제는 Robo 실행에만 해당됩니다. |
테스트타이밍
단계를 알기 위해 테스트 타이밍을 세분화합니다.
JSON 표현 |
---|
{
"testProcessDuration": {
object ( |
필드 | |
---|---|
testProcessDuration | 테스트 프로세스를 실행하는 데 걸린 시간입니다.
|
도구실행단계
명시적으로 지원하지 않는 바이너리에 사용되는 일반 도구 단계입니다. 예를 들어 cp를 실행하여 한 위치에서 다른 위치로 아티팩트를 복사합니다.
JSON 표현 |
---|
{
"toolExecution": {
object ( |
필드 | |
---|---|
toolExecution | 도구 실행.
|
다단계
여러 단계가 그룹과 동일한 구성으로 실행되는 경우의 세부정보입니다.
JSON 표현 |
---|
{
"primaryStepId": string,
"multistepNumber": integer,
"primaryStep": {
object ( |
필드 | |
---|---|
primaryStepId | 이 단계일 수 있는 기본(원래) 단계의 단계 ID입니다. |
multistepNumber | 각 단계에 고유한 int가 제공됩니다. 범위는 0(포함)부터 총 단계 수(제외)까지입니다. 기본 단계는 0입니다. |
primaryStep | 기본(원래) 단계인 경우 표시됩니다. |
기본 단계
그룹으로 실행된 여러 단계의 롤업 테스트 상태와 각 단계의 결과를 저장합니다.
JSON 표현 |
---|
{ "rollUp": enum ( |
필드 | |
---|---|
rollUp | 그룹과 동일한 구성으로 실행된 여러 단계의 롤업 테스트 상태입니다. |
individualOutcome[] | 각 개별 단계의 단계 ID 및 결과입니다. |
개인성과
동일한 구성을 가진 다른 단계와 함께 그룹으로 실행된 각 개별 단계의 단계 ID 및 결과입니다.
JSON 표현 |
---|
{ "stepId": string, "outcomeSummary": enum ( |
필드 | |
---|---|
stepId | |
outcomeSummary | |
multistepNumber | 각 단계에 고유한 int가 제공됩니다. 범위는 0(포함)부터 총 단계 수(제외)까지입니다. 기본 단계는 0입니다. |
runDuration | 이 단계를 실행하는 데 걸린 시간입니다. |
행동 양식 | |
---|---|
| 특정 단계에 대한 접근성 클러스터를 나열합니다. 다음 표준 오류 코드 중 하나를 반환할 수 있습니다.
|
| 단계를 생성합니다. |
| 단계를 가져옵니다. |
| PerfMetricsSummary를 검색합니다. |
| 특정 실행에 대한 단계를 나열합니다. |
| 제공된 부분 엔터티로 기존 단계를 업데이트합니다. |
| xml 파일을 기존 단계에 게시합니다. |