La classe AndroidJUnitRunner
è un programma di test JUnit che consente di eseguire test JUnit 4 instrumentati su dispositivi Android, inclusi quelli che utilizzano i framework di test Espresso, UI Automator e Compose.
Il programma di test gestisce il caricamento del pacchetto di test e dell'app in test su un dispositivo, l'esecuzione dei test e la generazione di report sui risultati.
Questo programma di test supporta diverse attività di test comuni, tra cui:
Scrivere test JUnit
Il seguente snippet di codice mostra come scrivere un test JUnit 4 instrumentato per verificare che l'operazione changeText
nella classe ChangeTextBehavior
funzioni correttamente:
Kotlin
@RunWith(AndroidJUnit4::class) @LargeTest // Optional runner annotation class ChangeTextBehaviorTest { val stringToBeTyped = "Espresso" // ActivityTestRule accesses context through the runner @get:Rule val activityRule = ActivityTestRule(MainActivity::class.java) @Test fun changeText_sameActivity() { // Type text and then press the button. onView(withId(R.id.editTextUserInput)) .perform(typeText(stringToBeTyped), closeSoftKeyboard()) onView(withId(R.id.changeTextBt)).perform(click()) // Check that the text was changed. onView(withId(R.id.textToBeChanged)) .check(matches(withText(stringToBeTyped))) } }
Java
@RunWith(AndroidJUnit4.class) @LargeTest // Optional runner annotation public class ChangeTextBehaviorTest { private static final String stringToBeTyped = "Espresso"; @Rule public ActivityTestRule<MainActivity>; activityRule = new ActivityTestRule<>;(MainActivity.class); @Test public void changeText_sameActivity() { // Type text and then press the button. onView(withId(R.id.editTextUserInput)) .perform(typeText(stringToBeTyped), closeSoftKeyboard()); onView(withId(R.id.changeTextBt)).perform(click()); // Check that the text was changed. onView(withId(R.id.textToBeChanged)) .check(matches(withText(stringToBeTyped))); } }
Accedere al contesto dell'applicazione
Quando utilizzi AndroidJUnitRunner
per eseguire i test, puoi accedere al contesto
per l'app in test chiamando il metodo statico
ApplicationProvider.getApplicationContext()
. Se hai creato una sottoclasse personalizzata di Application
nella tua app, questo metodo restituisce il contesto della sottoclasse personalizzata.
Se sei un implementatore di strumenti, puoi accedere alle API di test di basso livello utilizzando la classe
InstrumentationRegistry
. Questo gruppo include l'oggetto Instrumentation
, l'oggetto app di destinazione Context
, l'oggetto app di test Context
e gli argomenti della riga di comando passati al test.
Filtrare i test
Nei test JUnit 4.x, puoi utilizzare le annotazioni per configurare l'esecuzione del test. Questa funzionalità riduce al minimo la necessità di aggiungere codice boilerplate e condizionale ai test. Oltre alle annotazioni standard supportate da JUnit 4, il test runner supporta anche le annotazioni specifiche per Android, tra cui:
@RequiresDevice
: specifica che il test deve essere eseguito solo su dispositivi fisici, non su emulatori.@SdkSuppress
: impedisce l'esecuzione del test su un livello API Android inferiore rispetto a quello specificato. Ad esempio, per impedire l'esecuzione dei test su tutti i livelli API inferiori a 23, utilizza l'annotazione@SDKSuppress(minSdkVersion=23)
.@SmallTest
,@MediumTest
e@LargeTest
: classificano il tempo necessario per eseguire un test e, di conseguenza, la frequenza con cui puoi eseguirlo. Puoi utilizzare questa annotazione per filtrare i test da eseguire impostando la proprietàandroid.testInstrumentationRunnerArguments.size
:
-Pandroid.testInstrumentationRunnerArguments.size=small
Test dei frammenti
Se devi eseguire in parallelo i test, condividendoli su più server per velocizzarli, puoi suddividerli in gruppi o shard. Il programma di esecuzione dei test supporta la suddivisione di una singola suite di test in più frammenti, in modo da poter eseguire facilmente i test appartenenti allo stesso frammento come gruppo. Ogni shard è identificato da un numero di indice. Quando esegui i test, utilizza l'opzione
-e numShards
per specificare il numero di frammenti separati da creare e l'opzione
-e shardIndex
per specificare il frammento da eseguire.
Ad esempio, per suddividere la suite di test in 10 shard ed eseguire solo i test agrupati nel secondo shard, utilizza il seguente comando adb:
adb shell am instrument -w -e numShards 10 -e shardIndex 2
Utilizzare Android Test Orchestrator
Android Test Orchestrator ti consente di eseguire ogni test della tua app all'interno della sua chiamata di Instrumentation
. Se utilizzi AndroidJUnitRunner versione 1.0 o successive, hai accesso ad Android Test Orchestrator.
Android Test Orchestrator offre i seguenti vantaggi per il tuo ambiente di test:
- Stato condiviso minimo:ogni test viene eseguito nella propria istanza
Instrumentation
. Pertanto, se i test condividono lo stato dell'app, la maggior parte di questo stato condiviso viene rimossa dalla CPU o dalla memoria del dispositivo dopo ogni test. Per rimuovere tutto lo stato condiviso dalla CPU e dalla memoria del dispositivo dopo ogni test, utilizza il flagclearPackageData
. Per un esempio, consulta la sezione Attiva da Gradle. - Gli arresti anomali sono isolati: anche se un test si arresta in modo anomalo, viene interrotta solo la sua istanza di
Instrumentation
. Ciò significa che gli altri test della suite vengono comunque eseguiti, fornendo risultati completi.
Questo isolamento comporta un possibile aumento del tempo di esecuzione del test poiché Android Test Orchestrator riavvia l'applicazione dopo ogni test.
Sia Android Studio che Firebase Test Lab hanno Android Test Orchestrator preinstallato, ma devi attivare la funzionalità in Android Studio.
Attiva da Gradle
Per attivare Android Test Orchestrator utilizzando lo strumento a riga di comando Gradle, completa i seguenti passaggi:
- Passaggio 1: modifica il file gradle. Aggiungi le seguenti istruzioni al
file
build.gradle
del progetto:
android {
defaultConfig {
...
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// The following argument makes the Android Test Orchestrator run its
// "pm clear" command after each test invocation. This command ensures
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
}
testOptions {
execution 'ANDROIDX_TEST_ORCHESTRATOR'
}
}
dependencies {
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestUtil 'androidx.test:orchestrator:1.1.0'
}
- Passaggio 2: esegui Android Test Orchestrator con il seguente comando:
./gradlew connectedCheck
Attivare da Android Studio
Per attivare Android Test Orchestrator in Android Studio, aggiungi le istruzioni mostrate in Attiva da Gradle al file build.gradle
della tua app.
Attivare dalla riga di comando
Per utilizzare Android Test Orchestrator sulla riga di comando, esegui i seguenti comandi in una finestra del terminale:
DEVICE_API_LEVEL=$(adb shell getprop ro.build.version.sdk)
FORCE_QUERYABLE_OPTION=""
if [[ $DEVICE_API_LEVEL -ge 30 ]]; then
FORCE_QUERYABLE_OPTION="--force-queryable"
fi
# uninstall old versions
adb uninstall androidx.test.services
adb uninstall androidx.test.orchestrator
# Install the test orchestrator.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/orchestrator/1.4.2/orchestrator-1.4.2.apk
# Install test services.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/services/test-services/1.4.2/test-services-1.4.2.apk
# Replace "com.example.test" with the name of the package containing your tests.
# Add "-e clearPackageData true" to clear your app's data in between runs.
adb shell 'CLASSPATH=$(pm path androidx.test.services) app_process / \
androidx.test.services.shellexecutor.ShellMain am instrument -w -e \
targetInstrumentation com.example.test/androidx.test.runner.AndroidJUnitRunner \
androidx.test.orchestrator/.AndroidTestOrchestrator'
Come mostrato dalla sintassi del comando, devi installare Android Test Orchestrator e poi utilizzarlo direttamente.
adb shell pm list instrumentation
Utilizzo di toolchain diverse
Se utilizzi una toolchain diversa per testare la tua app, puoi comunque utilizzare Android Test Orchestrator completando i seguenti passaggi:
- Includi i pacchetti necessari nel file di build dell'app.
- Attiva Android Test Orchestrator dalla riga di comando.
Architettura
L'APK del servizio Orchestrator viene archiviato in un processo separato dall'APK di test e dall'APK dell'app in test:
Android Test Orchestrator raccoglie i test JUnit all'inizio dell'esecuzione della suite di test, ma poi esegue ogni test separatamente nella propria istanza di Instrumentation
.
Ulteriori informazioni
Per scoprire di più sull'utilizzo di AndroidJUnitRunner, consulta il riferimento all'API.
Risorse aggiuntive
Per ulteriori informazioni sull'utilizzo di AndroidJUnitRunner
, consulta le seguenti risorse.
Campioni
- AndroidJunitRunnerSample: mostra le annotazioni dei test, i test con parametri e la creazione di suite di test.