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 solcher, die die Test-Frameworks Espresso, UI Automator und Compose verwenden.
Der Test-Runner lädt Ihr Testpaket und die zu testende App auf ein Gerät, führt die Tests aus und meldet die Testergebnisse.
Dieser Test-Runner unterstützt mehrere gängige Testaufgaben, darunter:
JUnit-Tests schreiben
Im folgenden Code-Snippet wird gezeigt, wie Sie einen instrumentierten JUnit 4-Test schreiben können, um zu prüfen, ob der changeText
-Vorgang in der ChangeTextBehavior
-Klasse richtig funktioniert:
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))); } }
Auf den Kontext der Anwendung zugreifen
Wenn Sie AndroidJUnitRunner
zum Ausführen Ihrer Tests verwenden, können Sie über den Aufruf der statischen Methode ApplicationProvider.getApplicationContext()
auf den Kontext der zu testenden App zugreifen. Wenn Sie in Ihrer App eine benutzerdefinierte Unterklasse von Application
erstellt haben, gibt diese Methode den Kontext Ihrer benutzerdefinierten Unterklasse zurück.
Wenn Sie Tools implementieren, können Sie über die Klasse InstrumentationRegistry
auf APIs für Low-Level-Tests zugreifen. Diese Klasse umfasst das Objekt Instrumentation
, das Objekt „Ziel-App“ Context
, das Objekt „Test-App“ Context
und die an den Test übergebenen Befehlszeilenargumente.
Tests filtern
In Ihren JUnit 4.x-Tests können Sie mithilfe von Anmerkungen den Testlauf konfigurieren. Dadurch müssen Sie in Ihren Tests weniger Boilerplate- und bedingten Code hinzufügen. Neben den von JUnit 4 unterstützten Standardanmerkungen unterstützt der Test-Runner auch Android-spezifische Anmerkungen, darunter:
@RequiresDevice
: Gibt an, dass der Test nur auf physischen Geräten und nicht auf Emulatoren ausgeführt werden soll.@SdkSuppress
: Der Test wird nicht auf einem niedrigeren Android-API-Level als dem angegebenen ausgeführt. Wenn Sie beispielsweise die Ausführung von Tests für alle API-Ebenen unter 23 unterdrücken möchten, verwenden Sie die Anmerkung@SDKSuppress(minSdkVersion=23)
.@SmallTest
,@MediumTest
und@LargeTest
: Hier legen Sie fest, wie lange ein Test dauern soll und wie oft Sie ihn ausführen können. Mit dieser Anmerkung können Sie die auszuführenden Tests filtern, indem Sie dieandroid.testInstrumentationRunnerArguments.size
-Eigenschaft festlegen:
-Pandroid.testInstrumentationRunnerArguments.size=small
Shard-Tests
Wenn Sie die Ausführung Ihrer Tests parallelisieren und auf mehrere Server verteilen möchten, um sie schneller auszuführen, 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, ganz einfach 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 Tests Ihrer App in einer eigenen Aufrufinstanz 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 folgende Vorteile für Ihre Testumgebung:
- Minimaler gemeinsam genutzter Zustand:Jeder Test wird in einer eigenen
Instrumentation
-Instanz ausgeführt. Wenn Sie also in Ihren Tests den App-Status teilen, wird der Großteil dieses geteilten Status nach jedem Test aus der CPU oder dem Arbeitsspeicher Ihres Geräts entfernt. Wenn Sie nach jedem Test alle freigegebenen Statusinformationen aus der CPU und dem Arbeitsspeicher Ihres Geräts entfernen möchten, verwenden Sie das FlagclearPackageData
. Ein Beispiel finden Sie im Abschnitt Über Gradle aktivieren. - Abstürze sind isoliert:Selbst wenn ein Test abstürzt, wird nur seine eigene Instanz von
Instrumentation
heruntergefahren. Die anderen Tests in Ihrer Suite werden also weiterhin ausgeführt und Sie erhalten vollständige Testergebnisse.
Diese Isolation führt zu einer möglichen Erhöhung der Testausführungszeit, da Android Test Orchestrator die Anwendung nach jedem Test neu startet.
Sowohl in Android Studio als auch in Firebase Test Lab ist Android Test Orchestrator vorinstalliert. Sie müssen die Funktion jedoch in Android Studio aktivieren.
Über Gradle aktivieren
So aktivieren Sie Android Test Orchestrator mit dem Gradle-Befehlszeilentool:
- 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 mit dem folgenden Befehl aus:
./gradlew connectedCheck
In Android Studio aktivieren
Wenn Sie Android Test Orchestrator in Android Studio aktivieren möchten, fügen Sie der Datei build.gradle
Ihrer App die Anweisungen unter Über Gradle aktivieren hinzu.
Über die Befehlszeile aktivieren
Wenn Sie Android Test Orchestrator in der Befehlszeile verwenden möchten, führen Sie die folgenden Befehle in einem Terminalfenster aus:
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 ihn dann direkt.
adb shell pm list instrumentation
Unterschiedliche Toolchains verwenden
Wenn Sie zum Testen Ihrer App eine andere Toolchain verwenden, können Sie Android Test Orchestrator trotzdem 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 Orchestrator-Dienst-APK wird in einem Prozess gespeichert, der vom Test-APK und dem APK der zu testenden App getrennt ist:
Android Test Orchestrator erfasst JUnit-Tests zu Beginn des Testsuite-Laufs, führt sie dann aber einzeln 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: Hier werden Testanmerkungen, parametrisierte Tests und das Erstellen von Test-Suites veranschaulicht.