Android – CI
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:
- Instalacja Java JDK
- Instalacja Android SDK (akceptacja licencji)
- Pobranie kodu
- Zbudowanie aplikacji
- Uruchomienie testów jednostkowych
- Pobranie emulatora Androida
- Utworzenie instancji emulatora
- Poczekanie na uruchomienie emulatora (odblokowanie ekran)
- Odpalenie testów instrumentacyjnych
- 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.
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:
- Kategoryzacja testów, tworzenie zestawów i zrównoleglanie, jeśli mamy dużo testów UI i zajmują one zbyt dużo czasu.
- Implementacja powtarzania nieudanych testów w celu rozwiązania problemu testów niedeterministycznych i ustabilizowania buildów.
- 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.