Android – CI

Autor
Damian
Terlecki
5 minut
Mobile

Skonfigurowanie ciągłej integracji aplikacji Androidowej, uwzględniającej testy interfejsu użytkownika, może okazać się wyzwaniem. Do tego zadania nie wystarczy instalacja standardowego JDK. Musimy również pobrać, stworzyć i uruchomić emulator Androida. Może to zająć całkiem sporo czasu. Nawet po udanym buildzie może się okazać, że testy zajmują całe wieki, a lokalnie wszystko działa płynnie. Dokładna konfiguracja może się różnić w zależności od usługi bądź serwera CI. Podstawowe kroki, jakie należy wykonać w celu konfiguracji CI projektu Androidowego są jednak dosyć zrozumiałe:

  1. Instalacja Java JDK
  2. Instalacja Android SDK (akceptacja licencji)
  3. Pobranie kodu
  4. Zbudowanie aplikacji
  5. Uruchomienie testów jednostkowych
  6. Pobranie emulatora Androida
  7. Utworzenie instancji emulatora
  8. Poczekanie na uruchomienie emulatora (odblokowanie ekran)
  9. Odpalenie testów instrumentacyjnych
  10. Zebranie wyników wyniki (pokrycie kodu, błędy, zrzuty ekranu)

W zależności od narzędzia niektóre z tych kroków jak instalacja mogą wymagać jedynie jednorazowego ich wykonania. Gdzieś pomiędzy tymi krokami, warto również zatrzymać się na moment i zastanowić się nad akceleracją sprzętową.

Travis i CircleCI

Travis i CircleCI mają całkiem fajne opcje wspierające CI dla projektów Androidowych. W przypadku testów jednostkowych sprawdzają się one świetnie. Jeśli chodzi o testy instrumentacyjne, z tym jest już nieco gorzej. Właściwa konfiguracja może nie być trywialna. Obecnie możemy przeczytać, że:

[Travis] Ostrzeżenie: obecnie te kroki nie są w pełni obsługiwane przez konstruktora Travis CI Android.
[CircleCI] Uwaga: Uruchamianie emulatora Androida nie jest obsługiwane przez typ wirtualizacji używanej przez CircleCI w systemie Linux.

Mimo tego metodą prób i błędów w obu serwisach jesteśmy w stanie uruchomić testy instrumentacyjne na emulatorze, bez konieczności polegania usługach firm trzecich, takich jak Firebase Test Lab. W przypadku CircleCI istnieje konfiguracja stworzona przez Dogu Deniz Ugur, która wykorzystuje środowisko MacOS do uruchamiania emulatora. W przypadku Travisa nie miałem szczęścia do domyślnej konfiguracji zamieszczonej w dokumentacji ani żadnej innej z przypadkowych artykułów.

Android Emulator does not start. No output has been received in the last 10m0s. The build has been terminated. emulator: ERROR: detected a hanging thread 'QEMU1 main loop'. No response for 105001 ms. Valid ABIs: no ABIs. Error: Invalid --abi armeabi-v7a for the selected target.

Jeśli napotkasz na przeszkodę, którą ciężko Ci pokonać, dobrym pomysłem będzie przyjrzenie się projektom typu open-source, które korzystają z wybranej przez Ciebie usługi. Jednym z przykładów jest dość popularna aplikacja AnkiDroid ze skonfigurowaną ciągłą integracją na Travisie. Parę razy, gdy moje buildy niespodziewanie zaczęły kończyć się niepowodzeniem, źródło problemu znajdowałem, śledząc zmiany Mike'a Hardy'iego – jednego z autorów AnkiDroid. W większości przypadków problemy dotyczyły aktualizacji kanału lub aktualizacji wersji emulatora.

Kolejne kroki

Konfiguracja ciągłej integracji dla projektu Androidowego to nie koniec przygody. Warto rozważyć następujące usprawnienia:

  1. Kategoryzacja testów, tworzenie zestawów i zrównoleglanie, jeśli mamy dużo testów UI i zajmują one zbyt dużo czasu.
  2. Implementacja powtarzania nieudanych testów w celu rozwiązania problemu testów niedeterministycznych i ustabilizowania buildów.
  3. Przechwytywanie i przesyłanie zrzutów ekranu przy niepowodzeniu testu, aby uzyskać dodatkowe informacje z serwera o tym, jak wyglądał interfejs użytkownika i co mogło być powodem błędu.

Ostatnim krokiem może być ustawienie ciągłego wdrażania (CD), np. automatycznego wrzucania aplikacji do testów wewnętrznych na Google Play. W tym przypadku narzędzie Fastlane może znacząco ułatwić ten proces.