La classe AndroidJUnitRunner
è un runner del test JUnit che
consente di eseguire test JUnit 4 con strumenti su dispositivi Android,
incluse quelle che utilizzano Espresso, UI Automator e Compose
framework di test.
L'esecutore del test gestisce il caricamento del pacchetto di test e dell'app in fase di test in un dispositivo, l'esecuzione dei test e la generazione di report sui risultati.
Questo runner del test supporta diverse attività di test comuni, tra cui:
Scrittura dei test JUnit
Il seguente snippet di codice mostra come scrivere una JUnit 4 con strumentazione
per verificare che l'operazione changeText
in ChangeTextBehavior
funziona correttamente:
Kotlin
@RunWith(AndroidJUnit4::class) // Only needed when mixing JUnit 3 and 4 tests @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) // Only needed when mixing JUnit 3 and 4 tests @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))); } }
Accedi al contesto dell'applicazione
Quando utilizzi AndroidJUnitRunner
per eseguire i test, puoi accedere al contesto
per l'app sottoposta a test richiamando il
Metodo ApplicationProvider.getApplicationContext()
. Se hai creato un account
di Application
nella tua app, questo metodo restituisce la tua
contesto della sottoclasse.
Se hai implementato gli strumenti, puoi accedere alle API di test di basso livello utilizzando
InstrumentationRegistry
. Questo corso include
Instrumentation
, l'oggetto app di destinazione Context
, il test
app Context
e gli argomenti della riga di comando passati nel test.
Filtra test
Nei test JUnit 4.x, puoi utilizzare le annotazioni per configurare l'esecuzione del test. Questo riduce al minimo la necessità di aggiungere boilerplate e codice condizionale nei test. Oltre alle annotazioni standard supportate dalla JUnit 4, il test runner supporta anche annotazioni specifiche per Android, incluse le seguenti:
@RequiresDevice
: specifica che il test deve essere eseguito solo su dispositivi fisici sui dispositivi, non sugli emulatori.@SdkSuppress
: impedisce l'esecuzione del test su un'API Android precedente livello rispetto a un determinato livello. Ad esempio, per sopprimere i test su tutti i livelli API a un livello inferiore 23, utilizza l'annotazione@SDKSuppress(minSdkVersion=23)
.@SmallTest
,@MediumTest
e@LargeTest
: classifica la durata di un test per l'esecuzione e, di conseguenza, la frequenza con cui puoi eseguire il test. Tu puoi usare questa annotazione per filtrare i test da eseguire, impostandoandroid.testInstrumentationRunnerArguments.size
proprietà:
-Pandroid.testInstrumentationRunnerArguments.size=small
Test di shard
Se devi caricare in contemporanea l'esecuzione dei test, condividili tra
più server per velocizzare l'esecuzione, puoi suddividerli in gruppi o
shards. L'esecutore del test supporta la suddivisione di una singola suite di test in più
di sharding, quindi puoi facilmente eseguire test appartenenti allo stesso shard insieme ad
gruppo. Ogni shard è identificato da un numero di indice. Quando esegui i test, utilizza
-e numShards
per specificare il numero di shard separati da creare e il
-e shardIndex
per specificare quale shard eseguire.
Ad esempio, per suddividere la suite di test in 10 shard ed eseguire solo i test raggruppate nel secondo shard, utilizza il seguente comando adb:
adb shell am instrument -w -e numShards 10 -e shardIndex 2
Utilizza Android Test Orchestrator
Android Test Orchestrator ti consente di eseguire tutti i test della tua app all'interno del proprio
chiamata di Instrumentation
. Quando si utilizza AndroidJUnitRunner versione 1.0
o superiore, hai accesso ad Android Test Orchestrator.
Android Test Orchestrator offre i seguenti vantaggi per i test questo ambiente:
- Stato condiviso minimo: ogni test viene eseguito nel proprio
Instrumentation
in esecuzione in un'istanza Compute Engine. Di conseguenza, 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 tutti gli stati condivisi dalla CPU e dalla memoria del dispositivo dopo ogni usa il flagclearPackageData
. Vedi la sezione Abilita da Gradle per vedere un esempio. - Gli arresti anomali sono isolati: anche se un test si arresta in modo anomalo, elimina solo i relativi
di
Instrumentation
. Ciò significa che gli altri test la suite continua a funzionare, fornendo risultati di test completi.
Questo isolamento determina 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 dispongono di Android Test Orchestrator preinstallata, ma devi attivarla in Android Google Studio.
Abilita da Gradle
Per abilitare Android Test Orchestrator utilizzando lo strumento a riga di comando Gradle, completa questi passaggi:
- Passaggio 1: modifica il file Gradle. Aggiungi le seguenti dichiarazioni ai tuoi
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 utilizzando questo comando:
./gradlew connectedCheck
Abilita da Android Studio
Per attivare Android Test Orchestrator in Android Studio, aggiungi le istruzioni mostrate
in Abilita da Gradle al file build.gradle
della tua app.
Abilita dalla riga di comando
Per utilizzare Android Test Orchestrator dalla riga di comando, esegui questi 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 mostra la sintassi del comando, devi installare Android Test Orchestrator e utilizzarlo .
adb shell pm list instrumentation
Utilizzo di diverse toolchain
Se utilizzi una catena di strumenti diversa per testare la tua app, puoi comunque usare Android Testa Orchestrator svolgendo i seguenti passaggi:
- Includi i pacchetti necessari nel file di build della tua app.
- Attiva Android Test Orchestrator dalla riga di comando.
Architettura
L'APK del servizio Orchestrator viene memorizzato in un processo separato da quello l'APK di test e l'APK dell'app sottoposta a test:
Android Test Orchestrator raccoglie i test JUnit all'inizio del test
suite, ma poi esegue ogni test separatamente, nella propria istanza
Instrumentation
.
Ulteriori informazioni
Per scoprire di più sull'uso di AndroidJUnitRunner, consulta il riferimento API.
Risorse aggiuntive
Per ulteriori informazioni sull'utilizzo di AndroidJUnitRunner
, consulta le seguenti risorse
Google Cloud.
Campioni
- AndroidJunitRunnerSample: mostra annotazioni di test, test con parametri e creazione della suite di test.