Encontrar os resultados do teste da plataforma do dispositivo de desenvolvimento

Neste guia, descrevemos como encontrar os resultados de testes e executáveis acionados seguindo o guia Developer Device Platform Device Run.

Antes de começar

Estas etapas pressupõem que você já criou um projeto do Google Cloud , concluiu as etapas de configuração no Guia de início rápido da Developer Device Platform e fez a autenticação com o gcloud no terminal.

Na linha de comando

Veja um resumo básico do resultado do teste ou do executável com este comando e seu ID de sessão:

gcloud beta device-run sessions describe SESSION_ID

O que retorna resultados semelhantes a:

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

Para cada ID de tipo de dispositivo especificado com a flag --device, um job é gerado na sessão. O índice do job vai seguir a ordem dos IDs do dispositivo. As falhas de teste são esperadas e precisam ser investigadas e resolvidas por meio de melhorias e execuções iterativas.

Para ver mais detalhes sobre uma sessão, anexe --full ao comando describe executado anteriormente, desta forma:

gcloud beta device-run sessions describe SESSION_ID --full

O que retorna resultados semelhantes a:

Instrumentação do 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

Executável do 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

XCTest do iOS

Confira a saída limpa real de gcloud beta device-run sessions describe SESSION_ID --full de uma execução do XCTest do iOS com todas as flags ativadas:

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

Nessa saída, encontre os arquivos extraídos do app em teste em .../artifacts/output.txt (sem com.example.app/Documents/).

No navegador da Web

Para ver todos os detalhes, carregue o URL do bucket que contém os resultados do teste na saída do teste. Ele deve ser parecido com: https://console.cloud.google.com/storage/browser/BUCKET_NAME/automation/sessions/SESSION_ID/

As sessões aparecem no seguinte formato de caminho no armazenamento: gs://BUCKET_NAME/automation/sessions/SESSION_ID/job-000/EXECUTION_ID/

Para procurar os registros na interface da Web do console do Google Cloud , siga estas etapas:

  1. Em um navegador, adicione o nome do projeto usado no comando gcloud config set project ao URL https://console.cloud.google.com/?project= e carregue a página.
  2. Abra o menu no canto superior esquerdo.
  3. Encontre o Cloud Storage.
  4. No menu de armazenamento, selecione Buckets.
  5. Na primeira coluna, clique no nome do projeto.
  6. Clique em Automação.
  7. Clique em Sessões.
  8. No campo Filtro, cole o ID da sessão da execução de teste mais recente (consulte a saída do teste).
  9. Clique no nome da sessão resultante.
  10. Selecione job-* para ver junit.xml (para execuções de instrumentação do Android e XCTest do iOS), que contém detalhes de resultados combinados de todas as execuções e casos de teste no job.
  11. Abra execution-* (ou execution-*-rerun-* quando as novas tentativas de teste instável estiverem configuradas com --flaky-test-attempts) para ver um detalhamento de cada execução ou fragmento individual. Dependendo do tipo de sessão e das flags configuradas, essa pasta pode conter vários artefatos, dependendo do tipo de sessão e das flags configuradas. Consulte Entender os resultados para mais detalhes.
  12. Acesse os URLs públicos e autenticados para entender os resultados.

Estrutura do arquivo

Analise os arquivos de registro no bucket do Cloud Storage para entender melhor a execução da sessão. A estrutura do arquivo é semelhante a:

Instrumentação do 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

Executável do 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

XCTest do iOS


-   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

Nessa saída, entenda o caminho extraído em artifacts/. Para --paths-to-pull=com.example.app:/Documents/output.txt, ao extrair do app em teste (AUT, na sigla em inglês), o serviço remove /Documents e coloca o arquivo diretamente em artifacts/output.txt (não artifacts/com.example.app/Documents/output.txt). Se extraído de um app adicional (--additional-apps), ele é colocado em artifacts/<bundle_id>-genfiles/output.txt.

Entenda os resultados

Para execuções de instrumentação do Android e XCTest do iOS, os arquivos junit.xml gerados na saída são arquivos XML JUnit padrão. Um junit.xml no nível da execução é gravado em cada diretório execution-*, e um junit.xml mesclado é gravado em cada diretório job-*. Esses arquivos contêm os resultados por método de teste, permitindo que você analise o status específico de aprovação ou falha, o tempo de execução e os rastreamentos de erros de cada método de teste individual. É possível integrar e analisar esses arquivos com a maioria dos sistemas de integração e entrega contínuas (CI/CD) e ferramentas de relatórios de teste.

Além dos resultados de teste estruturados, cada diretório execution-* contém registros e artefatos específicos da plataforma:

  • As execuções de instrumentação do Android incluem instrument.log para a saída bruta do executor de instrumentação e logcat.txt para o registro do sistema Android em todo o dispositivo. Quando ativado com --bugreport, --dumpsys ou --video, o diretório de execução também inclui bugreport.zip, dumpsys.txt e gravações de vídeo da tela.
  • As execuções de executáveis do Android incluem output.log, que captura a saída padrão (stdout) e o erro padrão (stderr) gravados pelo executável, e logcat.txt (coletado por padrão para cada job do Android), que captura o registro do sistema Android em todo o dispositivo, além de qualquer artefato opcional --bugreport, --dumpsys ou --video.
  • As execuções do XCTest para iOS incluem system.log (coletado por padrão para cada job do XCTest para iOS), que captura o syslog bruto do dispositivo iOS, e todos os relatórios de diagnóstico de falhas .ips se um processo falhar durante a execução do teste. Quando ativado com --video, cada vídeo de caso de teste de interface gravado é armazenado em testcases/TEST_CLASS/TEST_METHOD/video.mp4.
  • Os arquivos de dispositivo extraídos especificados com --paths-to-pull são armazenados na subpasta artifacts/ do diretório de execução.
    • Para execuções do Android, os arquivos extraídos preservam o caminho do dispositivo em artifacts/ (por exemplo, artifacts/sdcard/output.txt ou artifacts/data/local/tmp/results.json).
    • Para execuções do XCTest do iOS, os arquivos extraídos de um contêiner de dados do app usando --paths-to-pull=BUNDLE_ID:DEVICE_PATH são organizados por ID do pacote em artifacts/:
      • Se com.example.app for o app em teste, ele será salvo diretamente em artifacts/output.txt.
      • Se com.example.app for um app adicional (--additional-apps), ele será salvo em artifacts/com.example.app-genfiles/output.txt.

Documentação de apoio

A seguir

Em seguida, teste a API Device Streaming da Developer Device Platform.