W poprzedniej lekcji omówiliśmy poziomy testów, które stanowią ramy organizacyjne dla procesu testowania w cyklu życia oprogramowania.
Jednak samo zdefiniowanie poziomów nie wystarczy. Aby skutecznie ocenić jakość oprogramowania, musimy wiedzieć, *co* konkretnie chcemy przetestować i *jak* to zrobić.
Tutaj z pomocą przychodzi koncepcja typów testów.
Jak wskazuje sylabus ISTQB Foundation Level v4.0, „typy testów to grupy czynności testowych związanych z konkretnymi charakterystykami jakościowymi”.
Innymi słowy, typy testów klasyfikują działania testowe ze względu na ich cel lub aspekt oprogramowania, który badają.
Co ważne, „większość z tych czynności można wykonywać na każdym poziomie testów”.
W tej lekcji przyjrzymy się czterem kluczowym typom testów omówionym w sylabusie: testowaniu funkcjonalnemu, niefunkcjonalnemu, czarnoskrzynkowemu i białoskrzynkowemu.
Czym Są Typy Testów?
Wyobraźmy sobie testowanie samochodu. Możemy sprawdzać różne aspekty: czy działają hamulce i światła (funkcjonalność), jak szybko przyspiesza i ile paliwa zużywa (wydajność), czy jest wygodny w prowadzeniu (użyteczność), czy drzwi się prawidłowo zamykają (niezawodność), czy trudno go ukraść (bezpieczeństwo).
Każdy z tych aspektów reprezentuje inny „typ” testu, skupiający się na innej charakterystyce produktu.
Podobnie w testowaniu oprogramowania, typy testów pomagają nam skategoryzować nasze wysiłki i upewnić się, że badamy różne aspekty jakości.
Sylabus ISTQB podkreśla, że istnieje wiele typów testów, ale koncentruje się na czterech fundamentalnych, które stanowią podstawę do zrozumienia innych, bardziej specyficznych typów.
1. Testowanie Funkcjonalne (Functional Testing)
Testowanie funkcjonalne jest prawdopodobnie najbardziej intuicyjnym i najczęściej kojarzonym z testowaniem typem.
Jak mówi sylabus, „polega na dokonaniu oceny funkcji, które powinien realizować dany moduł lub system”.
Odpowiada na pytanie: „Czy oprogramowanie robi to, co powinno robić?”.
- Fokus: Weryfikacja, czy funkcje oprogramowania działają zgodnie ze specyfikacją i wymaganiami. Sprawdzanie kompletności, poprawności i adekwatności realizowanych funkcji.
- Cel: Wykrywanie defektów związanych z brakującą, niepoprawną lub nieadekwatną funkcjonalnością. Potwierdzenie, że system realizuje zamierzone zadania.
- Perspektywa: Zazwyczaj z perspektywy użytkownika lub wymagań biznesowych – co system *powinien* robić.
- Przykłady: Sprawdzenie, czy logowanie działa dla poprawnych danych, czy obliczenia w formularzu są prawidłowe, czy raport generuje oczekiwane dane, czy przycisk „Zapisz” faktycznie zapisuje dane.
- Główne aspekty wg ISTQB:
- Kompletność funkcjonalna: Czy wszystkie zdefiniowane funkcje zostały zaimplementowane?
- Poprawność funkcjonalna: Czy zaimplementowane funkcje działają zgodnie ze specyfikacją i dają poprawne wyniki?
- Adekwatność funkcjonalna: Czy zaimplementowane funkcje faktycznie realizują zamierzone cele i zadania użytkownika?
Testowanie funkcjonalne można przeprowadzać na wszystkich poziomach testów – od weryfikacji pojedynczej funkcji w teście modułowym, przez sprawdzanie przepływów między modułami w testach integracyjnych, aż po kompleksowe scenariusze biznesowe w testach systemowych i akceptacyjnych.
2. Testowanie Niefunkcjonalne (Non-functional Testing)
Oprogramowanie musi nie tylko działać poprawnie pod względem funkcjonalnym, ale również spełniać określone wymagania dotyczące sposobu, w jaki działa.
Testowanie niefunkcjonalne, jak definiuje sylabus, „ma na celu dokonanie oceny atrybutów innych niż charakterystyki funkcjonalne modułu lub systemu”.
Odpowiada na pytanie: „Jak dobrze system działa?” lub „Jakie są jego cechy jakościowe?”.
- Fokus: Ocena charakterystyk jakościowych oprogramowania, takich jak wydajność, niezawodność, użyteczność, bezpieczeństwo, kompatybilność, utrzymywalność, przenaszalność.
- Cel: Weryfikacja, czy system spełnia zdefiniowane wymagania niefunkcjonalne. Wykrywanie defektów związanych ze sposobem działania systemu, a nie z jego funkcjami.
- Perspektywa: Jak system się zachowuje w określonych warunkach lub pod obciążeniem? Jak łatwo go używać, zabezpieczyć, modyfikować?
- Przykłady: Pomiar czasu odpowiedzi systemu pod obciążeniem (wydajność), sprawdzenie odporności na ataki (bezpieczeństwo), ocena łatwości nawigacji po interfejsie (użyteczność), weryfikacja działania na różnych przeglądarkach (kompatybilność), sprawdzenie zużycia zasobów (wydajność).
- Charakterystyki jakościowe wg ISO/IEC 25010 (wymienione w sylabusie):
- Wydajność (Performance efficiency): Zasoby zużywane w stosunku do ilości pracy wykonanej w określonym czasie (np. czas odpowiedzi, przepustowość, zużycie pamięci/CPU).
- Kompatybilność (Compatibility): Zdolność do współistnienia i wymiany informacji z innymi systemami lub komponentami w tym samym środowisku.
- Użyteczność (Usability): Łatwość, z jaką użytkownicy mogą osiągać swoje cele podczas korzystania z systemu (np. łatwość nauki, efektywność, satysfakcja, dostępność).
- Niezawodność (Reliability): Zdolność systemu do działania bez awarii przez określony czas w określonych warunkach (np. dojrzałość, odporność na błędy, odtwarzalność).
- Zabezpieczenia (Security): Zdolność do ochrony informacji i danych przed nieautoryzowanym dostępem, użyciem, modyfikacją czy zniszczeniem (np. poufność, integralność, niezaprzeczalność, rozliczalność).
- Utrzymywalność (Maintainability): Łatwość, z jaką system może być modyfikowany (np. poprawiany, ulepszany, adaptowany do zmian). Obejmuje modularność, reużywalność, analizowalność, modyfikowalność, testowalność.
- Przenaszalność (Portability): Łatwość, z jaką system może być przeniesiony z jednego środowiska (sprzętowego, programowego) do innego. Obejmuje adaptowalność, instalowalność, zastępowalność.
Sylabus podkreśla, że „w pewnych przypadkach wskazane jest rozpoczęcie testowania niefunkcjonalnego na wczesnym etapie cyklu wytwarzania (np. w ramach przeglądów oraz testowania modułowego lub systemowego)”.
Zbyt późne wykrycie problemów niefunkcjonalnych (np. niska wydajność, luki bezpieczeństwa) może być bardzo kosztowne i ryzykowne dla projektu.
Wiele testów niefunkcjonalnych bazuje na testach funkcjonalnych, ale ocenia inne aspekty podczas ich wykonywania (np. mierzy czas odpowiedzi podczas wykonywania funkcji).
3. Testowanie Białoskrzynkowe (White-box Testing)
Testowanie białoskrzynkowe, jak sama nazwa wskazuje, polega na zaglądaniu „do środka” testowanego obiektu – jego struktury wewnętrznej, kodu źródłowego, architektury.
Sylabus definiuje je jako „testowanie oparte na analizie wewnętrznej struktury modułu lub systemu”.
Techniki białoskrzynkowe wykorzystują wiedzę o implementacji do projektowania przypadków testowych.
- Fokus: Struktura wewnętrzna oprogramowania – kod, gałęzie decyzyjne, ścieżki wykonania, warunki logiczne, struktury danych.
- Cel: Ocena kompletności przetestowania struktury kodu (pokrycie kodu). Wykrywanie defektów w logice, algorytmach, obsłudze błędów na poziomie kodu. Optymalizacja kodu.
- Perspektywa: Jak system jest zbudowany? Jakie ścieżki może przejść wykonanie programu?
- Przykłady: Testowanie pokrycia instrukcji (czy każda linijka kodu została wykonana?), pokrycia decyzji (czy każdy możliwy wynik warunku logicznego został przetestowany?), pokrycia warunków.
- Zastosowanie: Głównie na poziomie testów modułowych i integracji modułów, często wykonywane przez programistów. Może być również stosowane na wyższych poziomach do oceny pokrycia kodu przez testy systemowe.
Techniki białoskrzynkowe są szczegółowo omawiane w Rozdziale 4 sylabusu.
4. Testowanie Czarnoskrzynkowe (Black-box Testing)
Testowanie czarnoskrzynkowe jest przeciwieństwem białoskrzynkowego.
Traktuje testowany obiekt jak „czarną skrzynkę” – interesuje nas tylko jego zewnętrzne zachowanie (wejścia i wyjścia), bez zaglądania do środka.
Sylabus opisuje je jako „testowanie, zarówno funkcjonalne, jak i niefunkcjonalne, które nie wymaga znajomości wewnętrznej struktury modułu lub systemu”.
- Fokus: Zewnętrzne zachowanie systemu, obserwowane przez interfejsy (np. GUI, API). Weryfikacja na podstawie specyfikacji, wymagań, przypadków użycia.
- Cel: Ocena, czy system zachowuje się zgodnie z oczekiwaniami dla danych wejściowych i warunków. Wykrywanie defektów w funkcjonalności, obsłudze danych wejściowych/wyjściowych, interfejsach.
- Perspektywa: Co system robi dla określonych danych wejściowych? Jak reaguje na różne scenariusze użycia?
- Przykłady: Testowanie klas równoważności, analizy wartości brzegowych, tablic decyzyjnych, przejść między stanami, przypadków użycia.
- Zastosowanie: Na wszystkich poziomach testów, ale szczególnie dominujące na poziomach systemowym i akceptacyjnym, gdzie perspektywa użytkownika i wymagań jest kluczowa.
Techniki czarnoskrzynkowe są również szczegółowo omawiane w Rozdziale 4 sylabusu.
Relacja Między Typami Testów
Warto zauważyć, że podziały na typy testów nie są rozłączne i często się przenikają.
Testowanie funkcjonalne i niefunkcjonalne opisuje *co* testujemy (funkcje vs. charakterystyki).
Testowanie białoskrzynkowe i czarnoskrzynkowe opisuje *jak* projektujemy testy (z wiedzą o strukturze vs. bez niej).
Możemy więc wykonywać testy funkcjonalne, używając technik czarnoskrzynkowych (np. testując logowanie na podstawie wymagań) lub białoskrzynkowych (np. analizując kod obsługujący logowanie).
Podobnie, testy niefunkcjonalne (np. wydajnościowe) mogą być projektowane w oparciu o techniki czarnoskrzynkowe (obserwując czas odpowiedzi dla różnych scenariuszy) lub białoskrzynkowe (analizując kod pod kątem wąskich gardeł).
Podsumowanie
Typy testów klasyfikują czynności testowe ze względu na ich cel lub badany aspekt jakości.
ISTQB wyróżnia cztery kluczowe typy:
- Testowanie funkcjonalne: Ocena, czy system robi to, co powinien (kompletność, poprawność, adekwatność funkcji).
- Testowanie niefunkcjonalne: Ocena, jak dobrze system działa (wydajność, użyteczność, bezpieczeństwo, niezawodność itp.).
- Testowanie białoskrzynkowe: Projektowanie testów w oparciu o znajomość wewnętrznej struktury (kodu).
- Testowanie czarnoskrzynkowe: Projektowanie testów w oparciu o zewnętrzne zachowanie, bez znajomości struktury.
Typy testów mogą być stosowane na różnych poziomach testów.
Zrozumienie różnych typów testów pozwala na bardziej świadome planowanie i przeprowadzanie procesu testowego, zapewniając kompleksową ocenę jakości oprogramowania.