Test dalla riga di comando

Questo documento descrive come eseguire i test direttamente dalla riga di comando. Questo documento presuppone che tu sappia già come creare un'app per Android e scrivere test per la tua app. Per ulteriori informazioni su come creare test per la tua app, consulta Testare le app su Android.

Gli strumenti a riga di comando e le attività Gradle descritte in questa pagina sono indipendenti dal toolkit UI. Se vuoi scrivere test UI per Compose, consulta Testare il layout di Compose. Dopo aver scritto i test, continua con questa guida per eseguirli dal terminale o dall'ambiente di integrazione continua remoto.

Quando crei l'app utilizzando il sistema di compilazione Gradle, il plug-in Android per Gradle ti consente di eseguire i test dal progetto Gradle utilizzando la riga di comando. Per un controllo più preciso, puoi scegliere di eseguire i test tramite una shell Android Debug Bridge (adb). Questa opzione può essere utile quando esegui i test in un ambiente di integrazione continua.

Per scoprire come eseguire test di instrumentazione automatizzati dalla riga di comando utilizzando i dispositivi virtuali gestiti da Gradle, consulta Scalare i test con i dispositivi gestiti da Gradle.

Eseguire i test con Gradle

Il plug-in Android per Gradle ti consente di eseguire i test dal progetto Gradle utilizzando la riga di comando.

La tabella seguente riassume come eseguire i test con Gradle:

Tabella 1. Diversi modi per eseguire i test con Gradle

Tipo di test delle unità Comando da eseguire Posizione dei risultati dei test
Test delle unità locale Esegui l'attività test:

./gradlew test
File dei risultati dei test HTML:
path_to_your_project/module_name/build/reports/tests/ directory.

File dei risultati dei test XML:
path_to_your_project/module_name/build/test-results/ directory.

Test delle unità di instrumentazione Esegui l'attività connectedAndroidTest:

./gradlew connectedAndroidTest
File dei risultati dei test HTML:
path_to_your_project/module_name/build/reports/androidTests/connected/ directory.

File dei risultati dei test XML:
path_to_your_project/module_name/build/outputs/androidTest-results/connected/ directory.

Gradle supporta le abbreviazioni dei nomi delle attività. Ad esempio, puoi avviare l'attività connectedAndroidTest inserendo il seguente comando:

./gradlew cAT

Puoi anche scegliere di eseguire le attività Gradle check e connectedCheck. Queste attività eseguono rispettivamente i test locali o di instrumentazione, ma includono altri controlli aggiunti da altri plug-in Gradle.

Eseguire i test su un modulo

Le attività test e connectedAndroidTest eseguono i test su ogni modulo del progetto. Puoi eseguire i test su un modulo specifico anteponendo il nome del modulo e i due punti (:) all'attività test o connectedAndroidTest. Ad esempio, il seguente comando esegue i test di instrumentazione solo per il modulo mylibrary:

./gradlew mylibrary:connectedAndroidTest

Eseguire i test su una variante di compilazione

Le attività test e connectedAndroidTest eseguono i test su ogni variante di compilazione del progetto. Puoi scegliere come target una variante di build specifica utilizzando la seguente sintassi:

  • Per i test delle unità locali:
    ./gradlew testVariantNameUnitTest
  • Per i test di instrumentazione:
    ./gradlew connectedVariantNameAndroidTest

Eseguire metodi o classi di test specifici

Quando esegui i test delle unità locali, Gradle ti consente di scegliere come target test specifici utilizzando il flag --tests. Ad esempio, il seguente comando esegue solo i test sampleTestMethod per la variante di compilazione specificata. Per saperne di più sull'utilizzo del flag --tests, consulta la documentazione di Gradle sul filtraggio dei test.


./gradlew testVariantNameUnitTest --tests '*.sampleTestMethod'

Eseguire i test con adb

Quando esegui i test dalla riga di comando con Android Debug Bridge (adb), hai più opzioni per scegliere i test da eseguire rispetto a qualsiasi altro metodo. Puoi selezionare singoli metodi di test, filtrare i test in base a un'annotazione personalizzata o specificare le opzioni di test. Poiché l'esecuzione dei test è controllata interamente dalla riga di comando, puoi personalizzare i test con gli script della shell in vari modi.

Per eseguire un test dalla riga di comando, esegui adb shell per avviare una shell della riga di comando sul dispositivo o sull'emulatore. All'interno della shell puoi interagire con il Activity Manager utilizzando il comando am e il relativo sottocomando instrument per eseguire i test.

In alternativa, puoi avviare una shell adb, chiamare am instrument e specificare i flag della riga di comando in un'unica riga di input. La shell si apre sul dispositivo o sull'emulatore, esegue i test, produce l'output e poi torna alla riga di comando sul computer.

Per eseguire un test con am instrument:

  1. Crea o ricrea l'applicazione principale e il pacchetto di test.
  2. Installa i file del pacchetto Android (file APK) del pacchetto di test e dell'applicazione principale sul dispositivo o sull'emulatore Android corrente.
  3. Nella riga di comando, inserisci:

    adb shell am instrument -w <test_package_name>/<runner_class>

    Dove <test_package_name> è il nome del pacchetto Android dell'applicazione di test e <runner_class> è il nome della classe di esecuzione dei test Android che stai utilizzando. Il nome del pacchetto Android è il valore dell'attributo package dell'elemento manifest nel file manifest del pacchetto di test (AndroidManifest.xml).

    La classe di esecuzione dei test Android è in genere AndroidJUnitRunner:

    adb shell am instrument -w com.android.example/androidx.test.runner.AndroidJUnitRunner

I risultati dei test vengono visualizzati in STDOUT.

Flag di am instrument

Per trovare un elenco di tutti i flag da utilizzare con il comando am instrument, esegui adb shell am help. Alcuni flag importanti sono descritti nella tabella seguente:

Tabella 2. Flag importanti di am instrument

Flag Valore Descrizione
-w (nessuno) Forza am instrument ad attendere il termine dell'instrumentazione prima di terminare. In questo modo, la shell rimane aperta fino al termine dei test. Questo flag è obbligatorio per visualizzare i risultati dei test.
-r (nessuno) Restituisce i risultati in formato non elaborato. Utilizza questo flag quando vuoi raccogliere le misurazioni del rendimento in modo che non vengano formattate come risultati dei test. Questo flag è progettato per essere utilizzato con il flag -e perf true (documentato nella sezione Opzioni di am instrument).
-e <test_options> Fornisce le opzioni di test come coppie chiave-valore. Lo am instrument strumento le passa alla classe di instrumentazione specificata utilizzando il metodo onCreate(). Puoi specificare più occorrenze di -e <test_options>. Le chiavi e i valori sono descritti nella sezione Opzioni di am instrument. Puoi utilizzare queste coppie chiave-valore solo con AndroidJUnitRunner. L'utilizzo con qualsiasi altra classe non ha alcun effetto.
--no-hidden-api-checks (nessuno) Disattiva le limitazioni all'utilizzo delle API nascoste. Per ulteriori informazioni su cosa sono le API nascoste e su come possono influire sulla tua app, consulta Limitazioni relative alle interfacce non SDK.

Opzioni di am instrument

Lo strumento am instrument passa le opzioni di test a AndroidJUnitRunner o InstrumentationTestRunner sotto forma di coppie chiave-valore, utilizzando il flag -e, con questa sintassi:

-e <key> <value>

Alcune chiavi accettano più valori. Specifica più valori in un elenco separato da virgole. Ad esempio, questa chiamata di AndroidJUnitRunner fornisce più valori per la chiave package:

adb shell am instrument -w -e package com.android.test.package1,com.android.test.package2 \
> com.android.test/androidx.test.runner.AndroidJUnitRunner

La tabella seguente elenca le coppie chiave-valore che puoi utilizzare con l'esecuzione dei test:

Tabella 3. Coppie chiave-valore del flag -e da utilizzare con l'esecuzione dei test

Chiave Valore Descrizione
package <Java_package_name> Il nome del pacchetto Java completo per uno dei pacchetti nell'applicazione di test. Viene eseguita qualsiasi classe di scenari di test che utilizza questo nome di pacchetto. Tieni presente che non si tratta di un Android nome di pacchetto; un pacchetto di test ha un singolo nome di pacchetto Android, ma può contenere diversi pacchetti Java.
class <class_name> Il nome della classe Java completo per una delle classi di scenari di test. Viene eseguita solo questa classe di scenari di test.
<class_name>#method name Un nome di classe di scenari di test completo e uno dei relativi metodi. Viene eseguito solo questo metodo. Nota il simbolo di cancelletto (#) tra il nome della classe e il nome del metodo.
size [small | medium | large] Esegue un metodo di test annotato per dimensione. Le annotazioni sono @SmallTest, @MediumTest e @LargeTest.
debug true Esegue i test in modalità di debug.
log true Carica e registra tutti i test specificati, ma non li esegue. Le informazioni sui test vengono visualizzate in STDOUT. Utilizza questa opzione per verificare combinazioni di altri filtri e specifiche di test.
emma true Esegue un'analisi della copertura del codice EMMA e scrive l'output in /data/<app_package>/coverage.ec sul dispositivo. Per sostituire la posizione del file, utilizza la coverageFile chiave descritta nella voce seguente.

Nota: questa opzione richiede una build dell'applicazione di test con instrumentazione EMMA, che puoi generare con il coverage target.

coverageFile <filename> Sostituisce la posizione predefinita del file di copertura EMMA sul dispositivo. Specifica questo valore come percorso e nome file in formato UNIX. Il nome file predefinito è descritto nella voce relativa alla emma chiave.

Quando utilizzi il flag -e, tieni presente quanto segue:

  • am instrument richiama onCreate(Bundle) con un Bundle contenente le coppie chiave-valore.
  • La chiave package ha la precedenza sulla chiave class. Se specifichi un pacchetto e poi separatamente una classe all'interno di quel pacchetto, Android esegue tutti i test nel pacchetto e ignora la chiave della classe.
  • La chiave func e la chiave unit si escludono a vicenda.

Esempi di utilizzo

Le sezioni seguenti forniscono esempi di utilizzo di am instrument per eseguire i test. Si basano sulla seguente struttura:

  • Il pacchetto di test ha il nome del pacchetto Android com.android.demo.app.tests.
  • Due classi di test di instrumentazione:
    • TestClass1, che contiene il metodo di test testMethod1.
    • TestClass2, che contiene i metodi di test testMethod2 e testMethod3.
  • L'esecuzione dei test è AndroidJUnitRunner.

Eseguire l'intero pacchetto di test

Per eseguire tutte le classi di test nel pacchetto di test, inserisci:

adb shell am instrument -w com.android.demo.app.tests/androidx.test.runner.AndroidJUnitRunner

Eseguire tutti i test in una classe di scenari di test

Per eseguire tutti i test nella classe TestClass1, inserisci:

adb shell am instrument -w  \
> -e class com.android.demo.app.tests.TestClass1 \
> com.android.demo.app.tests/androidx.test.runner.AndroidJUnitRunner

Selezionare un sottoinsieme di test

Per eseguire tutti i test nella classe TestClass1 e il metodo testMethod3 in TestClass2, inserisci:

adb shell am instrument -w \
> -e class com.android.demo.app.tests.TestClass1,com.android.demo.app.tests.TestClass2#testMethod3 \
> com.android.demo.app.tests/androidx.test.runner.AndroidJUnitRunner

Puoi trovare altri casi d'uso nella AndroidJUnitRunner documentazione di riferimento dell'API.

Visualizzare i report di test unificati

Il plug-in Android per Gradle fornisce attività di report di test unificati, che generano dashboard HTML che uniscono i risultati dei test delle unità e di instrumentazione.

Prerequisiti

  • Plug-in Android per Gradle 9.2.0-alpha07 o versioni successive.

Per generare report di test unificati, esegui una delle seguenti attività:

Ambito del report Comando Descrizione Posizione del report
Modulo corrente ./gradlew :module_name:createTestReport Genera un report di test unificato per il modulo corrente, unendo i risultati dei test delle unità e di instrumentazione. path_to_your_project/module_name/build/reports/tests/test-report/
Modulo corrente e dipendenze ./gradlew :module_name:createAggregatedTestReport Genera un report di test unificato per il modulo dell'app corrente e le relative dipendenze della libreria. path_to_your_project/module_name/build/reports/tests/aggregated-test-report/