Espresso wieloprocesowe

W miarę rozwoju aplikacji warto umieścić niektóre jej komponenty w procesie innym niż jej główny proces. Aby przetestować komponenty aplikacji w tych procesach innych niż domyślne, możesz skorzystać z funkcji Multiprocess Espresso. To narzędzie, dostępne na Androidzie 8.0 (poziom interfejsu API 26) i nowszych, pozwala na łatwe testowanie interakcji z interfejsem aplikacji, które przekraczają jej granice procesów, przy zachowaniu gwarancji synchronizacji Espresso.

Korzystając z espresso z wieloma procesami, pamiętaj o następujących kwestiach dotyczących wersji i zakresu:

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

Korzystanie z narzędzia

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

app/build.gradle,

Odlotowy

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

Kotlin

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

Musisz też dodać te dane do pliku manifestu w usłudze androidTest aplikacji:

  • Element <instrumentation> określający proces.
  • Element <meta-data> wskazujący, że chcesz użyć espresso wieloprocesowego.

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 wskazuje platformie Androida, że ma testować każdy proces w pakiecie aplikacji. Jeśli chcesz przetestować tylko część procesów aplikacji, możesz zamiast tego podać listę oddzieloną przecinkami w elemencie targetProcesses:

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

Poznaj architekturę narzędzia

Gdy testujesz aplikację i uruchamiasz jej domyślny proces, możesz wykonać interakcję z interfejsem, np. naciśnięcie przycisku, która spowoduje uruchomienie działania w procesie dodatkowym. Następnie system wykonuje poniższe kroki, aby umożliwić testowanie w różnych procesach z użyciem espresso:

  1. Android Framework tworzy i uruchamia nowy proces zgodny ze strukturą nawigacyjną aplikacji. Każdy proces Instrumentation obejmuje nowe wystąpienie obiektu AndroidJUnitRunner. Na tym etapie 2 procesy instrumentacji nie mogą się ze sobą komunikować.
  2. Każda instancja AndroidJUnitRunner rejestruje Espresso jako platformę do testowania.
  3. 2 instancje AndroidJUnitRunner przeprowadzają uzgadnianie połączenia, aby nawiązać ze sobą połączenie. Jednocześnie każda instancja AndroidJUnitRunner łączy wszystkich zarejestrowanych klientów, takich jak Espresso, z ich odpowiednikami w innych procesach, dzięki czemu mogą oni tworzyć bezpośrednie kanały komunikacji.
  4. Każda instancja AndroidJUnitRunner nadal szuka nowo dodanych instancji narzędzi i klientów platformy testowej, aby w razie potrzeby utworzyć dodatkowe kanały komunikacji.

Rezultat tego procesu przedstawiono na Rysunku 1:

Rysunek 1. Nawiązywanie komunikacji między wieloma procesami instrumentacji za pomocą espresso z wieloma procesami

Dodatkowe materiały

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