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:
Odlotowy
dependencies { ... androidTestImplementation 'androidx.test.espresso:espresso-remote:3.6.1' }
Kotlin
dependencies { ... androidTestImplementation('androidx.test.espresso:espresso-remote:3.6.1') }
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:
<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:
- Android Framework tworzy i uruchamia nowy proces zgodny ze strukturą nawigacyjną aplikacji. Każdy proces
Instrumentation
obejmuje nowe wystąpienie obiektuAndroidJUnitRunner
. Na tym etapie 2 procesy instrumentacji nie mogą się ze sobą komunikować. - Każda instancja
AndroidJUnitRunner
rejestruje Espresso jako platformę do testowania. - 2 instancje
AndroidJUnitRunner
przeprowadzają uzgadnianie połączenia, aby nawiązać ze sobą połączenie. Jednocześnie każda instancjaAndroidJUnitRunner
łą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. - 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:
Dodatkowe materiały
Więcej informacji na ten temat znajdziesz w tych materiałach:
- Programowanie oparte na testowaniu na Androidzie z użyciem biblioteki obsługi testowania Androida z Google I/O 2017, trwającej od 36:41.