Multiprozess-Espresso

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:

app/build.gradle

Groovig

dependencies {
    ...
    androidTestImplementation 'androidx.test.espresso:espresso-remote:3.4.0'
}

Kotlin

dependencies {
    ...
    androidTestImplementation('androidx.test.espresso:espresso-remote:3.4.0')
}

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:

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 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:

  1. Das Android-Framework erstellt und startet einen neuen Prozess, der der Navigationsstruktur Ihrer App folgt. Jeder Instrumentation-Prozess enthält eine neue Instanz von AndroidJUnitRunner. In dieser Phase können die beiden Instrumentierungsprozesse nicht miteinander kommunizieren.
  2. Jede AndroidJUnitRunner-Instanz registriert Espresso als Test-Framework.
  3. Die beiden Instanzen von AndroidJUnitRunner führen einen Handshake aus, um eine Verbindung zueinander herzustellen. Gleichzeitig verbindet jede AndroidJUnitRunner-Instanz alle registrierten Clients wie Espresso mit ihren jeweiligen Gegenstücken in anderen Prozessen, damit diese Clients einen direkten Kommunikationskanal untereinander bilden können.
  4. 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:

Abbildung 1: Mit Multiprocess Espresso die Kommunikation zwischen mehreren Instrumentierungsprozessen herstellen

Weitere Informationen

Weitere Informationen zu diesem Thema finden Sie in den folgenden Ressourcen.