Podstawy testowania aplikacji na Androida

Na tej stronie opisano podstawowe zasady testowania aplikacji na Androida, w tym najważniejsze sprawdzone metody i ich zalety.

Korzyści z testowania

Testowanie jest nieodłączną częścią procesu tworzenia aplikacji. Regularne przeprowadzanie testów aplikacji umożliwia weryfikowanie poprawności jej działania, funkcjonalności i łatwości obsługi jeszcze przed opublikowaniem.

Aplikację możesz przetestować ręcznie , korzystając z niej. Możesz używać różnych urządzeń i emulatorów, zmieniać język systemu oraz próbować wygenerować każdy błąd użytkownika lub przejść przez każdy proces użytkownika.

Testowanie ręczne jest jednak mało skalowalne i łatwo przeoczyć regresje w działaniu aplikacji. Testowanie automatyczne polega na używaniu narzędzi, które wykonują testy za Ciebie. Jest to szybsze, bardziej powtarzalne i zwykle pozwala uzyskać więcej przydatnych opinii o aplikacji na wcześniejszym etapie procesu tworzenia.

Rodzaje testów na Androidzie

Aplikacje mobilne są złożone i muszą działać prawidłowo w wielu środowiskach. Dlatego istnieje wiele rodzajów testów.

Temat

W zależności od tematu wyróżniamy na przykład te rodzaje testów:

  • Testy funkcjonalne: czy aplikacja działa zgodnie z założeniami?
  • Testy wydajności: czy działa szybko i wydajnie?
  • Testy ułatwień dostępu: czy działa prawidłowo z usługami ułatwień dostępu?
  • Testy zgodności: czy działa prawidłowo na każdym urządzeniu i poziomie interfejsu API?

Zakres

Testy różnią się też rozmiarem lub stopniem izolacji:

  • Testy jednostkowe lub małe testy sprawdzają tylko bardzo małą część aplikacji, np. metodę lub klasę.
  • Testy kompleksowe lub duże testy sprawdzają jednocześnie większe części aplikacji, np. cały ekran lub proces użytkownika.
  • Średnie testy znajdują się pomiędzy nimi i sprawdzają integrację między 2 lub więcej jednostkami.
Testy mogą być małe, średnie lub duże.
Ilustracja 1. Zakresy testów w typowej aplikacji.

Testy można klasyfikować na wiele sposobów. Najważniejszym rozróżnieniem dla deweloperów aplikacji jest jednak miejsce, w którym są one przeprowadzane.

Testy instrumentowane i lokalne

Testy możesz przeprowadzać na urządzeniu z Androidem lub na innym komputerze:

  • Testy instrumentowane są przeprowadzane na urządzeniu z Androidem – fizycznym lub emulowanym. Aplikacja jest kompilowana i instalowana razem z aplikacją testową , która wstrzykuje polecenia i odczytuje stan. Testy instrumentowane to zwykle testy interfejsu użytkownika, które uruchamiają aplikację, a następnie wchodzą z nią w interakcję.
  • Testy lokalne są wykonywane na komputerze używanym do programowania lub serwerze, dlatego nazywane są też testami po stronie hosta. Zwykle są małe i szybkie, a testowany element jest izolowany od reszty aplikacji.
Testy mogą być przeprowadzane jako testy z instrumentacją na urządzeniu lub testy lokalne na komputerze używanym do programowania.
Ilustracja 2. Różne rodzaje testów w zależności od miejsca ich przeprowadzania.

Nie wszystkie testy jednostkowe są lokalne, a nie wszystkie testy kompleksowe są przeprowadzane na urządzeniu. Na przykład:

  • Duży test lokalny: możesz użyć symulatora Androida, który działa lokalnie, takiego jak Robolectric.
  • Mały test instrumentowany: możesz sprawdzić, czy Twój kod działa prawidłowo z funkcją platformy, np. bazą danych SQLite. Możesz przeprowadzić ten test na kilku urządzeniach, aby sprawdzić integrację z różnymi wersjami SQLite.

Przykłady

Te fragmenty kodu pokazują, jak wchodzić w interakcję z interfejsem w instrumentowanym teście interfejsu użytkownika , który klika element i sprawdza, czy wyświetla się inny element.

Espresso

// When the Continue button is clicked
onView(withText("Continue"))
    .perform(click())

// Then the Welcome screen is displayed
onView(withText("Welcome"))
    .check(matches(isDisplayed()))

Compose UI

// When the Continue button is clicked
composeTestRule.onNodeWithText("Continue").performClick()

// Then the Welcome screen is displayed
composeTestRule.onNodeWithText("Welcome").assertIsDisplayed()

Ten fragment kodu pokazuje część testu jednostkowego dla ViewModel (test lokalny, po stronie hosta):

// Given an instance of MyViewModel
val viewModel = MyViewModel(myFakeDataRepository)

// When data is loaded
viewModel.loadData()

// Then it should be exposing data
assertTrue(viewModel.data != null)

Architektura testowalna

W przypadku architektury testowalnej aplikacji kod ma strukturę, która umożliwia łatwe testowanie różnych jego części w izolacji. Architektury testowalne mają też inne zalety, takie jak lepsza czytelność, łatwość utrzymania, skalowalność i możliwość ponownego użycia.

Architektura nietestowalna powoduje:

  • większe, wolniejsze i bardziej niestabilne testy. Klasy, których nie można testować jednostkowo, mogą wymagać większych testów integracyjnych lub testów interfejsu użytkownika.
  • mniej możliwości testowania różnych scenariuszy. Większe testy są wolniejsze, więc testowanie wszystkich możliwych stanów aplikacji może być nierealne.

Więcej informacji o wytycznych dotyczących architektury znajdziesz w przewodniku po architekturze aplikacji.

Sposoby rozdzielania

Jeśli możesz wyodrębnić część funkcji, klasy lub modułu z reszty, testowanie jest łatwiejsze i bardziej skuteczne. Ta praktyka jest znana jako rozdzielanie i jest najważniejszą koncepcją w architekturze testowalnej.

Typowe techniki rozdzielania:

  • Podziel aplikację na warstwy, takie jak prezentacja, domena i dane. Możesz też podzielić aplikację na moduły, po jednym na każdą funkcję.
  • Unikaj dodawania logiki do elementów, które mają duże zależności, takich jak aktywności i fragmenty. Używaj tych klas jako punktów wejścia do platformy i przenoś logikę interfejsu użytkownika i logikę biznesową w inne miejsce, np. do elementu kompozycyjnego, ViewModel lub warstwy domeny.
  • Unikaj bezpośrednich zależności od platformy w klasach zawierających logikę biznesową. Na przykład nie używaj kontekstów Androida w ViewModel.
  • Ułatw zastępowanie zależności. Na przykład używaj interfejsów zamiast konkretnych implementacji. Używaj wstrzykiwania zależności, nawet jeśli nie korzystasz z platformy DI.

Dalsze kroki

Teraz, gdy wiesz, dlaczego warto testować i jakie są 2 główne rodzaje testów, możesz przeczytać Co testować lub dowiedzieć się więcej o strategiach testowania

Jeśli chcesz utworzyć pierwszy test i uczyć się przez działanie, zapoznaj się z ćwiczeniami z kodowania dotyczącymi testowania.