AndroidJUnitRunner

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 flag clearPackageData. 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:

  1. Includi i pacchetti necessari nel file di build dell'app.
  2. 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:

L&#39;agente di orchestrazione consente di controllare i test JUnit
Figura 1: struttura dell'APK di Android Test Orchestration.

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