AndroidJUnitRunner

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

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

Strumento di orchestrazione consente di controllare i test JUnit
Figura 1: struttura dell'APK Android Test Orchestration.

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