개발자 기기 플랫폼 테스트 결과 확인

이 가이드에서는 개발자 기기 플랫폼 기기 실행 가이드에 따라 트리거된 테스트 및 실행 파일의 결과를 찾는 방법을 설명합니다.

시작하기 전에

이 단계에서는 이미 Google Cloud 프로젝트를 만들고 Developer Device Platform 빠른 시작 가이드의 설정 단계를 완료했으며 터미널에서 gcloud로 인증했다고 가정합니다.

명령줄에서

다음 명령어와 세션 ID를 사용하여 테스트 또는 실행 파일 결과의 기본 요약을 확인합니다.

gcloud beta device-run sessions describe SESSION_ID

그러면 다음과 유사한 결과가 반환됩니다.

Session SESSION_ID finished with result [FAILED].
Result files are stored at [https://console.cloud.google.com/storage/browser/BUCKET_NAME/automation/sessions/SESSION_ID/].
JOB NAME  EXECUTION NAME  EXECUTION RESULT
job-000   all             FAILED: 2 test cases failed, 5 passed
job-001   all             PASS

--device 플래그로 지정한 각 기기 유형 ID에 대해 세션에서 하나의 작업이 생성됩니다. 작업 색인은 기기 ID의 순서를 따릅니다. 테스트 실패는 예상되는 결과이며 반복적인 개선과 실행을 통해 조사하고 해결해야 합니다.

세션에 대한 추가 세부정보를 가져오려면 다음과 같이 이전에 실행한 describe 명령어에 --full를 추가합니다.

gcloud beta device-run sessions describe SESSION_ID --full

그러면 다음과 유사한 결과가 반환됩니다.

Android 계측

name: projects/PROJECT_ID/locations/global/sessions/session-370961e1
sessionConfig:
  displayName: instrumentation-session
  jobConfigs:

    -   action:
      androidInstrumentationTest:
        testInstallable:
          files:
        -   gcsInputFile:
              path: gs://BUCKET_NAME/automation/inputs/2026-07-30_11:28.31915956_8514/app_name_test.apk
    allocationConfig:
      deviceConfigs:
    -   actions:
        -   androidInstallPackages:
            installables:
            -   files:
                -   gcsInputFile:
                  path: gs://BUCKET_NAME/automation/inputs/2026-07-30_11:28.31915956_8514/app_name.apk
        -   androidLogcat: {}
        requirement:
          deviceId: pa3q-35
    displayName: job-000
  outputDirectoryConfig:
    gcsOutputDirectory:
      path: gs://BUCKET_NAME/automation/sessions
sessionReport:
  endTime: '2026-07-30T03:30:05.838Z'
  id: 6587313f-fdf7-418a-a9b9-b6fa98dff838
  jobReports:
    -   displayName: job-000
    endTime: '2026-07-30T03:30:04.601Z'
    executionReports:
        -   displayName: all
      endTime: '2026-07-30T03:30:02.151Z'
      id: 29b167dd-dde9-4ea9-b2cd-738049083fc9
      outputFiles:
            -   gcsOutputFile:
          path: gs://PROJECT_ID-devicerun/automation/sessions/session-370961e1/job-000/execution-000/logcat.txt
            -   gcsOutputFile:
          path: gs://PROJECT_ID-devicerun/automation/sessions/session-370961e1/job-000/execution-000/instrument.log
            -   gcsOutputFile:
          path: gs://PROJECT_ID-devicerun/automation/sessions/session-370961e1/job-000/execution-000/junit.xml
      result:
        cause:
          summary:
            message: One or more test assertions or test methods failed. Inspect the
              test runner logs and structured test results for details.
            reason: TEST_CASE_FAILURE
            type: CUSTOMER
        resultType: FAILED
      startTime: '2026-07-30T03:29:32.769Z'
      status:
        progressMessages:
                -   2 test cases failed, 5 passed
        statusType: DONE
    id: 7974e37a-2928-4aaf-abba-3a8b6bae853b
    result:
      cause:
        summary:
          message: Job has one or more failed tests. See execution reports for details.
          reason: JOB_HAS_FAILED_TESTS
      resultType: FAILED
    startTime: '2026-07-30T03:28:53.756Z'
    status:
      statusType: DONE
  result:
    cause:
      summary:
        message: Session has one or more failed jobs. See job reports for details.
        reason: SESSION_HAS_FAILED_JOBS
    resultType: FAILED
  startTime: '2026-07-30T03:28:52.702Z'
  status:
    statusType: DONE

Android 실행 파일

name: projects/PROJECT_ID/locations/global/sessions/session-8a41c2b0
sessionConfig:
  displayName: android-executable-session
  jobConfigs:

    -   action:
      androidNativeBinary:
        androidNativeBinary:
          gcsInputFile:
            path: gs://BUCKET_NAME/automation/inputs/2026-07-30_11:28.31915956_8514/my_executable
        args:
        -   --example_flag=/data/local/tmp/example_value
        -   --threads=4
    allocationConfig:
      deviceConfigs:
    -   actions:
        -   androidLogcat: {}
        -   androidPushFiles:
            fileConfigs:
            -   destinationPath: /data/local/tmp/model.tflite
                sourceFile:
                  gcsInputFile:
                    path: gs://BUCKET_NAME/automation/inputs/2026-07-30_11:28.31915956_8514/model.tflite
        requirement:
          deviceId: shiba-34
    displayName: job-000
  outputDirectoryConfig:
    gcsOutputDirectory:
      path: gs://BUCKET_NAME/automation/sessions
sessionReport:
  endTime: '2026-07-30T03:30:05.838Z'
  id: 4b9120ec-fdf7-418a-a9b9-b6fa98dff838
  jobReports:
    -   displayName: job-000
    endTime: '2026-07-30T03:30:04.601Z'
    executionReports:
        -   displayName: execution-000
      endTime: '2026-07-30T03:30:02.151Z'
      id: 19a267dd-dde9-4ea9-b2cd-738049083fc9
      outputFiles:
            -   gcsOutputFile:
          path: gs://PROJECT_ID-devicerun/automation/sessions/session-8a41c2b0/job-000/execution-000/logcat.txt
            -   gcsOutputFile:
          path: gs://PROJECT_ID-devicerun/automation/sessions/session-8a41c2b0/job-000/execution-000/output.log
      result:
        resultType: PASSED
      startTime: '2026-07-30T03:29:32.769Z'
      status:
        statusType: DONE
    id: 8874e37a-2928-4aaf-abba-3a8b6bae853b
    result:
      resultType: PASSED
    startTime: '2026-07-30T03:28:53.756Z'
    status:
      statusType: DONE
  result:
    resultType: PASSED
  startTime: '2026-07-30T03:28:52.702Z'
  status:
    statusType: DONE

iOS XCTest

다음은 모든 플래그가 사용 설정된 실제 iOS XCTest 실행에서 가져온 gcloud beta device-run sessions describe SESSION_ID --full의 실제 정제된 출력입니다.

name: projects/PROJECT_ID/locations/global/sessions/session-4b941167-5629-4abb-a8a1-a9814bf16847
sessionConfig:
  displayName: xctest-session
  jobConfigs:

    -   action:
      iosXcTest:
        testsZip:
          gcsInputFile:
            path: gs://BUCKET_NAME/automation/inputs/2026-10-09_11:33.01234567_ABCD/MyTests.zip
    allocationConfig:
      deviceConfigs:
        -   actions:
            -   iosInstallPackages:
            ipas:
                -   gcsInputFile:
                path: gs://BUCKET_NAME/automation/inputs/2026-10-09_11:33.01234567_ABCD/AdditionalApp.ipa
        requirement:
          deviceId: iphonese3-18-4
    displayName: job-000
  outputDirectoryConfig:
    gcsOutputDirectory:
      path: gs://BUCKET_NAME/automation/sessions

이 출력에서 .../artifacts/output.txt(com.example.app/Documents/ 제외)에 있는 테스트 대상 앱의 가져온 파일을 찾습니다.

웹브라우저에서

자세한 내용은 테스트 출력에서 테스트 결과가 포함된 버킷의 URL을 로드하세요. 다음과 같이 표시됩니다. https://console.cloud.google.com/storage/browser/BUCKET_NAME/automation/sessions/SESSION_ID/

세션은 스토리지에 다음과 같은 경로 형식으로 표시됩니다. gs://BUCKET_NAME/automation/sessions/SESSION_ID/job-000/EXECUTION_ID/

Google Cloud 콘솔 웹 인터페이스에서 로그를 찾으려면 다음 단계를 따르세요.

  1. 브라우저에서 gcloud config set project 명령어에 사용된 프로젝트 이름을 URL https://console.cloud.google.com/?project=에 추가하고 페이지를 로드합니다.
  2. 왼쪽 상단의 메뉴를 펼칩니다.
  3. I can find Cloud Storage.
  4. 스토리지 메뉴에서 버킷을 선택합니다.
  5. 첫 번째 열에서 프로젝트 이름을 클릭합니다.
  6. thought 자동화를 클릭합니다.
  7. 세션을 클릭합니다.
  8. 필터 필드에 최신 테스트 실행의 세션 ID를 붙여넣습니다 (테스트 출력 참조).
  9. 결과 세션 이름을 클릭합니다.
  10. job-* 을 선택하여 작업의 모든 실행 및 테스트 사례에서 병합된 결과 세부정보가 포함된 junit.xml (Android 계측 및 iOS XCTest 실행의 경우)를 확인합니다.
  11. 각 개별 실행 또는 샤드의 분석을 위해 execution-* (또는 불안정한 테스트 재시도가 --flaky-test-attempts로 구성된 경우 execution-*-rerun-*)을 엽니다. 세션 유형 및 구성된 플래그에 따라 이 폴더에는 세션 유형 및 구성된 플래그에 따라 수많은 아티팩트가 포함될 수 있습니다. 자세한 내용은 결과 이해를 참조하세요.
  12. 공개 및 인증된 URL을 방문하여 결과를 확인합니다.

파일 구조

Cloud Storage 버킷의 로그 파일을 탐색하여 세션 실행에 대해 자세히 알아봅니다. 파일 구조는 다음과 같습니다.

Android 계측


-   gs://BUCKET_NAME/automation
    -   inputs/
        -   2026-05-29_10:13.026220_JZTM
            -   app.apk
            -   test.apk
    -   sessions/
        -   SESSION_ID
            -   job-000/
                -   junit.xml
                -   execution-000/
                    -   artifacts/
                        -   sdcard/
                            -   output.txt
                    -   bugreport.zip
                    -   dumpsys.txt
                    -   instrument.log
                    -   junit.xml
                    -   logcat.txt
                    -   video.mp4
                -   execution-001/
                    -   instrument.log
                    -   junit.xml
                    -   logcat.txt
                    -   video.mp4
            -   job-001/
        -   SESSION_ID

Android 실행 파일


-   gs://BUCKET_NAME/automation
    -   inputs/
        -   2026-05-29_10:13.026220_JZTM
            -   my_executable
            -   model.tflite
    -   sessions/
        -   SESSION_ID
            -   job-000/
                -   execution-000/
                    -   artifacts/
                        -   data/
                            -   local/
                                -   tmp/
                                    -   results.json
                    -   bugreport.zip
                    -   dumpsys.txt
                    -   logcat.txt
                    -   output.log
                    -   video.mp4
            -   job-001/
        -   SESSION_ID

iOS XCTest


-   gs://BUCKET_NAME/
    -   automation/
        -   inputs/
            -   2026-10-09_11:33.01234567_ABCD/
                -   AdditionalApp.ipa
                -   MyTests.zip
                -   data.txt
        -   sessions/
            -   SESSION_ID/
                -   job-000/
                    -   execution-000/
                        -   artifacts/
                            -   output.txt
                        -   junit.xml
                        -   system.log

이 출력에서 artifacts/ 아래의 가져온 경로를 확인합니다. --paths-to-pull=com.example.app:/Documents/output.txt의 경우 테스트 대상 앱(AUT)에서 가져올 때 서비스는 /Documents를 제거하고 파일을 artifacts/com.example.app/Documents/output.txt가 아닌 artifacts/output.txt에 직접 배치합니다. 추가 앱(--additional-apps)에서 가져온 경우 artifacts/<bundle_id>-genfiles/output.txt에 배치됩니다.

결과 이해

Android 계측 및 iOS XCTest 실행의 경우 출력에 생성된 junit.xml 파일은 표준 JUnit XML 파일입니다. 실행 수준 junit.xml는 각 execution-* 디렉터리에 작성되고 병합된 junit.xml는 각 job-* 디렉터리에 작성됩니다. 이러한 파일에는 테스트 메서드별 결과가 포함되어 있어 각 개별 테스트 메서드의 특정 통과 또는 실패 상태, 실행 시간, 오류 추적을 검토할 수 있습니다. 대부분의 지속적 통합 및 지속적 배포 (CI/CD) 시스템과 테스트 보고 도구를 사용하여 이러한 파일을 쉽게 통합하고 파싱할 수 있습니다.

구조화된 테스트 결과 외에도 각 execution-* 디렉터리에는 플랫폼별 로그와 아티팩트가 포함됩니다.

  • Android 계측 실행에는 원시 계측 실행기 출력을 위한 instrument.log와 기기 전체 Android 시스템 로그를 위한 logcat.txt가 포함됩니다. --bugreport, --dumpsys 또는 --video로 사용 설정하면 실행 디렉터리에 bugreport.zip, dumpsys.txt, 화면 동영상 녹화도 포함됩니다.
  • Android 실행 파일 실행에는 실행 파일에서 작성한 표준 출력 (stdout) 및 표준 오류 (stderr)를 캡처하는 output.log와 기기 전체 Android 시스템 로그를 캡처하는 logcat.txt(모든 Android 작업에 대해 기본적으로 수집됨)가 포함되며, 선택적 --bugreport, --dumpsys 또는 --video 아티팩트도 포함됩니다.
  • iOS XCTest 실행에는 원시 iOS 기기 syslog를 캡처하는 system.log (모든 iOS XCTest 작업에 대해 기본적으로 수집됨)와 테스트 실행 중에 프로세스가 비정상 종료된 경우의 .ips 진단 비정상 종료 보고서가 포함됩니다. --video로 사용 설정하면 기록된 각 UI 테스트 사례 동영상이 testcases/TEST_CLASS/TEST_METHOD/video.mp4에 저장됩니다.
  • --paths-to-pull로 지정된 가져온 기기 파일은 실행 디렉터리의 artifacts/ 하위 폴더에 저장됩니다.
    • Android 실행의 경우 가져온 파일은 artifacts/ (예: artifacts/sdcard/output.txt 또는 artifacts/data/local/tmp/results.json) 아래에 기기 경로를 보존합니다.
    • iOS XCTest 실행의 경우 --paths-to-pull=BUNDLE_ID:DEVICE_PATH를 사용하여 앱 데이터 컨테이너에서 가져온 파일은 artifacts/ 아래에 번들 ID로 구성됩니다.
      • com.example.app가 테스트 중인 앱인 경우 artifacts/output.txt에 직접 저장됩니다.
      • com.example.app가 추가 앱 (--additional-apps)인 경우 artifacts/com.example.app-genfiles/output.txt에 저장됩니다.

증빙 서류

다음 단계

다음으로 Developer Device Platform Device Streaming API를 사용해 보세요.