AndroidJUnitRunner

Die Klasse AndroidJUnitRunner ist ein JUnit-Test-Runner, mit dem Sie instrumentierte JUnit 4-Tests auf Android-Geräten ausführen können, einschließlich der Test-Frameworks Espresso, UI Automator und Compose.

Der Test-Runner übernimmt das Laden des Testpakets und der zu testenden Anwendung auf ein Gerät, die Ausführung der Tests und das Melden der Testergebnisse.

Dieser Test-Runner unterstützt mehrere gängige Testaufgaben, darunter:

JUnit-Tests schreiben

Das folgende Code-Snippet zeigt, wie Sie einen instrumentierten JUnit 4-Test schreiben, um zu validieren, dass der changeText-Vorgang in der Klasse ChangeTextBehavior korrekt funktioniert:

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)));
    }
}

Auf den Kontext der Anwendung zugreifen

Wenn Sie Ihre Tests mit AndroidJUnitRunner ausführen, können Sie mit der statischen Methode ApplicationProvider.getApplicationContext() auf den Kontext für die zu testende Anwendung zugreifen. Wenn Sie in Ihrer Anwendung eine benutzerdefinierte Abfolgeklasse von Application erstellt haben, gibt diese Methode den Kontext Ihrer benutzerdefinierten Unterklasse zurück.

Wenn Sie Tools implementieren, können Sie mithilfe der Klasse InstrumentationRegistry auf Low-Level-Test-APIs zugreifen. Diese Klasse enthält das Objekt Instrumentation, das Objekt Context der Zielanwendung, das Objekt Context der Testanwendung und die Befehlszeilenargumente, die an den Test übergeben wurden.

Tests filtern

In Ihren JUnit 4.x-Tests können Sie Annotationen verwenden, um den Testlauf zu konfigurieren. Durch diese Funktion müssen Sie in Ihren Tests kaum Boilerplate- und bedingten Code einfügen. Zusätzlich zu den von JUnit 4 unterstützten Standardanmerkungen unterstützt der Test-Runner auch Android-spezifische Annotationen, einschließlich der folgenden:

  • @RequiresDevice: Gibt an, dass der Test nur auf physischen Geräten, nicht auf Emulatoren ausgeführt werden soll.
  • @SdkSuppress: Unterdrückt die Ausführung des Tests auf einer Android API-Ebene, die niedriger als der angegebenen Ebene ist. Wenn Sie beispielsweise die Ausführung von Tests auf allen API-Ebenen unter 23 unterdrücken möchten, verwenden Sie die Annotation @SDKSuppress(minSdkVersion=23).
  • @SmallTest, @MediumTest und @LargeTest: Klassifizieren Sie, wie lange ein Test dauern sollte und folglich wie häufig er ausgeführt werden kann. Mit dieser Annotation können Sie filtern, welche Tests ausgeführt werden sollen. Dazu legen Sie das Attribut android.testInstrumentationRunnerArguments.size fest:
-Pandroid.testInstrumentationRunnerArguments.size=small

Shard-Tests

Wenn Sie die Ausführung Ihrer Tests parallelisieren und auf mehrere Server verteilen müssen, um sie zu beschleunigen, können Sie sie in Gruppen oder Shards aufteilen. Der Test-Runner unterstützt das Aufteilen einer einzelnen Testsuite in mehrere Shards, sodass Sie Tests, die zum selben Shard gehören, einfach gemeinsam als Gruppe ausführen können. Jeder Shard wird durch eine Indexnummer identifiziert. Verwenden Sie beim Ausführen von Tests die Option -e numShards, um die Anzahl der zu erstellenden separaten Shards anzugeben, und die Option -e shardIndex, um anzugeben, welcher Shard ausgeführt werden soll.

Wenn Sie beispielsweise die Testsuite in 10 Shards aufteilen und nur die im zweiten Shard gruppierten Tests ausführen möchten, verwenden Sie den folgenden adb-Befehl:

adb shell am instrument -w -e numShards 10 -e shardIndex 2

Android Test Orchestrator verwenden

Mit Android Test Orchestrator können Sie die einzelnen Tests Ihrer App mit einem eigenen Aufruf von Instrumentation ausführen. Wenn Sie AndroidJUnitRunner Version 1.0 oder höher verwenden, haben Sie Zugriff auf Android Test Orchestrator.

Android Test Orchestrator bietet die folgenden Vorteile für Ihre Testumgebung:

  • Minimaler gemeinsamer Status:Jeder Test wird in einer eigenen Instrumentation-Instanz ausgeführt. Wenn Ihre Tests also den App-Status teilen, wird der Großteil dieses Status nach jedem Test aus der CPU oder dem Arbeitsspeicher Ihres Geräts entfernt. Verwenden Sie das Flag clearPackageData, um nach jedem Test alle gemeinsamen Status von der CPU und dem Arbeitsspeicher Ihres Geräts zu entfernen. Ein Beispiel findest du im Abschnitt Über Gradle aktivieren.
  • Isolierte Abstürze:Selbst wenn ein Test abstürzt, wird nur seine eigene Instanz von Instrumentation deaktiviert. Das bedeutet, dass die anderen Tests in Ihrer Suite weiterhin ausgeführt werden und vollständige Testergebnisse liefern.

Diese Isolation führt zu einer möglichen Verlängerung der Testausführungszeit, da Android Test Orchestrator die Anwendung nach jedem Test neu startet.

In Android Studio und Firebase Test Lab ist Android Test Orchestrator vorinstalliert. Allerdings müssen Sie die Funktion in Android Studio aktivieren.

Über Gradle aktivieren

Führen Sie die folgenden Schritte aus, um Android Test Orchestrator mit dem Gradle-Befehlszeilentool zu aktivieren:

  • Schritt 1: Gradle-Datei ändern Fügen Sie der Datei build.gradle Ihres Projekts die folgenden Anweisungen hinzu:
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'
}
  • Schritt 2: Führen Sie Android Test Orchestrator durch Ausführung des folgenden Befehls aus:
./gradlew connectedCheck

In Android Studio aktivieren

Fügen Sie der Datei build.gradle Ihrer App die Anweisungen unter Bei Gradle aktivieren hinzu, um Android Test Orchestrator in Android Studio zu aktivieren.

Über Befehlszeile aktivieren

Führen Sie die folgenden Befehle in einem Terminalfenster aus, um Android Test Orchestrator in der Befehlszeile zu verwenden:

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'

Wie die Befehlssyntax zeigt, installieren Sie Android Test Orchestrator und verwenden es dann direkt.

adb shell pm list instrumentation

Verschiedene Toolchains verwenden

Wenn Sie zum Testen Ihrer App eine andere Toolchain verwenden, können Sie trotzdem Android Test Orchestrator verwenden. Führen Sie dazu die folgenden Schritte aus:

  1. Fügen Sie die erforderlichen Pakete in die Build-Datei Ihrer App ein.
  2. Aktivieren Sie Android Test Orchestrator über die Befehlszeile.

Architektur

Das APK des Orchestrator-Dienstes wird in einem Prozess gespeichert, der vom Test-APK und dem APK der zu testenden App getrennt ist:

Mit dem Orchestrator können Sie JUnit-Tests
Abbildung 1: Struktur des Android-Testorchestrierungs-APKs.

Android Test Orchestrator erfasst JUnit-Tests zu Beginn der Testsuite-Ausführung, führt dann aber jeden Test separat in einer eigenen Instanz von Instrumentation aus.

Weitere Informationen

Weitere Informationen zur Verwendung von AndroidJUnitRunner finden Sie in der API-Referenz.

Weitere Informationen

Weitere Informationen zur Verwendung von AndroidJUnitRunner finden Sie in den folgenden Ressourcen.

Produktproben