Wenn Ihre Anwendung wächst, kann es sinnvoll sein, einige Ihrer Anwendungskomponenten in einem anderen Prozess als dem Hauptprozess der Anwendung zu platzieren. Zum Testen von App-Komponenten in diesen nicht standardmäßigen Prozessen können Sie die Funktion von „Multiprocess Espresso“ verwenden. Mit diesem Tool, das unter Android 8.0 (API-Level 26) und höher verfügbar ist, können Sie die Interaktionen der Benutzeroberfläche Ihrer App, die die Prozessgrenzen Ihrer App überschreiten, nahtlos testen. Dabei werden die Synchronisierungsgarantien von Espresso beibehalten.
Wenn Sie Multiprocess Espresso verwenden, sollten Sie die folgenden Versionsverwaltung und Hinweise zum Umfang beachten:
- Ihre App muss auf Android 8.0 (API-Level 26) oder höher ausgerichtet sein.
- Das Tool kann nur App-Komponenten testen, die Sie in Prozesse im Paket Ihrer Anwendung aufnehmen. Externe Prozesse können damit nicht getestet werden.
Tool verwenden
Wenn Sie einen Prozess in Ihrer Anwendung mit Multiprocess Espresso testen möchten, fügen Sie in der Datei build.gradle
Ihrer Anwendung einen Verweis auf das Artefakt espresso-remote hinzu:
Groovig
dependencies { ... androidTestImplementation 'androidx.test.espresso:espresso-remote:3.6.1' }
Kotlin
dependencies { ... androidTestImplementation('androidx.test.espresso:espresso-remote:3.6.1') }
Außerdem musst du dem androidTest
-Manifest deiner App Folgendes hinzufügen:
- Ein
<instrumentation>
-Element, das den Prozess definiert. - Ein
<meta-data>
-Element, das angibt, dass Sie Multiprocess Espresso verwenden möchten.
Das folgende Code-Snippet zeigt, wie diese Elemente hinzugefügt werden:
<manifest ... package="androidx.test.mytestapp.tests"> <uses-sdk android:targetSdkVersion="27" android:minSdkVersion="14" /> <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" android:targetPackage="androidx.test.mytestapp" android:targetProcesses="*"> <meta-data android:name="remoteMethod" android:value="androidx.test.espresso.remote.EspressoRemote#remoteInit" /> </instrumentation> </manifest>
Das vorherige Snippet zeigt dem Android-Framework an, dass es jeden Prozess im Paket Ihrer App testen soll. Wenn Sie nur einen Teil der Prozesse der Anwendung testen möchten, können Sie stattdessen eine durch Kommas getrennte Liste im Element targetProcesses
angeben:
<instrumentation
...
android:targetProcesses=
"androidx.test.mytestapp:myFirstAppProcessToTest,
androidx.test.mytestapp:mySecondAppProcessToTest" ... />
Architektur des Tools verstehen
Wenn Sie Ihre Anwendung testen und den Standardprozess starten, können Sie eine UI-Interaktion ausführen, z. B. das Drücken einer Schaltfläche, durch die eine Aktivität in einem sekundären Prozess gestartet wird. Das System führt dann die folgenden Schritte aus, um prozessübergreifende Tests mit Espresso zu ermöglichen:
- Das Android-Framework erstellt und startet einen neuen Prozess, der der Navigationsstruktur Ihrer App folgt. Jeder
Instrumentation
-Prozess enthält eine neue Instanz vonAndroidJUnitRunner
. In dieser Phase können die beiden Instrumentierungsprozesse nicht miteinander kommunizieren. - Jede
AndroidJUnitRunner
-Instanz registriert Espresso als Test-Framework. - Die beiden Instanzen von
AndroidJUnitRunner
führen einen Handshake aus, um eine Verbindung zueinander herzustellen. Gleichzeitig verbindet jedeAndroidJUnitRunner
-Instanz alle registrierten Clients wie Espresso mit ihren jeweiligen Gegenstücken in anderen Prozessen, damit diese Clients einen direkten Kommunikationskanal untereinander bilden können. - Jede
AndroidJUnitRunner
-Instanz sucht weiter nach neu hinzugefügten Instrumentierungsinstanzen und Test-Framework-Clients, um bei Bedarf zusätzliche Kommunikationskanäle einzurichten.
Abbildung 1 veranschaulicht das Ergebnis dieses Prozesses:
Weitere Informationen
Weitere Informationen zu diesem Thema finden Sie in den folgenden Ressourcen.
- Video der Session Test-Driven Development on Android with the Android Testing Support Library von der Google I/O 2017, Beginn um 36:41 Uhr.