Trovare i risultati del test della piattaforma dispositivo per sviluppatori

Questa guida descrive come trovare i risultati dei test e degli eseguibili attivati seguendo la guida Developer Device Platform Device Run.

Prima di iniziare

Questi passaggi presuppongono che tu abbia già creato un Google Cloud progetto, completato i passaggi di configurazione nella Developer Device Platform Guida rapida ed eseguito l'autenticazione con gcloud nel terminale.

Nella riga di comando

Visualizza un riepilogo di base del risultato del test o dell'eseguibile con questo comando e l'ID sessione:

gcloud beta device-run sessions describe SESSION_ID

Che restituisce risultati simili 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

Per ogni ID tipo di dispositivo specificato con il flag --device, viene generato un job nella sessione. L'indice del job seguirà l'ordine degli ID dispositivo. È previsto che si verifichino errori nei test, che devono essere esaminati e risolti tramite miglioramenti ed esecuzioni iterativi.

Per ottenere ulteriori dettagli su una sessione, aggiungi --full al comando describe eseguito in precedenza, come segue:

gcloud beta device-run sessions describe SESSION_ID --full

Che restituisce risultati simili a:

Strumentazione 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

Eseguibile 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 per iOS

Di seguito è riportato l'output effettivo sanificato di gcloud beta device-run sessions describe SESSION_ID --full da un'esecuzione live di XCTest per iOS con tutti i flag abilitati:

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

In questo output, trova i file estratti per l'app in fase di test in .../artifacts/output.txt (senza com.example.app/Documents/).

Nel browser web

Per visualizzare tutti i dettagli, carica l'URL del bucket contenente i risultati dei test dall'output dei test. Dovrebbe essere simile a: https://console.cloud.google.com/storage/browser/BUCKET_NAME/automation/sessions/SESSION_ID/

Le sessioni vengono visualizzate nel seguente formato di percorso nello spazio di archiviazione: gs://BUCKET_NAME/automation/sessions/SESSION_ID/job-000/EXECUTION_ID/

Per sfogliare i log nell'interfaccia web della Google Cloud console, segui questi passaggi:

  1. In un browser, aggiungi il nome del progetto utilizzato nel comando gcloud config set project all'URL https://console.cloud.google.com/?project= e carica la pagina.
  2. Espandi il menu in alto a sinistra.
  3. Trova Cloud Storage.
  4. Dal menu di archiviazione, seleziona Bucket.
  5. Nella prima colonna, fai clic sul nome del progetto.
  6. Fai clic su Automazione.
  7. Fai clic su Sessioni.
  8. Nel campo Filtra, incolla l'ID sessione dell'ultima esecuzione del test (vedi l'output del test).
  9. Fai clic sul nome della sessione risultante.
  10. Seleziona job-* per visualizzare junit.xml (per le esecuzioni di strumentazione Android e iOS XCTest), che contiene i dettagli dei risultati uniti di tutte le esecuzioni e gli scenari di test nel job.
  11. Apri execution-* (o execution-*-rerun-* quando i tentativi di ripetizione dei test instabili sono configurati con --flaky-test-attempts) per una suddivisione di ogni singola esecuzione o shard. A seconda del tipo di sessione e dei flag configurati, questa cartella può contenere numerosi artefatti. Per ulteriori dettagli, consulta Come capire i risultati.
  12. Visita gli URL pubblici e autenticati per comprendere i risultati.

Struttura dei file

Esplora i file di log nel bucket Cloud Storage per saperne di più sull'esecuzione della sessione. La struttura dei file è simile a:

Strumentazione 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

Eseguibile 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 per 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

In questo output, comprendi il percorso estratto in artifacts/. Per --paths-to-pull=com.example.app:/Documents/output.txt, quando esegui l'estrazione dall' app in fase di test, il servizio rimuove /Documents e inserisce il file direttamente in artifacts/output.txt (non artifacts/com.example.app/Documents/output.txt). Se estratto da un'app aggiuntiva (--additional-apps), viene inserito in artifacts/<bundle_id>-genfiles/output.txt.

Come capire i risultati

Per le esecuzioni di strumentazione Android e XCTest per iOS, i file junit.xml generati nell'output sono file XML JUnit standard. Un file junit.xml a livello di esecuzione viene scritto in ogni directory execution-* e un file junit.xml unito viene scritto in ogni directory job-*. Questi file contengono i risultati per metodo di test, consentendoti di esaminare lo stato di superamento o errore specifico, il tempo di esecuzione e le tracce di errore per ogni singolo metodo di test. Puoi integrare e analizzare facilmente questi file con la maggior parte dei sistemi di integrazione e distribuzione continue (CI/CD) e degli strumenti di generazione di report sui test.

Oltre ai risultati dei test strutturati, ogni directory execution-* contiene log e artefatti specifici della piattaforma:

  • Le esecuzioni di strumentazione Android includono instrument.log per l'output non elaborato dell'esecutore di strumentazione e logcat.txt per il log di sistema Android a livello di dispositivo. Se abilitata con --bugreport, --dumpsys o --video, la directory di esecuzione include anche bugreport.zip, dumpsys.txt e le registrazioni video dello schermo.
  • Le esecuzioni di eseguibili Android includono output.log, che acquisisce l' output standard (stdout) e l'errore standard (stderr) scritti dall' eseguibile, e logcat.txt (raccolto per impostazione predefinita per ogni job Android), che acquisisce il log di sistema Android a livello di dispositivo, insieme a eventuali artefatti --bugreport, --dumpsys o --video facoltativi.
  • Le esecuzioni di XCTest per iOS includono system.log (raccolto per impostazione predefinita per ogni job XCTest per iOS), che acquisisce il syslog del dispositivo iOS non elaborato, e tutti i report di Crash Reporting diagnostici .ips se un processo si è arrestato in modo anomalo durante l'esecuzione del test.
  • I file del dispositivo estratti specificati con --paths-to-pull vengono archiviati nella sottocartella artifacts/ della directory di esecuzione.
    • Per le esecuzioni Android, i file estratti conservano il percorso del dispositivo in artifacts/ (ad esempio, artifacts/sdcard/output.txt o artifacts/data/local/tmp/results.json).
    • Per le esecuzioni di XCTest per iOS, i file estratti da un container di dati dell'app utilizzando --paths-to-pull=BUNDLE_ID:DEVICE_PATH sono organizzati per ID pacchetto in artifacts/:
      • Se com.example.app è l'app in fase di test, viene salvata direttamente in artifacts/output.txt.
      • Se com.example.app è un'app aggiuntiva (--additional-apps), viene salvata in artifacts/com.example.app-genfiles/output.txt.

Documentazione di supporto

Passaggi successivi

Ora prova la nostra API Device Streaming della Developer Device Platform.