Espresso wieloprocesowe

Wraz z rozwojem aplikacji może się okazać, że warto umieścić niektóre jej komponenty w procesie innym niż główny proces aplikacji. Aby przetestować komponenty aplikacji w tych procesach domyślnych, możesz użyć funkcji Multiprocess Espresso. To narzędzie, dostępne na Androidzie 8.0 (poziom interfejsu API 26) i nowszym, umożliwia płynne testowanie interakcji interfejsu aplikacji, które przekraczają granice procesu aplikacji, przy jednoczesnym zachowaniu gwarancji synchronizacji Espresso.

Podczas korzystania z Multiprocess Espresso pamiętaj o tych kwestiach związanych z wersjami i zakresem:

  • Aplikacja musi być kierowana na Androida 8.0 (API na poziomie 26) lub nowszego.
  • Narzędzie może testować tylko komponenty aplikacji, które uwzględnisz w procesach w pakiecie aplikacji. Nie może testować procesów zewnętrznych.

Korzystanie z narzędzia

Aby przetestować proces w aplikacji za pomocą Multiprocess Espresso, dodaj odwołanie do artefaktu espresso-remote w pliku build.gradle aplikacji:

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')
}

Musisz też dodać do androidTest manifestu aplikacji te elementy:

  • Element <instrumentation>, który definiuje proces.
  • Element <meta-data> wskazujący, że chcesz używać Multiprocess Espresso.

Poniższy fragment kodu pokazuje, jak dodać te elementy:

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>

Poprzedni fragment kodu informuje platformę Androida, że chcesz przetestować każdy proces w pakiecie aplikacji. Jeśli chcesz przetestować tylko podzbiór procesów aplikacji, możesz podać listę rozdzieloną przecinkami w elemencie targetProcesses:

<instrumentation
    ...
    android:targetProcesses=
            "androidx.test.mytestapp:myFirstAppProcessToTest,
             androidx.test.mytestapp:mySecondAppProcessToTest" ... />

Poznaj architekturę narzędzia

Podczas testowania aplikacji i uruchamiania jej domyślnego procesu możesz wykonać interakcję z interfejsem, np. nacisnąć przycisk, co spowoduje rozpoczęcie działania w procesie dodatkowym. Aby włączyć testowanie w wielu procesach za pomocą Espresso, system wykonuje te czynności:

  1. Platforma Android tworzy i uruchamia nowy proces, który będzie zgodny ze strukturą nawigacyjną aplikacji. Każdy proces Instrumentation obejmuje nową instancję AndroidJUnitRunner. Na tym etapie 2 procesy instrumentacji nie mogą się ze sobą komunikować.
  2. Każda instancja AndroidJUnitRunner rejestruje Espresso jako platformę testową.
  3. 2 instancje AndroidJUnitRunner przeprowadzają uzgadnianie, aby nawiązać między sobą połączenie. Jednocześnie każda instancja AndroidJUnitRunner łączy wszystkich zarejestrowanych klientów, takich jak Espresso, z ich odpowiednikami w innych procesach, aby mogli oni utworzyć bezpośredni kanał komunikacji między sobą.
  4. Każda instancja AndroidJUnitRunner nadal wyszukuje nowo dodane instancje instrumentacji i klientów platformy testowej, w razie potrzeby tworząc dodatkowe kanały komunikacji.

Rysunek 1 przedstawia wynik tego procesu:

Rysunek 1. Nawiązywanie komunikacji między wieloma procesami instrumentacji za pomocą Espresso w wielu procesach

Dodatkowe materiały

Więcej informacji na ten temat znajdziesz w tych materiałach.