Lekcja 1.3: Błędy, Defekty, Awarie i Ich Przyczyny

W poprzedniej lekcji ustaliliśmy, dlaczego testowanie jest konieczne – głównie dlatego, że ludzie popełniają błędy.

W tej lekcji przyjrzymy się bliżej terminologii związanej z tymi niedoskonałościami: błędom (pomyłkom), defektom (usterkom) i awariom.

Zrozumienie precyzyjnych definicji tych pojęć oraz ich wzajemnych powiązań jest absolutnie kluczowe dla każdego testera i stanowi fundament komunikacji w zespole projektowym.

Omówimy również typowe przyczyny powstawania defektów oraz koncepcję przyczyny źródłowej (root cause).

Rozróżnienie: Błąd (Pomyłka), Defekt (Usterka), Awaria

Jak już wspomnieliśmy, u podstaw problemów z jakością oprogramowania leży błąd (ang. *error* lub *mistake*).

Jest to działanie człowieka, które prowadzi do powstania nieprawidłowego rezultatu.

Błędy są nieuniknione i mogą wystąpić na każdym etapie tworzenia oprogramowania.

Programista może źle zinterpretować wymaganie, analityk może nieprecyzyjnie opisać funkcjonalność, projektant może wybrać nieoptymalny algorytm, tester może błędnie zaprojektować przypadek testowy, a administrator może źle skonfigurować środowisko.

Przyczyny błędów ludzkich są różnorodne: presja czasu, brak doświadczenia, niedostateczna wiedza, złożoność problemu, niejasna komunikacja, zmęczenie czy po prostu nieuwaga.

Kiedy błąd ludzki zostaje wprowadzony do produktu pracy – czy to do kodu źródłowego, specyfikacji wymagań, dokumentacji projektowej, danych testowych czy jakiegokolwiek innego artefaktu – powstaje defekt (ang. *defect*, *fault*, *bug*).

Defekt to niedoskonałość lub brak w komponencie lub systemie, który może spowodować, że komponent lub system nie wykona wymaganej funkcji.

Innymi słowy, jest to fizyczna manifestacja błędu w produkcie pracy.

Przykłady defektów to: nieprawidłowa instrukcja w kodzie, brakująca obsługa warunku brzegowego, błąd logiczny w algorytmie, nieścisłość w specyfikacji wymagań, błąd w projekcie interfejsu użytkownika, niepoprawny wpis w dokumentacji.

Defekty mogą pozostawać ukryte w systemie przez długi czas.

Dopiero gdy kod zawierający defekt zostanie wykonany w określonych warunkach, może (ale nie musi) dojść do awarii (ang. *failure*).

Awaria to zewnętrznie obserwowalne zdarzenie, w którym komponent lub system nie wykonuje wymaganej funkcji w ramach określonych limitów.

Jest to manifestacja defektu podczas działania programu.

Użytkownik lub tester obserwuje awarię jako nieoczekiwane lub niepoprawne zachowanie systemu, np. wyświetlenie błędnego wyniku, zawieszenie się aplikacji, nieoczekiwane zakończenie działania, komunikat o błędzie, problemy z wydajnością, naruszenie bezpieczeństwa.

To właśnie awarie są tym, co najczęściej zauważają użytkownicy końcowi i co skłania do zgłaszania problemów.

Podsumowując łańcuch przyczynowo-skutkowy: Błąd (pomyłka) ludzka prowadzi do powstania Defektu (usterki) w produkcie pracy, a wykonanie tego defektu może spowodować Awarię systemu.

Zrozumienie tej sekwencji jest kluczowe: testerzy dynamiczni obserwują awarie, aby wnioskować o istnieniu defektów, które z kolei wynikają z wcześniejszych błędów ludzkich.

Testerzy statyczni starają się wykrywać defekty bezpośrednio w produktach pracy, zanim doprowadzą one do awarii.

Gdzie Mogą Występować Defekty?

Defekty nie ograniczają się jedynie do kodu źródłowego. Mogą one występować w każdym produkcie pracy tworzonym w trakcie cyklu życia oprogramowania.

Mogą znajdować się w:

  • Specyfikacjach wymagań: Niejasne, niekompletne, sprzeczne lub niepoprawne wymagania są częstym źródłem problemów.
  • Historyjkach użytkownika: Podobnie jak wymagania, mogą być źle sformułowane lub niekompletne.
  • Dokumentacji projektowej: Błędy w architekturze systemu, projektach modułów czy schematach baz danych.
  • Kodzie źródłowym: Błędy logiczne, składniowe, obliczeniowe, problemy z obsługą pamięci, wycieki zasobów itp.
  • Skryptach testowych: Błędy w logice testu, niepoprawne dane testowe, błędne oczekiwane rezultaty.
  • Danych: Niepoprawne lub niekompletne dane wejściowe, błędy w danych konfiguracyjnych lub danych używanych przez system.
  • Dokumentacji użytkownika: Niepoprawne instrukcje, brakujące informacje, niejasne opisy.
  • Plikach pomocniczych: Np. pliki konfiguracyjne, pliki budowania (build files).

Defekty wprowadzone we wczesnych produktach pracy (np. w wymaganiach) często prowadzą do powstania kolejnych defektów w późniejszych produktach (np. w kodzie implementującym te wymagania).

Dlatego tak ważne jest wczesne wykrywanie defektów za pomocą testowania statycznego (przeglądów).

Przyczyny Źródłowe Defektów (Root Causes)

Samo znalezienie i naprawienie defektu to często za mało.

Aby skutecznie poprawiać jakość i zapobiegać powstawaniu podobnych problemów w przyszłości, ważne jest zrozumienie przyczyny źródłowej (ang. *root cause*) defektu.

Przyczyna źródłowa to fundamentalny powód wystąpienia problemu. Jest to sytuacja lub czynnik, który doprowadził do błędu ludzkiego, który z kolei spowodował defekt.

Identyfikacja przyczyn źródłowych odbywa się zazwyczaj poprzez analizę przyczyn źródłowych (ang. *Root Cause Analysis*, RCA).

Jest to proces badania defektu w celu znalezienia jego podstawowej przyczyny, a nie tylko objawów.

Techniki RCA, takie jak metoda "5 Why" (pięciu pytań "dlaczego?") czy diagram Ishikawy (diagram rybiej ości), pomagają dotrzeć do sedna problemu.

Przykładowo, awaria polegająca na błędnym obliczeniu podatku (awaria) może być spowodowana defektem w kodzie funkcji obliczającej podatek (defekt). Ten defekt mógł powstać, ponieważ programista popełnił błąd, źle implementując wzór (błąd ludzki). Analizując dalej, dlaczego programista popełnił błąd, możemy odkryć, że specyfikacja wymagań była niejasna (przyczyna źródłowa) lub że programista nie miał wystarczającego szkolenia z zakresu przepisów podatkowych (inna potencjalna przyczyna źródłowa).

Znalezienie przyczyny źródłowej pozwala na wdrożenie działań korygujących i zapobiegawczych, które eliminują problem u jego podstaw, np. poprawienie procesu tworzenia specyfikacji, zorganizowanie dodatkowych szkoleń dla zespołu. To prowadzi do trwałej poprawy jakości i zmniejszenia liczby podobnych defektów w przyszłości.

Podsumowanie

Zrozumienie różnic między błędem ludzkim, defektem w produkcie pracy a awarią systemu jest kluczowe dla efektywnej komunikacji i pracy testera.

Pamiętajmy o łańcuchu: błąd -> defekt -> awaria.

Defekty mogą występować w różnych produktach pracy, nie tylko w kodzie.

Ważne jest nie tylko wykrywanie i naprawianie defektów, ale także analiza ich przyczyn źródłowych, aby zapobiegać ich powstawaniu w przyszłości i ciągle doskonalić procesy tworzenia oprogramowania.

Najczęściej Zadawane Pytania (FAQ)

Czy każdy defekt prowadzi do awarii?
Niekoniecznie. Defekt może pozostać niewykryty, jeśli kod go zawierający nigdy nie zostanie wykonany lub jeśli warunki potrzebne do jego ujawnienia nie wystąpią. Ponadto, niektóre defekty mogą nie powodować widocznej awarii, ale np. obniżać wydajność lub zużywać nadmierne zasoby.
Czy awaria zawsze oznacza obecność defektu?
Najczęściej tak, ale awaria może być również spowodowana czynnikami zewnętrznymi, np. problemami środowiskowymi (awaria sprzętu, sieci), błędami w konfiguracji, niepoprawnymi danymi wejściowymi od użytkownika lub interakcją z innymi systemami. Ważne jest zbadanie przyczyny awarii.
Jakie są inne określenia na defekt?
Synonimami defektu są często używane terminy: usterka (fault) oraz potocznie błąd (bug). ISTQB preferuje termin "defekt", ale w praktyce często spotyka się "bug". Ważne jest, aby w zespole używać spójnej terminologii.
Czy błąd ludzki (error/mistake) to to samo co defekt?
Nie. Błąd ludzki to działanie (lub zaniechanie działania), które prowadzi do powstania defektu. Defekt jest wynikiem tego błędu, obecnym w produkcie pracy (np. kodzie, dokumencie). Błąd jest przyczyną, defekt jest skutkiem w produkcie.
Dlaczego analiza przyczyn źródłowych (RCA) jest ważna?
RCA pozwala zrozumieć, dlaczego defekt w ogóle powstał. Identyfikacja i eliminacja przyczyn źródłowych (np. niejasne wymagania, brak szkoleń, presja czasu) zapobiega powstawaniu podobnych defektów w przyszłości i prowadzi do trwałej poprawy jakości procesów i produktów.
Czy testerzy są odpowiedzialni za znajdowanie przyczyn źródłowych?
Niekoniecznie bezpośrednio, ale mogą w tym pomagać. Głównym zadaniem testera jest wykrywanie defektów (poprzez obserwację awarii lub analizę statyczną). Analiza przyczyn źródłowych jest często działaniem zespołowym, angażującym programistów, analityków, testerów i menedżerów.
Gdzie najczęściej występują defekty?
Statystyki pokazują, że defekty mogą występować na każdym etapie i w każdym produkcie pracy. Jednak defekty wprowadzone we wczesnych fazach (np. w wymaganiach) są często bardziej kosztowne w naprawie, jeśli zostaną wykryte późno. Dlatego wczesne testowanie statyczne jest tak cenne.
Czy defekt w kodzie jest zawsze winą programisty?
Niekoniecznie. Chociaż programista wprowadza defekt do kodu, pierwotna przyczyna (błąd ludzki) mogła leżeć gdzie indziej – np. w niejasnych wymaganiach dostarczonych przez analityka, błędnym projekcie architektonicznym, presji czasu narzuconej przez zarząd, czy braku odpowiednich narzędzi lub szkoleń.
Jakie są typowe przyczyny błędów ludzkich?
Typowe przyczyny to: presja czasu, błędy w komunikacji, brak doświadczenia lub wiedzy, złożoność problemu, zmęczenie, nieuwaga, niejasne lub często zmieniające się wymagania, problemy z narzędziami lub środowiskiem.
Czy testowanie może znaleźć wszystkie defekty?
Nie, jak mówi jedna z zasad testowania, testowanie wyczerpujące jest niemożliwe. Testowanie może jedynie pokazać obecność defektów, a nie ich brak. Celem jest znalezienie jak największej liczby istotnych defektów w dostępnym czasie i przy dostępnych zasobach.
Czy defekt w dokumentacji jest mniej ważny niż w kodzie?
Niekoniecznie. Defekt w dokumentacji (np. niejasne wymaganie, błędna instrukcja użytkownika) może prowadzić do błędnej implementacji, problemów z użytecznością, niepoprawnego użycia systemu przez użytkownika, a w efekcie do awarii lub niezadowolenia klienta.
Co to jest "maskowanie defektów"?
Maskowanie defektów to sytuacja, w której jeden defekt uniemożliwia wykrycie innego defektu. Na przykład, jeśli błąd w logowaniu uniemożliwia dostęp do pewnej funkcji, defekty w tej funkcji mogą pozostać niewykryte, dopóki problem z logowaniem nie zostanie naprawiony.
Czy awaria może wystąpić bez wykonania kodu?
Definicja awarii według ISTQB wiąże ją z wykonaniem kodu. Jednak problemy mogą objawiać się również w inny sposób, np. niepoprawna dokumentacja może prowadzić do błędnego użycia systemu przez użytkownika, co można uznać za pewnego rodzaju awarię procesu.
Jak priorytetyzować defekty?
Defekty zazwyczaj priorytetyzuje się na podstawie ich wpływu na biznes (Severity - dotkliwość) oraz prawdopodobieństwa wystąpienia (choć to trudniejsze do oceny). Defekty o wysokiej dotkliwości (np. blokujące kluczowe funkcje, powodujące utratę danych) mają zazwyczaj wyższy priorytet naprawy.
Czy tester powinien sugerować rozwiązania defektów?
Głównym zadaniem testera jest zgłoszenie defektu w sposób jasny i precyzyjny, opisując problem i kroki do jego odtworzenia. Chociaż tester może mieć pomysły na rozwiązanie, decyzja o sposobie naprawy należy zazwyczaj do programisty lub zespołu deweloperskiego.

Przykładowe Pytania Egzaminacyjne

Pytanie 1 (K1): Co jest bezpośrednią przyczyną powstania defektu w oprogramowaniu?

  • a) Awaria systemu
  • b) Błąd (pomyłka) człowieka
  • c) Wykonanie testu
  • d) Analiza przyczyn źródłowych

Poprawna odpowiedź: b (Błąd ludzki prowadzi do wprowadzenia defektu do produktu pracy.)

Pytanie 2 (K2): Programista źle zrozumiał wymaganie i napisał kod, który niepoprawnie oblicza zniżkę dla klienta. Podczas testów tester zauważa, że dla pewnych danych wejściowych system pokazuje błędną kwotę do zapłaty. Co w tej sytuacji jest awarią?

  • a) Złe zrozumienie wymagania przez programistę.
  • b) Niepoprawny kod obliczający zniżkę.
  • c) Wyświetlenie błędnej kwoty do zapłaty przez system.
  • d) Wykonanie testu przez testera.

Poprawna odpowiedź: c (Awaria to zewnętrznie obserwowalne, niepoprawne zachowanie systemu.)

Pytanie 3 (K1): W którym z poniższych produktów pracy NIE mogą występować defekty?

  • a) Specyfikacja wymagań
  • b) Kod źródłowy
  • c) Plan testów
  • d) Defekty mogą występować we wszystkich powyższych.

Poprawna odpowiedź: d (Defekty mogą występować w każdym produkcie pracy tworzonym w cyklu życia oprogramowania.)