AndroidJUnitRunner

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

  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 viene archiviato in un processo separato dall'APK di test e dall'APK dell'app in test:

L&#39;orchestratore ti 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 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