Strategie testowania

Automatyczne testowanie pomaga na wiele sposobów poprawić jakość aplikacji. Pomaga na przykład w przeprowadzaniu weryfikacji, wykrywaniu regresji i sprawdzaniu zgodności. Dobra strategia testowania pozwala korzystać z automatycznych testów, aby skupić się na ważnej korzyści: wydajności deweloperów.

Zespoły osiągają wyższy poziom produktywności, gdy stosują systematyczne podejście do testowania w połączeniu z ulepszeniami infrastruktury. Dzięki temu możesz na bieżąco otrzymywać informacje zwrotne o działaniu kodu. Dobra strategia testowania:

  • Wykrywa problemy jak najwcześniej.
  • Szybkie wykonywanie.
  • Wyraźnie wskazuje, kiedy coś wymaga poprawy.

Na tej stronie dowiesz się, jakie rodzaje testów warto przeprowadzać, gdzie i jak często.

Piramida testów

Testy w nowoczesnych aplikacjach możesz kategoryzować według rozmiaru. Małe testy skupiają się tylko na niewielkiej części kodu, dzięki czemu są szybkie i niezawodne. Duże testy mają szeroki zakres i wymagają bardziej złożonych konfiguracji, które są trudne w utrzymaniu. Duże testy są jednak bardziej wiarygodne* i mogą wykryć znacznie więcej problemów za jednym razem.

*Wierność odnosi się do podobieństwa środowiska wykonawczego testu do środowiska produkcyjnego.

Rozkład liczby testów według zakresu jest zwykle przedstawiany w formie piramidy.
Rysunek 1. Rozkład liczby testów według zakresu jest zwykle przedstawiany w formie piramidy.

Większość aplikacji powinna mieć wiele małych testów i stosunkowo niewiele dużych. Rozkład testów w każdej kategorii powinien tworzyć piramidę, w której podstawę stanowią liczne małe testy, a wierzchołek – mniej liczne duże testy.

Minimalizowanie kosztów związanych z błędem

Dobra strategia testowania maksymalizuje produktywność programistów, a jednocześnie minimalizuje koszty znajdowania błędów.

Rozważmy przykład strategii, która może być nieefektywna. Liczba testów według rozmiaru nie tworzy piramidy. Jest zbyt wiele dużych testów kompleksowych i zbyt mało testów interfejsu komponentów:

Strategia z przewagą testów ręcznych, w której większość testów jest wykonywana ręcznie, a testy urządzenia są przeprowadzane tylko w nocy.
Rysunek 2. Strategia z przewagą testów ręcznych, w której większość testów jest wykonywana ręcznie, a testy urządzenia są przeprowadzane tylko w nocy.

Oznacza to, że przed scaleniem przeprowadzono zbyt mało testów. Jeśli wystąpi błąd, testy mogą go nie wykryć do czasu uruchomienia nocnych lub tygodniowych testów kompleksowych.

Warto zastanowić się, jakie ma to znaczenie dla kosztów identyfikowania i naprawiania błędów oraz dlaczego warto skupiać się w testach na mniejszych i częstszych testach:

  • Gdy błąd zostanie wykryty przez test jednostkowy, zwykle jest naprawiany w ciągu kilku minut, więc koszt jest niski.
  • W przypadku testu kompleksowego wykrycie tego samego błędu może zająć kilka dni. Może to zaangażować wielu członków zespołu, co zmniejszy ogólną produktywność i może opóźnić publikację. Koszt tego błędu jest wyższy.

Niemniej jednak nieefektywna strategia testowania jest lepsza niż brak jakiejkolwiek strategii. Gdy błąd trafi do środowiska produkcyjnego, jego naprawienie i wdrożenie na urządzeniach użytkowników zajmuje dużo czasu, czasami nawet tygodnie, więc pętla opinii jest najdłuższa i najdroższa.

skalowalną strategię testowania,

Piramida testów jest tradycyjnie podzielona na 3 kategorie:

  • Testy jednostkowe
  • Testy integracji
  • testy kompleksowe,

Nie mają one jednak precyzyjnych definicji, więc zespoły mogą chcieć zdefiniować swoje kategorie w inny sposób, np. używając 5 warstw:

5-warstwowa piramida testów z kategoriami testów jednostkowych, testów komponentów, testów funkcji, testów aplikacji i testów wersji kandydującej do publikacji w kolejności rosnącej.
Rysunek 3. 5-warstwowa piramida testów.
  • Test jednostkowy jest przeprowadzany na komputerze hosta i weryfikuje pojedynczą jednostkę funkcjonalną logiki bez zależności od platformy Android.
    • Przykład: weryfikowanie błędów o 1 w funkcji matematycznej.
  • Test komponentu weryfikuje funkcjonalność lub wygląd modułu lub komponentu niezależnie od innych komponentów w systemie. W przeciwieństwie do testów jednostkowych obszar testu komponentu obejmuje wyższe abstrakcje niż poszczególne metody i klasy.
  • Test funkcji weryfikuje interakcję co najmniej 2 niezależnych komponentów lub modułów. Testy funkcji są większe i bardziej złożone, a zwykle działają na poziomie funkcji.
  • Test aplikacji weryfikuje działanie całej aplikacji w postaci pliku binarnego, który można wdrożyć. Są to duże testy integracji, które jako testowany system wykorzystują plik binarny z możliwością debugowania, np. kompilację deweloperską, która może zawierać punkty zaczepienia testowania.
    • Przykład: test zachowania interfejsu, który weryfikuje zmiany konfiguracji na urządzeniu składanym, testy lokalizacji i ułatwień dostępu
  • Test wersji kandydującej do publikacji sprawdza działanie kompilacji do publikacji. Są one podobne do testów aplikacji, z tą różnicą, że binarny plik aplikacji jest zminimalizowany i zoptymalizowany. Są to duże testy integracyjne typu end-to-end, które są przeprowadzane w środowisku jak najbardziej zbliżonym do produkcyjnego, ale bez udostępniania aplikacji publicznym kontom użytkowników ani publicznym backendom.

Podział ten uwzględnia zgodność, czas, zakres i poziom odizolowania. Możesz przeprowadzać różne rodzaje testów na wielu warstwach. Na przykład warstwa testu aplikacji może zawierać testy zachowania, zrzutów ekranu i wydajności.

Zakres

Dostęp do sieci

Wykonanie

Typ kompilacji

Cykl życia

Jednostka

Pojedyncza metoda lub klasa z minimalną liczbą zależności.

Nie

Lokalne

z możliwością debugowania

Przed scaleniem

Komponent

Poziom modułu lub komponentu

Wiele zajęć razem

Nie

Lokalne
Robolectric
Emulator

z możliwością debugowania

Przed scaleniem

Funkcja

Poziom funkcji

Integracja z komponentami należącymi do innych zespołów

Mocked

Local
Robolectric
Emulator
Urządzenia

z możliwością debugowania

Przed scaleniem

Aplikacja

Poziom aplikacji

integracja z funkcjami lub usługami należącymi do innych zespołów;

Mocked
Serwer testowy
Serwer produkcyjny

Emulatory
Urządzenia

z możliwością debugowania

Przed scaleniem
Po scaleniu

Wersja kandydująca do publikacji

Poziom aplikacji

integracja z funkcjami lub usługami należącymi do innych zespołów;

Serwer produkcyjny

Emulatory
Urządzenia

Zminimalizowana kompilacja do publikacji

Po połączeniu
Przed premierą

Wybierz kategorię testu

Zasadniczo należy brać pod uwagę najniższą warstwę piramidy, która może zapewnić zespołowi odpowiedni poziom informacji zwrotnych.

Weźmy na przykład testowanie implementacji tej funkcji: interfejsu użytkownika procesu logowania. W zależności od tego, co chcesz przetestować, wybierz odpowiednie kategorie:

Obiekt testowy

Opis testowanego elementu

Kategoria testowa

Przykładowy typ testu

Logika walidatora formularza

Klasa, która sprawdza, czy adres e-mail pasuje do wyrażenia regularnego, i czy zostało wpisane hasło. Nie ma żadnych zależności.

Testy jednostkowe

Lokalny test jednostkowy JVM

Działanie interfejsu formularza logowania

Formularz z przyciskiem, który jest włączony tylko wtedy, gdy formularz został zweryfikowany

Testy komponentów

Test zachowania interfejsu uruchomiony w Robolectric

Wygląd interfejsu formularza logowania

formularz zgodny ze specyfikacją UX,

Testy komponentów

Test zrzutu ekranu podglądu tworzenia

Integracja z menedżerem autoryzacji

Interfejs, który wysyła dane logowania do menedżera autoryzacji i otrzymuje odpowiedzi, które mogą zawierać różne błędy.

Testy funkcji

Test JVM z użyciem atrap

Okno logowania

Ekran z formularzem logowania po naciśnięciu przycisku logowania.

Testy aplikacji

Test zachowania interfejsu uruchomiony w Robolectric

Kluczowa ścieżka użytkownika: logowanie

Pełny proces logowania przy użyciu konta testowego na serwerze testowym

Wersja kandydująca do publikacji

Kompleksowy test działania interfejsu Compose uruchamiany na urządzeniu

W niektórych przypadkach przynależność do danej kategorii może być subiektywna. Istnieją dodatkowe powody, dla których test może zostać przesunięty w górę lub w dół, np. koszt infrastruktury, niestabilność i długi czas trwania testu.

Pamiętaj, że kategoria testu nie określa jego typu i nie wszystkie funkcje muszą być testowane w każdej kategorii.

Testy ręczne mogą być również częścią Twojej strategii testowania. Zwykle testy wersji kandydującej przeprowadzają zespoły ds. kontroli jakości, ale mogą one też brać udział w innych etapach. Na przykład testowanie eksploracyjne pod kątem błędów w funkcji bez skryptu.

Infrastruktura testowa

Strategia testowania musi być wspierana przez infrastrukturę i narzędzia, które pomagają deweloperom stale przeprowadzać testy i egzekwować reguły gwarantujące, że wszystkie testy zostaną zaliczone.

Możesz podzielić testy na kategorie według zakresu, aby określić, kiedy i gdzie mają być przeprowadzane poszczególne testy. Na przykład zgodnie z modelem 5-warstwowym:

Kategoria

Środowisko (gdzie)

Aktywator (gdy)

Jednostka

[Lokalna][4]

Każde zatwierdzenie

Komponent

Lokalne

Każde zatwierdzenie

Funkcja

Lokalnie i na emulatorach

Przed scaleniem, przed scaleniem lub przesłaniem zmiany

Aplikacja

Lokalnie, na emulatorach, 1 telefon, 1 składany

Po scaleniu, po scaleniu lub przesłaniu zmiany

Wersja kandydująca do publikacji

8 różnych telefonów, 1 składany, 1 tablet

Przed premierą

  • Testy jednostkowe i komponentów są uruchamiane w systemie ciągłej integracji w przypadku każdego nowego zatwierdzenia, ale tylko w przypadku modułów, których dotyczy zmiana.
  • Wszystkie testy jednostkowe, komponentów i funkcji są przeprowadzane przed scaleniem lub przesłaniem zmiany.
  • Testy aplikacji są przeprowadzane po scaleniu.
  • Testy Release Candidate są przeprowadzane codziennie w nocy na telefonie, urządzeniu składanym i tablecie.
  • Przed wydaniem wersji Release Candidate testy są przeprowadzane na dużej liczbie urządzeń.

Te zasady mogą się zmieniać z czasem, gdy liczba testów wpływa na produktywność. Jeśli na przykład przeniesiesz testy do harmonogramu nocnego, możesz skrócić czas kompilacji CI i testów, ale możesz też wydłużyć pętlę opinii.