Typy testów i sposób ich używania

Ukończone

Podczas opracowywania strategii testowania różne typy testów mogą powodować pewne zamieszanie. Wiedza na temat tego, czym są te typy testów i czym się różnią od siebie, jest solidnym sposobem wdrożenia niezawodnej strategii testowania.

Uwaga

Różnica między jednostką, integracją i testowaniem funkcjonalnym może być kontrowersyjna. Te opisy są przeznaczone jako wytyczne. Najważniejszą rzeczą jest spójność z projektem i innymi deweloperami.

Testowanie jednostek

Głównym celem testowania jednostkowego jest testowanie najmniejszej możliwej logiki kodu. Efektem ubocznym tego typu testów jest szybkość. Testy jednostkowe są zwykle uruchamiane szybko, ponieważ (najlepiej) nie są potrzebne żadne zasoby zewnętrzne, takie jak bazy danych, witryny internetowe lub wywołania sieciowe.

Funkcje i metody, które są długie i złożone, z wieloma warunkami logicznymi będą trudne do testowania jednostkowego. Testowanie jednostkowe zmusza deweloperów do myślenia o złożoności kodu i utrzymaniu go do minimum. Ogólnie rzecz biorąc, im krótsza jest funkcja lub metoda, tym łatwiej będzie ją przetestować.

Nie ma żadnych twardych reguł dotyczących testowania jednostkowego, ale ogólnie rzecz biorąc, są powszechnie akceptowane normy dotyczące testów jednostkowych:

  • Testują najmniejszy możliwy fragment logiki.
  • Funkcje, metody lub klasy są testowane tak izolowane, jak to możliwe, unikając konieczności skonfigurowania innych funkcji, metod lub klas jako wymagania.
  • Do ich uruchomienia nie są potrzebne żadne usługi zewnętrzne, takie jak bazy danych lub usługi sieciowe.

Testowanie integracji

Testowanie integracji zwykle koncentruje się na logice testowania, która będzie współdziałać z innymi elementami logiki w projekcie kodu. Czasami te testy będą wymagać nawiązania połączenia z bazą danych lub inną usługą zewnętrzną.

Na przykład funkcja sprawdzająca nazwę użytkownika i hasło prawdopodobnie będzie musiała nawiązać połączenie z bazą danych w celu zweryfikowania istniejących danych. Test dla tej funkcji może wymagać bazy danych z istniejącymi informacjami. Te typy testów będą wymagały nieco bardziej złożonych konfiguracji niż testy jednostkowe i mogą trwać dłużej.

Oto kilka akceptowanych norm dotyczących testowania integracji:

  • Nie tak szybko, jak testy jednostkowe i zwykle wymagają większej liczby konfiguracji przed uruchomieniem.
  • Funkcje, metody lub klasy są testowane za pomocą funkcji w innych funkcjach, metodach lub klasach.
  • Usługa zewnętrzna może być używana, ale nie wszystkie usługi dla aplikacji.

Testowanie funkcjonalne

Testowanie funkcjonalne zwykle wymaga uruchomienia aplikacji jako całości. W przypadku witryny internetowej test funkcjonalny może wymagać serwera internetowego, bazy danych i dowolnej innej wymaganej usługi do uruchomienia aplikacji. Chodzi o to, aby replikować aplikację działającą w środowisku produkcyjnym tak ściśle, jak to możliwe.

Ponieważ nie zawsze jest możliwe dokładne replikowanie środowiska produkcyjnego, należy uwzględnić szczególną ostrożność w wadach konfiguracji. Jeśli na przykład witryna internetowa ma 1 terabajt danych w środowisku produkcyjnym, prawdopodobnie warto przetestować podzestaw danych produkcyjnych. Jednak nie zaleca się używania osadzonej bazy danych, takiej jak SQLite, zamiast tej samej bazy danych PostgreSQL używanej w środowisku produkcyjnym. Różnice wersji usług zewnętrznych, takich jak bazy danych, mogą powodować powodzenie testu, ale niepowodzenie w środowisku produkcyjnym.

Testowanie funkcjonalne ma niektóre z następujących aspektów:

  • Nie tak szybko, jak testy jednostkowe i zwykle wymagają większej liczby konfiguracji przed uruchomieniem.
  • Funkcje, metody lub klasy są testowane za pomocą funkcji w innych funkcjach, metodach lub klasach.
  • Usługa zewnętrzna może być używana, ale nie wszystkie usługi dla aplikacji.

Ponieważ testy funkcjonalne wymagają większej liczby usług, odtworzenie środowiska produkcyjnego i najbardziej złożonej konfiguracji typów testów, zwykle będzie czasochłonne i intensywnie obciążające zasoby.

Pojedynczy test funkcjonalny sklepu detalicznego online może obejmować następujące kroki:

  1. Zarejestruj się, aby uzyskać nowego użytkownika.
  2. Wybierz dany produkt i dodaj go do wirtualnego koszyka zakupów.
  3. Ukończ informacje dotyczące wysyłki i rozliczeń.
  4. Wybierz przycisk "kup", aby ukończyć zakup.
  5. Sprawdź, czy nowe konto istnieje, informacje dotyczące rozliczeń i wysyłki są poprawne, a spis został zaktualizowany.

Ciągła integracja

Mimo że ciągła integracja (CIĄGŁa integracja) nie jest typem testowania, jest to ważny element, który musi mieć związek z każdym typem testowania. Gdy zostanie wprowadzony plan testowania, ważne jest, aby mieć coś , co spowoduje uruchomienie testów w zautomatyzowany sposób. Środowisko ciągłej integracji to właściwe miejsce do automatycznego uruchamiania testów. Te testy mogą być uruchamiane zgodnie z harmonogramem, wyzwalane przez zdarzenie lub wykonywane ręcznie. To środowisko zwykle będzie zgodne z miejscem, w którym należy uruchomić kod lub projekt.

Podstawą dobrego procesu ciągłej integracji jest automatyzacja. Automatyzacja określa spójne (i dobrze znane) środowisko. Bez powtarzalnego i znanego środowiska testowego debugowanie problemów i testów, które zakończyły się niepowodzeniem, byłoby czasochłonne lub nawet niemożliwe.

Wyzwalane przez zdarzenie

Jeśli na przykład deweloper chce scalić zmiany w gałęzi głównej, najlepiej jest upewnić się, że zmiany nie spowodują awarii. System ciągłej integracji może automatycznie uruchamiać testy z gałęzi dewelopera i powiadamiać je, gdy wystąpi awaria. Zapobieganie scalaniu kodu, który zakończył się niepowodzeniem ciągłej integracji, jest dobrym sposobem zwiększenia pewności i niezawodności w projekcie.

Uruchamianie zgodnie z harmonogramem

Jak już wspomniano, automatyzacja jest kluczową częścią procesu ciągłej integracji. Zwykle w przypadku konfiguracji dowolnego typu testu należy zainstalować zależności, aby testy działały. Użycie harmonogramu przebiegu testowego (na przykład nocnego przebiegu) gwarantuje, że projekt jest kompiluje się poprawnie nawet w przypadku zmiany zależności.

Cyklicznego zaplanowanego przebiegu testu może być również pomocny podczas uruchamiania testów, które zajmują dużo czasu. Jeśli projekt oprogramowania ma testy funkcjonalne, które potrwają kilka godzin, bardziej wydajne byłoby uruchamianie tych testów w nocy. więc zespół może pracować nad awariami najpierw rano.

Wyzwalanie ręczne

Na koniec, mimo że zaplanowane i sterowane zdarzeniami przebiegi testów są przydatne, warto ręcznie uruchomić zestaw testów. Na przykład gdy zestaw testów jest znany z problemu, deweloper może spróbować naprawić, uruchamiając wcześniej nieudane uruchomienie. Ta pętla opinii umożliwia testowanie poprawek bez potrzeby określonego zdarzenia lub harmonogramu. Ponadto uruchomienie ciągłej integracji może zezwalać na zmiany konfiguracji testu do uruchomienia, które można zmienić ad hoc w celu zapewnienia spełnienia określonych warunków.