W poprzedniej lekcji zdefiniowaliśmy, czym jest testowanie oprogramowania.
Teraz zagłębimy się w fundamentalne pytanie: dlaczego właściwie jest ono konieczne?
W świecie idealnym oprogramowanie działałoby bez zarzutu od samego początku. Rzeczywistość jest jednak inna – błędy są nieodłączną częścią procesu tworzenia oprogramowania.
Testowanie stanowi kluczowy mechanizm kontroli jakości, który pomaga minimalizować ryzyko związane z tymi błędami i zapewniać sukces projektu oraz satysfakcję użytkowników.
Konieczność testowania wynika z faktu, że ludzie popełniają błędy (ang. *errors* lub *mistakes*). Programiści, analitycy, projektanci – wszyscy uczestnicy procesu tworzenia oprogramowania mogą się mylić.
Te ludzkie pomyłki mogą prowadzić do wprowadzenia defektów (ang. *defects*, *faults*, *bugs*) w kodzie lub innych produktach pracy, takich jak wymagania czy dokumentacja projektowa.
Defekty te, jeśli nie zostaną wykryte i naprawione, mogą spowodować awarie (ang. *failures*) systemu podczas jego działania, czyli sytuacje, w których oprogramowanie nie zachowuje się zgodnie z oczekiwaniami.
Skutki takich awarii mogą być bardzo różne – od drobnych niedogodności po katastrofalne konsekwencje finansowe, prawne, a nawet zagrożenie życia ludzkiego.
Wkład Testowania w Sukces Projektu
Testowanie, jako forma kontroli jakości, odgrywa kluczową rolę w osiąganiu celów projektu w ramach ustalonych ograniczeń dotyczących zakresu, czasu, jakości i budżetu. Jego wkład w sukces projektu jest wielowymiarowy.
Przede wszystkim, testowanie dostarcza efektywnych kosztowo środków wykrywania defektów.
Im wcześniej defekt zostanie wykryty (np. na etapie analizy wymagań dzięki testowaniu statycznemu), tym tańsza jest jego naprawa.
Defekty znalezione dopiero na etapie produkcji lub przez klienta końcowego generują nieporównywalnie wyższe koszty, związane nie tylko z samą naprawą, ale również z potencjalną utratą danych, przestojami systemu, utratą reputacji czy koniecznością wycofania produktu z rynku.
Chociaż testowanie samo w sobie nie usuwa defektów (to zadanie debugowania), pośrednio przyczynia się do podniesienia jakości produktu poprzez ich identyfikację.
Kolejnym istotnym wkładem testowania jest bezpośrednia ocena jakości obiektu testowego na różnych etapach cyklu życia oprogramowania (SDLC).
Wyniki testów dostarczają konkretnych danych i metryk (np. liczba znalezionych defektów, pokrycie testowe, czas odpowiedzi systemu), które stanowią podstawę do podejmowania świadomych decyzji zarządczych.
Na przykład, na podstawie raportów z testów menedżer projektu może zdecydować o przejściu do kolejnej fazy projektu, opóźnieniu wydania w celu naprawy krytycznych błędów lub zaakceptowaniu pewnego poziomu ryzyka i wydaniu produktu z znanymi ograniczeniami.
Testowanie dostarcza obiektywnych informacji, które zastępują subiektywne opinie i przeczucia.
Testowanie odgrywa również ważną rolę w zapewnieniu, że potrzeby użytkowników są rozumiane i brane pod uwagę przez cały cykl rozwoju.
Chociaż testerzy często mają jedynie pośrednią reprezentację potrzeb użytkowników (np. poprzez wymagania czy historyjki użytkownika), ich zadaniem jest weryfikacja, czy system spełnia te udokumentowane potrzeby (weryfikacja) oraz, w miarę możliwości, ocena, czy finalny produkt będzie użyteczny i wartościowy dla końcowego odbiorcy (walidacja).
W idealnym scenariuszu, w proces testowania zaangażowani są również reprezentanci użytkowników (np. podczas testów akceptacyjnych), co dodatkowo zwiększa szansę na stworzenie produktu odpowiadającego realnym oczekiwaniom.
Współczesne podejścia do tworzenia oprogramowania, takie jak metodyki zwinne (Agile) czy DevOps, podkreślają znaczenie zaangażowania całego zespołu w działania związane z jakością.
Testowanie nie jest już postrzegane jako odizolowana faza na końcu projektu, ale jako integralna część pracy całego zespołu.
Programiści piszą testy jednostkowe, analitycy dbają o testowalność wymagań, a testerzy współpracują z innymi członkami zespołu na każdym etapie, dostarczając informacji zwrotnej i pomagając w identyfikacji ryzyk.
Każdy interesariusz może wykorzystać wyniki testów (np. raporty z postępów, listy defektów), aby przybliżyć projekt do sukcesu.
Dokumentacja tworzona przez testerów (np. plany testów, przypadki testowe) również pomaga w identyfikacji i redukcji defektów w oprogramowaniu.
Testowanie a Zapewnienie Jakości (QA)
Terminy "testowanie" i "zapewnienie jakości" (ang. *Quality Assurance*, QA) są często używane zamiennie, jednak nie oznaczają tego samego, chociaż są ze sobą ściśle powiązane.
Zapewnienie jakości to szersze pojęcie, które koncentruje się na procesach i działaniach mających na celu zapewnienie, że produkt lub usługa spełni określone wymagania jakościowe.
QA jest zorientowane na procesy i ma charakter prewencyjny – skupia się na wdrożeniu i doskonaleniu procesów, które mają zapobiegać powstawaniu defektów.
Działa na zasadzie, że jeśli procesy są dobre i przestrzegane, to wynikowy produkt również będzie dobrej jakości.
QA obejmuje takie działania jak definiowanie standardów, audyty procesów, szkolenia, analiza metryk procesowych i ciągłe doskonalenie.
Z kolei testowanie jest jedną z form kontroli jakości (ang. *Quality Control*, QC).
Kontrola jakości koncentruje się na samym produkcie i ma na celu identyfikację defektów w już istniejącym produkcie.
Testowanie jest głównym narzędziem QC, polegającym na ocenie produktu poprzez jego uruchomienie (testowanie dynamiczne) lub analizę (testowanie statyczne).
Inne formy QC mogą obejmować przeglądy kodu, inspekcje czy walidację produktu końcowego.
Podsumowując, testowanie (QC) jest reaktywne i skupione na produkcie, podczas gdy zapewnienie jakości (QA) jest proaktywne i skupione na procesie. Oba są niezbędne do osiągnięcia wysokiej jakości oprogramowania.
Podsumowanie
Testowanie jest konieczne, ponieważ ludzie popełniają błędy, które prowadzą do defektów w oprogramowaniu, a te mogą skutkować awariami.
Testowanie wnosi istotny wkład w sukces projektu poprzez efektywne kosztowo wykrywanie defektów, dostarczanie obiektywnych informacji o jakości, zapewnienie zrozumienia potrzeb użytkowników oraz wspieranie współpracy całego zespołu.
Jest kluczowym elementem kontroli jakości (QC), która uzupełnia działania zapewnienia jakości (QA) zorientowane na procesy.
Bez testowania ryzyko dostarczenia produktu niskiej jakości, niespełniającego oczekiwań i generującego problemy jest znacznie wyższe.