Podstawy testowania — dlaczego testujemy
Dlaczego testujemy oprogramowanie? Poznaj cele testowania, różnicę między testowaniem a debugowaniem oraz 7 fundamentalnych zasad testowania z ISTQB.
Ten wpis jest częścią serii ISTQB Foundation Level — ustrukturyzowanego przewodnika, który pomoże Ci zrozumieć koncepcje testowania oprogramowania zgodnie z sylabusem ISTQB, niezależnie od tego, czy przygotowujesz się do egzaminu CTFL, czy po prostu budujesz solidne podstawy w dziedzinie zapewnienia jakości.
Po co w ogóle testować?
23 lipca 1999 roku sonda NASA Mars Climate Orbiter rozpadła się w atmosferze Marsa. Przyczyna? Jeden zespół inżynierów używał jednostek metrycznych (niutonosekundy), a drugi — imperialnych (funtosekundy). Niespójność jednostek — defekt, który mógł zostać wykryty — kosztował 327,6 miliona dolarów i cofnął eksplorację Marsa o lata.
W latach 1985–1987 aparat do radioterapii Therac-25 dostarczył śmiertelne dawki promieniowania co najmniej sześciu pacjentom. Oprogramowanie zawierało wyścig dostępu (ang. race condition), który w określonych warunkach czasowych omijał blokady bezpieczeństwa. Programiści założyli, że jeśli nie ma sprzętowej blokady, oprogramowanie zachowa się poprawnie. Nie zachowało.
W 2012 roku firma Knight Capital Group straciła 440 milionów dolarów w 45 minut z powodu wdrożenia oprogramowania, które aktywowało uśpiony algorytm transakcyjny. Firma przestała istnieć jako niezależny podmiot.
To nie są obscuryczne wydarzenia historyczne. To ilustracje tego, co się dzieje, gdy oprogramowanie nie jest odpowiednio testowane. Wzorzec jest powtarzalny: koszt defektu rośnie wykładniczo wraz z opóźnieniem w jego wykryciu.
| Faza wykrycia defektu | Względny koszt naprawy |
|---|---|
| Wymagania | 1× |
| Projekt | 5× |
| Kodowanie | 10× |
| Testowanie | 20× |
| Produkcja | 100×+ |
Testowanie jest sposobem na wykrycie defektów, zanim trafią do produkcji. Ale to ujęcie — „znajdowanie błędów” — to tylko część obrazu.
Cele testowania (ISTQB 1.1)
Sylabus ISTQB Foundation Level definiuje testowanie przez bogatszy zestaw celów niż samo wyszukiwanie defektów. Zrozumienie ich wszystkich zmienia sposób, w jaki myślisz o tym, co robisz podczas testowania.
1. Wykrywanie defektów
Najbardziej oczywisty cel. Testowanie tworzy warunki, w których defekty manifestują się jako widoczne awarie. Bez testowania defekty pozostają ukryte aż do momentu, gdy natknie się na nie użytkownik — zwykle w najgorszym możliwym momencie.
2. Budowanie zaufania do poziomu jakości
Czasem testujemy nie dlatego, że spodziewamy się błędów, ale dlatego, że musimy wykazać, że system działa poprawnie. Pakiety regresji, smoke testy i przebiegi testów akceptacyjnych służą budowaniu i komunikowaniu zaufania.
3. Dostarczanie informacji do podejmowania decyzji
Interesariusze muszą decydować: czy wydajemy? Czy odkładamy? Czy akceptujemy znane defekty jako niskie ryzyko? Testowanie dostarcza danych potrzebnych do tych decyzji — liczby defektów, pokrycia testowego, niezatestowanych obszarów ryzyka. Testowanie jest działaniem generującym informacje.
4. Zapobieganie defektom
To zaskakuje wielu początkujących. Jak testowanie może zapobiegać defektom? Przez angażowanie testerów wcześnie — w przeglądach wymagań, dyskusjach projektowych, doprecyzowaniu historyjek użytkownika. Gdy tester pyta „co się stanie, jeśli użytkownik wpisze pusty ciąg znaków?” podczas omawiania wymagań, to jest właśnie zapobieganie defektom. Defekt nigdy nie zostaje zakodowany.
5. Weryfikacja zgodności z wymaganiami
Czy zbudowaliśmy to, co zostało określone? Formalne testy weryfikacyjne sprawdzają, czy oprogramowanie spełnia wymagania kontraktowe, regulacyjne lub oparte na normach. Jest to szczególnie istotne w branżach regulowanych (medycyna, lotnictwo, finanse).
6. Walidacja — czy system spełnia potrzeby użytkownika
Weryfikacja pyta „czy zbudowaliśmy to poprawnie?” — walidacja pyta „czy zbudowaliśmy właściwą rzecz?” System może przejść wszystkie określone testy i nadal zawodzić użytkowników. Testy użyteczności, testowanie eksploracyjne i programy beta — wszystko to służy walidacji.
:::tip[Wskazówka egzaminacyjna ISTQB] ISTQB rozróżnia weryfikację („czy oprogramowanie jest zgodne ze specyfikacją?”) i walidację („czy oprogramowanie spełnia potrzeby i oczekiwania użytkownika?”). Oba są celami testowania, ale odpowiadają na różne pytania. :::
Testowanie a debugowanie (ISTQB 1.1.2)
Jedno z najważniejszych rozróżnień, które wprowadza ISTQB — i które powoduje realne napięcia w zespołach — to różnica między testowaniem a debugowaniem.
Testowanie polega na uruchamianiu oprogramowania i obserwowaniu, czy zachowuje się zgodnie z oczekiwaniami. Gdy zachowanie odbiega od oczekiwań, testowanie wykryło awarię (ang. failure). Testowanie może wykonywać każdy: testerzy, programiści, analitycy biznesowi, użytkownicy końcowi.
Debugowanie polega na znalezieniu przyczyny awarii, jej naprawieniu i potwierdzeniu naprawy. Wymaga głębokiej znajomości kodu. Debugowanie wykonują niemal zawsze programiści.
Łańcuch wygląda następująco:
Wykryta awaria → Zlokalizowany defekt (debugowanie) → Zastosowana naprawa → Przeprowadzony test potwierdzający
Testowanie może uruchomić ten łańcuch, ale testowanie nie jest tym samym co debugowanie. Tester, który zgłasza „kliknięcie Wyślij powoduje błąd 500”, wykonał swoją pracę. Znalezienie przyczyny błędu 500 na serwerze należy do programisty.
To rozróżnienie ma znaczenie dla dynamiki zespołu. Testerzy, którzy czują się odpowiedzialni za znalezienie pierwotnej przyczyny każdego błędu, wypalą się i przekroczą swoje kompetencje. Programiści, którzy nie przyjmują zgłoszeń błędów bo „to nie jest błąd”, muszą zrozumieć, że awaria jest awarią niezależnie od przyczyny.
:::note[Wskazówka egzaminacyjna ISTQB] Sylabus ISTQB jest jednoznaczny: testowanie dynamiczne (uruchamianie oprogramowania) może ujawnić awarie, ale tylko debugowanie znajduje i naprawia defekt, który spowodował awarię. Test potwierdzający po naprawie jest czynnością testową, nie debugowaniem. :::
7 zasad testowania (ISTQB 1.3)
Zasady te stanowią fundament wszystkiego, co zawiera sylabus ISTQB. Nie są abstrakcyjną filozofią — każda z nich ma bezpośrednie implikacje dla planowania i wykonywania testów.
1. Testowanie ujawnia obecność defektów, a nie ich brak
Bez względu na to, jak dokładny jest Twój zestaw testów, pomyślne przejście testów nie dowodzi, że oprogramowanie jest wolne od defektów. Dowodzi jedynie, że oprogramowanie przeszło te konkretne testy. Mogą istnieć defekty, których testy nie obejmują, przypadki graniczne, których nie rozważałeś, lub błędy specyficzne dla środowiska, które nigdy nie pojawiają się w środowisku testowym.
Ta zasada powinna rozwijać zdrowy sceptycyzm. Zielony build to dobra wiadomość, nie gwarancja.
2. Testowanie wyczerpujące jest niemożliwe
Rozważmy prosty formularz logowania z dwoma polami. Liczba możliwych kombinacji danych wejściowych — uwzględniając znaki specjalne, Unicode, bardzo długie ciągi, puste dane, payloady SQL injection — jest praktycznie nieskończona. W przypadku prawdziwej aplikacji przestrzeń stanów jest niepojęcie duża.
Nie możesz przetestować wszystkiego. Testowanie jest zawsze procesem selekcji: wybierania, które dane wejściowe, scenariusze i warunki są warte przetestowania przy danych ograniczeniach czasu i ryzyka. Testowanie oparte na ryzyku i podział na klasy równoważności istnieją właśnie z powodu tej zasady.
:::tip[Wskazówka egzaminacyjna ISTQB] Na pytania o testowanie wyczerpujące, odpowiedź zgodna z ISTQB brzmi: jest ono niemożliwe z wyjątkiem trywialnych przypadków. Odpowiedzią na tę niemożność jest testowanie oparte na ryzyku — priorytetyzowanie testów według prawdopodobieństwa i wpływu awarii. :::
3. Wczesne testowanie oszczędza czas i pieniądze
Wróć do tabeli kosztów z początku tego wpisu. Defekt znaleziony w fazie wymagań kosztuje ułamek tego, co defekt znaleziony na produkcji. Testerzy angażowani wcześnie — przeglądający wymagania, uczestniczący w dyskusjach projektowych, piszący kryteria akceptacji razem z programistami — zapobiegają powstawaniu defektów w kodzie.
To intelektualna podstawa ruchu shift-left we współczesnym wytwarzaniu oprogramowania.
4. Defekty skupiają się w skupiskach
W większości systemów oprogramowania niewielka liczba modułów lub funkcji zawiera większość defektów. Czasem nazywa się to zastosowaniem zasady Pareto do testowania: około 80% defektów pochodzi z 20% kodu.
Praktyczna implikacja: jeśli znajdziesz błąd, szukaj więcej błędów w tym samym obszarze. Tam gdzie jest jeden defekt, złożoność, niejasne wymagania lub trudny kod często oznaczają, że w pobliżu są kolejne.
5. Paradoks pestycydów
Jeśli uruchamiasz te same testy w kółko, w końcu przestaną one wykrywać nowe defekty. Dlaczego? Ponieważ wszystkie defekty, które te testy mogły ujawnić, zostały już znalezione i naprawione. Pozostałe defekty to takie, których Twój zestaw testów nie ćwiczy.
Podobnie jak pestycydy, które z czasem tracą skuteczność w miarę jak szkodniki uodparniają się na nie, zestawy testów, które nigdy się nie zmieniają, tracą zdolność do wykrywania defektów. Odpowiedź: regularnie przeglądaj i aktualizuj testy, dodawaj nowe przypadki testowe i uzupełniaj testowanie skryptowe testowaniem eksploracyjnym.
6. Testowanie zależy od kontekstu
Sposób testowania firmware urządzenia medycznego różni się od testowania gry mobilnej. Podejście testowe dla krytycznego systemu bezpieczeństwa — metody formalne, macierze śledzenia, dokumentacja regulacyjna — byłoby absurdalnie przerostowe w stosunku do funkcji tworzonej podczas dwutygodniowego sprintu. Podejście testowe dla aplikacji społecznościowej — szybkie testowanie eksploracyjne, testy A/B, pętle informacji zwrotnej od użytkowników — byłoby niebezpiecznie niewystarczające dla oprogramowania medycznego.
Dobrzy testerzy rozumieją swój kontekst i odpowiednio dostosowują swoje podejście. Nie istnieje universalnie poprawna strategia testowania.
7. Błędne przekonanie o braku błędów
System może przejść każdy pojedynczy test i nadal być porażką. Jeśli testy sprawdzają niewłaściwe rzeczy — jeśli wymagania były błędne, jeśli system rozwiązuje niewłaściwy problem — żadna ilość pozytywnych wyników testów tego nie zmieni.
Dlatego walidacja (testowanie względem potrzeb użytkownika) jest równie ważna jak weryfikacja (testowanie względem specyfikacji). Najgorszy wynik w oprogramowaniu to system, który jest dokładnie zweryfikowany jako poprawnie realizujący niewłaściwe zadanie.
:::note[Wskazówka egzaminacyjna ISTQB] Wszystkie 7 zasad podlega sprawdzeniu na egzaminie. Najczęściej testowane: zasada 1 (testowanie ujawnia obecność, nie brak defektów), zasada 2 (testowanie wyczerpujące jest niemożliwe) i zasada 7 (błędne przekonanie o braku błędów). Znaj zarówno nazwę, jak i implikację każdej z nich. :::
Łączenie zasad z codzienną pracą
Te zasady to nie tylko materiał do zapamiętania na egzamin — to wskazówki operacyjne.
Gdy kierownik pyta „czy już skończyliśmy testować?”, zasada 1 przypomina, że nie możesz powiedzieć „tak, jest wolne od defektów”. Możesz powiedzieć „przetestowaliśmy te scenariusze do tego poziomu pokrycia i znaleźliśmy X defektów, z których Y jest otwartych.”
Gdy zostaniesz poproszony o przetestowanie wszystkiego przed wydaniem, zasada 2 jest Twoim dowodem na to, że jest to niemożliwe, a priorytetyzacja oparta na ryzyku jest odpowiedzialną alternatywą.
Gdy zespół opiera się angażowaniu QA w wymagania, zasada 3 daje Ci argumenty biznesowe: defekty znalezione wcześnie są tańsze w naprawie.
Gdy zastanawiasz się, co testować dalej, zasada 4 (skupiska defektów) sugeruje zacząć w obszarach, które już wykazały problemy.
Gdy Twoja regresja nigdy nic nie znajduje, zasada 5 mówi, że czas ją przejrzeć i rozszerzyć.
Gdy ktoś prosi Cię o zastosowanie strategii testowania z innej domeny, zasada 6 przypomina o konieczności myślenia w kontekście.
Gdy funkcja przechodzi wszystkie testy, ale użytkownicy jej nienawidzą, zasada 7 wyjaśnia dlaczego.
Podsumowanie
Testowanie nie jest fazą, którą wykonujesz na końcu przed wydaniem. To dyscyplina, która informuje sposób budowania oprogramowania od pierwszej rozmowy o wymaganiach aż do ostatniego alertu monitoringu na produkcji.
ISTQB Foundation Level dostarcza ścisłego, wspólnego słownictwa dla tej dyscypliny — uznawanego w ponad 130 krajach i stosowanego przez organizacje, które traktują jakość oprogramowania poważnie. Zrozumienie dlaczego testujemy, a nie tylko jak, odróżnia profesjonalistów od techników.
W następnym wpisie z tej serii przyjrzymy się psychologii testowania — nastawieniu, błędom poznawczym i wyzwaniom komunikacyjnym, które sprawiają, że testowanie jest równie problemem ludzkim, co technicznym.