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 Attributandroid.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 FlagclearPackageData
, 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:
- Fügen Sie die erforderlichen Pakete in die Build-Datei Ihrer App ein.
- 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](https://developer.android.com/static/training/testing/instrumented-tests/androidx-test-libraries/orchestrator.png?authuser=6&hl=de)
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
- AndroidJunitRunnerSample: Zeigt Testanmerkungen, parametrierte Tests und das Erstellen von Testsuiten an.