La classe AndroidJUnitRunner
è un esecutore di test JUnit che
consente di eseguire test strumentati JUnit 4 su dispositivi Android,
inclusi quelli che utilizzano i framework di test Espresso, UI Automator e Compose.
L'esecutore del test gestisce il caricamento del pacchetto di test e dell'app sottoposta a test su un dispositivo, nonché l'esecuzione dei test e la generazione di report sui risultati dei test.
Questo esecutore del test supporta diverse attività di test comuni, tra cui:
Scrittura test JUnit
Il seguente snippet di codice mostra come scrivere un test strumentato JUnit 4 per convalidare il corretto funzionamento dell'operazione changeText
nella classe ChangeTextBehavior
:
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 dell'app sottoposta a test chiamando il metodo ApplicationProvider.getApplicationContext()
statico. Se hai creato una sottoclasse personalizzata di Application
nella tua app, questo metodo restituisce il contesto della sottoclasse personalizzata.
Se sei un implementatore degli strumenti, puoi accedere alle API di test di basso livello utilizzando la classe InstrumentationRegistry
. Questa classe include l'oggetto Instrumentation
, l'oggetto Context
dell'app target, l'oggetto Context
dell'app test e gli argomenti della riga di comando passati al test.
Filtra 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 codice condizionale nei test. Oltre alle annotazioni standard supportate da JUnit 4, l'esecutore del test 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 eliminare l'esecuzione dei test su tutti i livelli API inferiori a 23, utilizza l'annotazione@SDKSuppress(minSdkVersion=23)
.@SmallTest
,@MediumTest
e@LargeTest
: classifica la durata di un test e, di conseguenza, la frequenza con cui è possibile eseguirlo. Puoi utilizzare questa annotazione per filtrare i test da eseguire, impostando la proprietàandroid.testInstrumentationRunnerArguments.size
:
-Pandroid.testInstrumentationRunnerArguments.size=small
Test shard
Se hai bisogno di caricare in contemporanea l'esecuzione dei test, condividendoli tra
più server per accelerarne l'esecuzione, puoi suddividerli in gruppi o
shard. L'esecutore del test supporta la suddivisione di una singola suite di test in più shard, in modo da poter eseguire facilmente insieme come gruppo i test appartenenti allo stesso shard. Ogni shard è identificato da un numero di indice. Quando esegui i test, utilizza l'opzione -e numShards
per specificare il numero di shard separati da creare e l'opzione -e shardIndex
per specificare lo shard da eseguire.
Ad esempio, per suddividere la suite di test in 10 shard ed eseguire solo i test raggruppati 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 ciascuno dei test della tua app all'interno delle sue
chiamate a Instrumentation
. Se utilizzi AndroidJUnitRunner versione 1.0 o successiva, 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
. Di conseguenza, se i test condividono lo stato dell'app, la maggior parte di questo stato 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 Attivazione da Gradle. - Gli arresti anomali sono isolati: anche se un test si arresta in modo anomalo, rimuove solo la propria istanza di
Instrumentation
. Ciò significa che gli altri test della suite continuano a essere eseguiti, fornendo risultati di test completi.
Questo isolamento determina un possibile aumento del tempo di esecuzione dei test quando Android Test Orchestrator riavvia l'applicazione dopo ogni test.
Android Test Orchestrator è preinstallato su Android Studio e Firebase Test Lab, ma devi abilitare 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 tuo 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 eseguendo questo comando:
./gradlew connectedCheck
Abilita da Android Studio
Per attivare Android Test Orchestrator in Android Studio, aggiungi le istruzioni mostrate in Attivare da Gradle al file build.gradle
della tua app.
Attiva dalla riga di comando
Per utilizzare Android Test Orchestrator nella 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 per poi utilizzarlo direttamente.
adb shell pm list instrumentation
Utilizzo di Toolchain diverse
Se utilizzi una Toolchain diversa per testare l'app, puoi comunque utilizzare Android Test Orchestrator svolgendo 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 è archiviato in un processo separato dall'APK di test e dall'APK dell'app sottoposta a test:
Android Test Orchestrator raccoglie i test JUnit all'inizio dell'esecuzione della suite di test, ma ogni test viene eseguito separatamente nella propria istanza di Instrumentation
.
Altre informazioni
Per scoprire di più sull'utilizzo di AndroidJUnitRunner, consulta la documentazione di riferimento sulle API.
Risorse aggiuntive
Per ulteriori informazioni sull'utilizzo di AndroidJUnitRunner
, consulta le seguenti risorse.
Samples
- AndroidJunitRunnerSample: mostra annotazioni di test, test parametrizzati e creazione di suite di test.