Wenn Ihre App wächst, kann es sinnvoll sein, einige ihrer Komponenten in einem anderen Prozess als dem Hauptprozess der App zu platzieren. Wenn Sie App-Komponenten in diesen nicht standardmäßigen Prozessen testen möchten, können Sie die Funktionen von Multiprocess Espresso verwenden. Mit diesem Tool, das ab Android 8.0 (API-Level 26) verfügbar ist, können Sie die UI-Interaktionen Ihrer App, die die Prozessgrenzen Ihrer App überschreiten, nahtlos testen und gleichzeitig die Synchronisationsgarantien von Espresso beibehalten.
Beachten Sie bei der Verwendung von Multiprocess Espresso Folgendes in Bezug auf Versionierung und Umfang:
- Ihre App muss auf Android 8.0 (API‑Level 26) oder höher ausgerichtet sein.
- Mit dem Tool können nur App-Komponenten getestet werden, die Sie in Prozesse innerhalb des App-Pakets aufnehmen. Externe Prozesse können nicht getestet werden.
Tool verwenden
Wenn Sie einen Prozess in Ihrer App mit Multiprocess Espresso testen möchten, fügen Sie in der build.gradle
-Datei Ihrer App einen Verweis auf das espresso-remote-Artefakt ein:
app/build.gradle
Groovy
dependencies { ... androidTestImplementation 'androidx.test.espresso:espresso-remote:3.6.1' }
Kotlin
dependencies { ... androidTestImplementation('androidx.test.espresso:espresso-remote:3.6.1') }
Außerdem müssen Sie dem androidTest
-Manifest Ihrer 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 Sie diese Elemente hinzufügen:
src/androidTest/AndroidManifest.xml
<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 weist das Android-Framework an, jeden Prozess im Paket Ihrer App zu testen. Wenn Sie nur einen Teil der Prozesse Ihrer App testen möchten, können Sie stattdessen eine durch Kommas getrennte Liste im targetProcesses
-Element angeben:
<instrumentation
...
android:targetProcesses=
"androidx.test.mytestapp:myFirstAppProcessToTest,
androidx.test.mytestapp:mySecondAppProcessToTest" ... />
Tool-Architektur verstehen
Wenn Sie Ihre App testen und den Standardprozess starten, führen Sie möglicherweise eine UI-Interaktion aus, z. B. einen Tastendruck, der eine Aktivität in einem sekundären Prozess startet. 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, um der Navigationsstruktur Ihrer App zu folgen. Jeder
Instrumentation
-Prozess umfasst eine neue Instanz vonAndroidJUnitRunner
. In dieser Phase können die beiden Instrumentierungsprozesse nicht miteinander kommunizieren. - Jede
AndroidJUnitRunner
-Instanz registriert Espresso als ihr Testframework. - Die beiden Instanzen von
AndroidJUnitRunner
führen einen Handshake durch, um eine Verbindung zueinander herzustellen. Gleichzeitig verbindet jedeAndroidJUnitRunner
-Instanz alle registrierten Clients wie Espresso mit ihren jeweiligen Gegenstücken in anderen Prozessen, sodass diese Clients einen direkten Kommunikationskanal zwischen sich bilden können. - Jede
AndroidJUnitRunner
-Instanz sucht weiterhin nach neu hinzugefügten Instrumentierungsinstanzen und Testframework-Clients und richtet bei Bedarf zusätzliche Kommunikationskanäle ein.
Abbildung 1 zeigt das Ergebnis dieses Prozesses:

Zusätzliche Ressourcen
Weitere Informationen zu diesem Thema finden Sie in den folgenden Ressourcen.
- Testgetriebene Entwicklung auf Android mit der Android Testing Support Library, Sitzungsvideo von der Google I/O 2017, ab 36:41.