Archiwum wrzesień 2019, strona 5


Rozdział 18
21 września 2019, 15:42

Rozdział 18  Raportowanie wyników
W TYM ROZDZIALE Co zrobić, żeby błędy były naprawiane Izolowanie i odtwarzanie błędów Błąd błędowi nierówny Cykl życiowy błędu Systemy śledzenia błędów
Patrząc na testowanie z oddalenia, dostrzec można w najszerszym zarysie trzy główne zadania: planowanie testów, samo testowanie oraz temat tego rozdziału - raportowanie wyników.
Na pierwszy rzut oka może się wydawać, że raportowanie odkrytych problemów jest najłatwiejsze z tych trzech zadań. W porównaniu z ilością pracy konieczną do planowania i z umiejętnościami niezbędnymi, by skutecznie znajdować błędy, opowiedzenie innym że znalazło się błąd powinno przecież być prostsze i nmiej czasochłonne. W rzeczywistości, jest to najważniejsze - i czasami najtrudniejsze - z zdań jakie stoją przed testerem.
Najważniejsze punkty tego rozdziału: 61.Częmu błędy nie zawsze zostaja naprawione 62.Co można zrobić, by zwiększyć szansę naprawienia błędów 63.Jakimi metodami izolować i ponownie wywoływać znalezione błędy 64.Jak przyebiega życie błędu - od jego narodzin aż do śmierci 65.Jak śledzić i kontrolować błędy ręcznie lub przy pomocy bazy danych Mały Kurczak ma kłopot Mały Kurczak był pewnego razu w lesie, kiedy na głowe spadł mu żołądź. Tak go to przeraziło, że cały zadrżał. Trząsł się tak, że aż zgubił połowę piór. „Pomocy, pomocy! Niebo się wali! Musze pobiec powiedzieć królowi!” - zawołał Mały Kurczak.
I kurczak pobiegł w wielkim strachu opowiedzieć królowi. PO drodze spotkał Henny Penny. „Dokąd idziesz, Mały Kurczaku?” - spytał Henny Penny. „Och, pomocy! Niebo się wali!” - odpowidział Mały Kurczak. „Skąd wiesz?” - zapytał Henny Penny. „Widziałem to na własne oczy, słyszałem to na własne uszy, a część nieba spadła mi na głowę!” - odpowiedział Mały Kurczak. „To straszne, po prostu straszne! Lepiej pośpieszmy się!” - zawołał Henny Penny. I obaj pobiegli jak najszybciej tylko umieli. W tej popularnej dziecinnej bajeczce, Mały Kurczak wpada w szok, kiedy staje się coś nieoczekiwanego i ucieka w panice, wołając na cały świat, co mu się wydaje. Pomuślmy, jak Mały Kurczak zachowałby się znalazłszy błąd oprogramowania! Jak zareagowałby na to kierwonik projektu albo programista? Jest wiele interesujących podobieństw między tą historyjką a testowaniem oprogramowania - warto mieć ją w pamięci czytając ten rozdział. Co zrobić, żeby błędy były naprawiane
Dawno temu w rozdziale 3-im „Test oprogramowania w rzeczywistości” dowiedzieliśmy się, że mimo wszelkich starań podczas planowania i wykonywania testów, nie wszystkie znalezione błędy1 zostaną naprawione. Niektóre zostaną całkowicie odrzucone, inne mogą być odroczone z zamiarem naprawienia ich dopiero w kolejnej wersji oprogramowania. Z początku taka możliwośc wydawała się nieco zniechęcająca czy wręcz groźna. Tearz, wiedząc już o wiele więcej na temat testowania, przypusczalnie łatwiej nam zrozumieć, czemu w rzeczywistości nie wszystkie błędy są naprawiane.
Oto wymienione w rozdziale 3-im powody, dla których nie wszystkie błędy zostają naprawiane: 66.Brakuje czasu. W każdym porjekcie zawsze jest zbyt wiele funkcji, zbyt mało załogi i nie dośc czasu w harmonogramie. Jeśli pracuje się nad programem do deklaracji podatkowych, data składanie deklaracji się nie zmieni - program musi być gotowy w terminie.
1 Tutaj przydałoby się rozróżnienie między "awarią" (dającym się zaobserwować nieprawidłowym działaniem programu) oraz "błędem" (przyczyną tej nieprawidłowości), by uczynić wywód jaśniejszym. Autor jednak konskwentnie używa tego samego słowa "bug" na określenie raz przyczyny błędu, a raz - jego objawów.
67.To nie jest naprawdę błąd. Znane jest powiedzonko „To nie błąd, to funkcja!” Częste są nieporozumienia, błędy w testownaniu lub zmiany specyfikacji powodujące, że pozorne błędy zostają zaklasyfikowane jako pożądane funkcje. 68.Za duże ryzyko naprawy. Niestety, tak często jest. Oprogramowanie jest delikatne, splątane, czasem jak makaron nitki. Można wtedy naprawiając jeden błąd „obudzić” inne, wcześniej ulryte błędy. Pod naciskiem wymagań wypuszcznia programu miomo przykrótkiego harmonogramu, jakiekolwiek zmiany mogą być zbyt ryzykowne. Lepiej może być zostawić w spokoju już znany błąd, niż ryzykować pojawienie się nowych, nieznanaych. 69.Po prostu nie warto. To może brzmi brutalnie, ale taka jest rzeczywistość. Błędy które występują niezbyt często albo w rzadko używanych funkcjach można pominąć. Błędy dla których istnieją obejścia, czyli metody jak je omijać, często uznaje się za niewarte naprawy. Rzecz sprowadza się do decyzji biznesowej w oparciu o przewidywane ryzyko.
Do tej listy warto dodać jeszcze jedną pozycję, która może być dodatkwym powodem pojawienia się tych wcześniejszych: 70.Błędy są nieskutecznie raportowane. Tester nie sporządził dostatecznie silnej argumentacji, dlaczego dany błąd powinien zostać naprawiony. Skutkiem tego błąd został mylnie oceniony jako nie-błąd, uznano że nie jest dostatecznie ważny aby opóźniać produkt, zbyt ryzykowny do naprawy, albo po prostu nie wart wysiłku.
Tak jak to było z Małym Kurczakiem, bieganie i krzyki, że niebo się wali nie jest zwykle skuteczną metodą komunikowania problemu - o ile oczywiście niebo nie wali się naprawdę. Większość znajdowanych błędów nie będzie aż tak dramatycznych. Trzeba będzie tylko zwięźle i treściwie powiadomić o swoim znalezisku zespół zajmujący się podejmowaniem decyzji w tych sprawach, tak żeby miał do dyspozycji potrzebną do decyzji informację. Ponieważ istnieje wiele różnych modeli wytwarzania oprogramowania i różne typy dynamiki grupowej, nie da się z góry jednoznacznie opisać, jak będzie przebiegać w danym zespole lub projekcie proces podejmowania decyzji, czy błąd ma być naprawiony, czy nie. Często decyzja należy wyłącznie do kierownika projektu, czasem do programisty, czasem podejmuje ją specjalnie dobrany zespół.
Jadnak zawsze jedna lub kilka osób dokonuje przeglądu błędu, którego dotyczy złożony raport, i podejmuje decyzję co dalej. Ta decyzja jest podejmowana przynajmniej częściowo w oparciu o informację dostarczoną przez testera w raporcie błędu.
Nie trzeba być prawnikiem albo byłym przewodniczącym grupy dyskusyjnej, aby domyśleć się, jak należy przekonywać innych, by błąd został naprawiony. Wystarczy w znacznym stopniu zdrowy rozsądek i podstawowe umiejętności komunikacyjne. W dalszej części rozdziału zapoznamy się z różnymi systemami zapisywania i śledzenia raportów o błędach, ale na razie weźmiemy pod uwagę klika ogólnych, podstawowych zasad. 71.Raportować błędy jak najszybciej. Mówiliśmy już o tym wczesniej, ale tych powtórzeń nigdy nie jest zbyt wiele. Im wcześniej znajdzie się błąd, tym więcej czasu pozostaje w harmonogramie na jego naprawę. Wyobraźmy sobie, że zawstydzający błąd ortograficzny zostaje znaleziony w tekście pomocniczym na kilka miesięcy przed wypuszczeniem programu. Jest wówczas bardzo prawdopodobne, że błąd zostanie naprawiony. Ten sam błąd znaleziony kilka godzin przed dostawą, zapewne naprawiony nie będzie. Rysunek 18.1 ilustruje zależność między czasem a naprawą błędów na wykresie.
Początek projektu Czas
Prawdopodobieństwo naprawy
Mniejszy bład
Poważny błąd
Rysunek 18.1  Im poźniej błąd zostanie znaleziony, tym mniejsze prawdopodobieństwo, że zostanie naprawiony, zwłaszcza jeśli chodzi o miej poważne błędy.
Może sie to wydawać dziwne - błąd jest wciąż tym samym błędem niezależnie od tego czy znaleźć go dzisiaj, czy za trzy miesiące. W doskonałym świecie nie miałoby znaczenia, kiedy błąd zostaje znaleziony, tylko co to jest za błąd. Jednak w rzeczywistości ryzyko związane z naprawianiem błędu wzrasta wraz z upływem czasu i ten fakt ma rosnące znaczenia w trakcie podejmownaia decyzji. 72.Opisywać błędy skutecznie. Wyobraźmy sobie, że jest się programistą i otrzymuje od testera następujący raport o błędzie: „Kiedy tylko wstukam masę przypadkowych znaków w okno wlogowujące, oprogramowanie zaczyna wyrabiać dziwne rzeczy.” W jaki sposób można choćby zacząć szukać przyczyny błędu nie wiedząc co to za przypadkowe znaki, jak wielka ilość wywołuje ten efekt, i jakie dziwne rzeczy się zdarzały? Skuteczny opis błędu Dobrze napisany raport o błędzie ma nastęujące cechy: • Jest jak najkrótszy. Opisuje wyłącznie fakty i szczegóły konieczne do zademonstrowania i opisu błędu. Określenie „masa przypadkowych znaków” nie jest jak najkrótsze. Należy podać dokładną sekwencję kroków, które wywołują problem. Jeśli błąd wywołują rozmaite zbiory czynnowści i danych wejściowych, podaje się kilka przykładów, zwłaszcza jeśli zawierają jakąś regularność czy inna wskazówkę, która możę ułatwić programiście lokalizację przyczyny błędu. Pisze się zwięźle i na temat. • Jest pojedynczy. Raport błędu powinien opisywać tylko jeden błąd. To brzymi jak coś oczywistego, ale czasami niełatwo jest odróżnić od siebie kilka błędów o podobnych objawach i w pośpiechu wrzuca się je wszystkie do jednego worka. Kłopot, jaki zwykle wynika z opisywania kilku różnych błędów w jednym raporcie jest taki, że zwykle tylko pierwszy z tych błędów zostaje naprawiony - pozostale są zapomniane lub zignorowane. Poza tym niemożliwe jest śledzenie statusu kilku różnych błędów jeśli opisuje je wspólny raport (więcej o tym piszemy poniżej).
Łatwo powiedzieć, że błędy należy meldować pojedynczo i nie łączyć razem w jednym raporcie, ale w rzeczywistości nie jest to zawsze takie łatwe. Przyjrzyjmy się następującemu raportowi: „Następujące pięć słów ma błędy literowe w pliku pomocy interakcyjnej…” To, oczywiście, trzeba podzielić na pięć osobnych raportów. Ale jak potraktować „Dialog wlogowania nie przyjmuje haseł ani tożsamości użytkownika zawierających duże litery”? Czy to jeden, czy dwa różne błędy? Z punktu widzenia użytkownika wygląda to jak dwa błędy, jeden dotyczący hasła i drugi dotyczący tożsamości użytkownika. Jednak na poziomie kodu może to być tylko jeden błąd, gdzie programista zapomniał uwzględnić duże litery. Zalecenie: kiedy ma się wątpliwości, lepiej rozdzielić błędy na dwa różne raporty niż je łączyć. Tester poszukuje objawów, nie przyczyn błędu. Wiele błędów może mieć wspólną przyczynę, ale nie wie się tego dopóki błąd nie zostanie naprawiony1. Lepiej popełnić błąd stwarzając omyłkowo dwa raporty tam, gdzie wystarczyłby jeden, niż opóźnić albo, co gorsza, spowodować że błąd nie zostanie w ogóle naprawiony z powodu wrzucenia kilku błędów do jednego worka.      • Jest oczywisty i ogólny. Błąd opisany nadmiernie szczegółowo, przy pomocy wielu zawiłych kroków niezbędnych do wywołania jakiegoś jednego specjalnego przypadku błędu nie skłania naprawiania go w tym samym stopniu co błąd opisany w kilku prostych, łatwych do wykonania instrukcjach pokazujących, na ile jest on ogólny i łatwo dostrzegalny przez użytkownika.
1 Raczej dopóki błąd nie zostanie znaleziony, niekoniecznie "naprawiony". Po raz któryś z rzędu wywody byłyby o wiele jeśniejsze, gdyby stosować inne określenie na objawy błędu (np. "awaria") i na jego przyczyny (np. "błąd" lub "usterka"). Przyp. tłumacza.
Raportowanie błędów znalezionych przez narzędzia do automatycznego testowania jest przykładem takiej sytuacji. Automatyczny program mógł działać przez wiele godzin zanim błąd został znaleziony. Kierownik projektu podejmujący decyzję dotyczącą tego, co zrobić z błędem, może się zawahać, czy warto naprawiać błąd, któy wymaga wielogodzinnego walenia w klawiaturę, zanim się ujawni. Jeśli jednak poświęcić chwilę analizie wyników testu, może się okazać, że nie potrzeba wcale wielu godzin - wystarczy kilka powszechnie stosowanych uderzeń w klawisze. Ten proces nazywa się izolowaniem błędu. Automayczny program po prostu przypadkiem trafił na tę sekwencję klawiszy. Jeśli chce się, aby błąd został potraktowany z uwagą, na jaką zasługuje, trzeba w raporcie opisać tych właśnie kilka „magicznych” uderzeń w klawisze, a nie tysiące wykonanych przez automatyczny program zanim dotarł on do miejsca pojawienia się błędu. • Daje się odtworzyć. Aby raport błędu został potraktowany poważnie, opisany błąd musi dać się odtworzyć - wykonanie określonego ciągu czynności spowoduje, że oprogramowanie osiągnie ten sam stan co porzednio i błąd pojawi się ponownie. Jedną z trudniejszych, ale satysfakcjonujących czynności w testowaniu są próby wyizolowania i odtworzenia tych pozornie losowych zachowań oprogramowania - niezrozumiałych zawieszeń się, przypadkowego zniszczenia danych przez program i tak dalej1. W dalszej części rozdziału poznamy kilka sposobów jak to osiągnąć. Kiedy wiadomo już, jak odtworzyć błąd przy pomocy jednoznacznej serii czynności, pora napisać raport meldujący o istnieniu tego błędu2. 73.Opisywać błędy nikogo nie oskarżając. Nietrudno, by między programistami i testerami powstały antagonizmy. Kto zapomniał, dlaczego, niech przeczyta ponownie rozdział 3ci. Programiści i cały zespół wytwarzający system może traktować raporty o błędach jako raporty o całej ich pracy, dlatego raporty błędów należy pisać stylem bezosobowym, dyplomatycznie i powstrzymując się od wydawania osądów. Raport błędów mówiący „Kod twojego sterownika drukarki jest okropny, po prostu nie działa. Nie wierzę, że ośmieliłeś się przekazać go do testowania” jest niestosowny. Raporty błędów powinno się pisać „przeciwko” błędom, a nie osobom3, i ograniczać się do opisu samych faktów. Nie należy się chwalić, nie należy się wywyższać, nie należy oskarżać. Liczą się takt i dyplomacja.
1 Szczególnie trudne staje się to w odniesieniu do programów czasu rzeczywistego - tam potrzebne są specjalne techniki szukania błędów, którcyh wystąpienie może zależeć od skomplikowanego splotu zmiennych czasowych (przyp. tłumacza).
74.Śledzić dalsze losy złożonego raportu. Jest jedna rzecz gorsza niż nie znaleźć błędu: znaleźć błąd, napisać raport, a potem o nim zapomieć lub go zgubić1. Wiemy już że testowaniae oprogramowania to ciężka praca, nie pozwólmy więc by jej owoce - znalezione przez nas błędy - zostały zmarnowane. Od momentu znalezienia błędu na testerze spoczywa odpowiedzialność, by zameldować o jego istnieniu i dopatrzeć, by poświęcono mu konieczną uwagę. Dobry tester znajduje wiele błędów. Wielki tester znajduje wiele błędów i śledzi ich dalsze losy aż do momentu, gdy zostaną naprawione. Nauczymy się więcej na ten temat w dalszej części tego rozdziału.
Te zasady - wczesne raportowanie błędów, skuteczne metody ich opisywania, używanie nieantagonizujących sformułowań, śledzenie dalszych losów raportów - są zgodne z zasadami zdrowego rozsądku. Stosują się do każdgo zadania wymagającego międzyludzkiej komunikacji. Czasami jednak w pośpiechu nietrudno o nich zapomnieć. Jednak dla testera, którey chce skutecznie meldować znalezione błędy i spowodować, by zostały naprawione, stosowanie się do tych zasad jest konieczne. Izolowanie i odtwarzanie błędów
Nauczyliśmy się właśnie, że aby skutecznie złożyć meldunek o znalezionym błędzie, trzeba go opisać przekonywująco, ogólnie i w sposób pozwalający na jego odtworzenie. Wielokrotnie jest to nietrudne. Wyobraźmy sobie, że mamy proste zadanie testowe dla programu graficznego, sprawdzające czy daje się stosować wszystkie kolory. Jeśli za każdym razem, kiedy wybiera się kolor czerwony, program rysuje na zielono, jest to oczywisty, ogólny i odtwarzalny błąd.
2 Autor spycha na testerów znaczną część odpowiedzialności za znalezienie przyczyny, a nie tylko objawów błędu. Oczywiście często nie jest to najlepsze rozwiązania, a jego ceną bywa zwykle utrata kontroli nad harmonogramem testów i to, że w budżet czasowy testowania wpisuje się czynności należące jednoznacznie do wytwarzania (przyp. tłumacza).
3 Osoba będąca pozornie "autorem" danego błędu wcale nie zawsze rzeczywiscie ponosi za niego winę: znacznie częsciej "winny" jest nierealistyczny harmonogram, brak odpowiedniego doświadczenia, brak dobrych specyfikacji i wszelki inny bałagan organizacyjny i procesowy, niż autentyczne niechlujstwo programisty (przyp. tłumacza).
1 Nie pierwszy to raz autor zdaje się byc zdania, że testerzy ponoszą odpowiedzialność za braki organizacyjne i za to, co bezwzględnie powinno należeć do obowiązków kierownika projektu, o ile nie przekaże on tej odpowiedzialności innym (przyp. tłumacza).
Co jednak począć, kiedy taki błąd pojawia się dopiero po wykonaniu kilku innych zadań testowych, ale nie występuje, jeśli to samo zadanie testowe wykonać zaraz ponownym wystartowaniu maszyny? Co począć, kiedy pojawia się losowo albo tylko w czasie pełni księżyca? Trzeba będzie wtedy zabawić się w detektywa.
Izolowanie i odtwarzanie błędów wymaga umiejętności detektywistycznych i prób ograniczenia okoliczności, w których problem występuje. Dobra wiadomość to fakt, ze „losowe” błędy nie istnieją - jeśli odtworzyć dokładnie tę samą sytuację i zastosować dokładnie te same dane wejściowe, błąd na pewno pojawi się ponownie. Kłopot polega na tym, że odtworzenie dokładnie tego samego stanu i zespołu danych wejścia może być bardzo trudne i czasochłonne. Kiedy odpowiedź już się zna, wydaje się oczywista. Zanim się ją znajdzie, zadanie może wydawać się beznadziejne. Niektórzy testerzy zdają się mieć wrodzony talent do izolowania i odtwarzania błędów. Potrafią oni odkryć błąd i potem szybko zidentyfikować dzialania i warunki, w których występuje. Dla innych taka umiejętność pojawia się dopiero wraz z rosnącym doświadczniem, kiedy znaleźli i zameldowali wiele różnych rodzajów błędów1. Każdy, kto chce być dobrym testerem, musi jednak tę umiejętność opanować, tak że warto wykorzystać każdą okazję, by próbować swoich sił w izolowaniu i odtwarzaniu błędów.
Na początek kilka dobrych rad, które przydadzą się, kiedy znajdzie się błąd wymagający bardzo wielu kroków w celu odtworzenia lub nie dający się na pozór odtworzyć w ogóle. Komu się to przytrafi, niech spróbuje wykorzystać na początek wskazówki z poniższej listy: 75.Niczego nie brać za pewnik. Zapisywać wszystko co się robi - każdy krok, każdą przerwę - wszystko. Nietrudno omyłkowo opuścić lub dodać jeden krok. Pomocą może być kolega obserwujący, co robi się w czasie testowania. Można posłużyć się też programem do nagrywania naciśniętych klawiszy oraz ruchów i kliknięć myszką. Jeśli to konieczne, można nawet posłużyć się kamerą wideo do nagrania swoich czynności. Chodzi o to, by każdy krok stał się widoczny i by można go było zanalizować z innej perspektywy.
1 Generalnie, umiejętność szybkiego izolowanie przyczyn błędów wymaga dobrej znajomości szczegółów aplikacji i jej konstrukcji, co powoduje, że skuteczniejsi pod tym względem zawsze powinni byc programiści niż testerzy. Dlatego uparcie twierdzę, że izolownie błędów to zadanie raczej dla programisty niż dla testera! (przyp. tłumacza).
76.Szukajmy sytuacji zależnych od zmiennych czasowych. Czy błąd pojawia się tylko o określonej porze dnia? Być może zależy od tego, jak szybko wprowadza się dane lub od tego, czy dane zapisuje się na wolniejszą dyskietkę zamiast na szybszy dysk twardy. Czy sieć była mocno obciążona kiedy zaobserwowało się błąd? Warto wypróbować to samo zadanie testowe na szybszym i na wolniejszym sprzęcie. Myśleć o aspektach czasowych. 77.Błędy spowodowane takimi „szklanoskrzynkowymi” okolicznościami jak warunki brzegowe, przeciążenie systemu, przecieki pamięci, czy przepełnienie zasobów danych są zwykle trudne do wyizolowania. Może się zdarzyć, że wykona się zadanie testowe powodujące zniszczenie fragmentu danych, ale odkryje się to dopiero znacznie później, kiedy będzie się z tych danych chciało skorzystać. Błędy, które nie występują po ponownym wystartowaniu maszyny, tylko dopiero po jakimś czasie, zwykle zaliczają się do tej katoegorii. Kiedy tak się dzieje, warto uważnie przyjrzeć się wykonywanym wcześniej testom, może posłużyć się dynamicznymi technikami szklanej skrzynki, aby odkryć poprzednio przeoczone uboczne skutki wykonywanych zadań. 78.Błędy zależne od stanu aplikacji pojawiają się tylko wtedy, kiedy oprogramowanie znajduje się w określonym stanie. Przykłady takich błędów to błędy, które występują tylko wtedy, kiedy program wykonywany jest po raz pierwszy albo przeciwnie, tylko wtedy kiedy program wykonywany jest kolejne razy. Może jakiś błąd pojawia się dopiero po wcześniejszym zapiszniu danych lub po uprzednim naciśnięciu jakiegoś klawisza. Takie błędy mogą na pozór wyglądać jak zależne od zmiennych czasowych, ale ważny jest nie czas, lecz kolejność, w jakiej wykonuje się zadania.
79.Warto uwzględnić zależności od zasobów, współdziałanie aplikacji z pamięcią, z siecią oraz wspólne korzystanie z zasobów sprzętowych przez różne aplikacje. Czy błąd występuje tylko na obciążonym systemie, który jednocześnie obsługuje inne programy albo komunikuje się z innymi systemami? Może się okazać, że przyczyną błędu są warunki  wyścigu (kilka procesów lub programów rywalizujących o te same zasoby), przecieki pamięci (pamięć wykorzystywana i zwracana przez program nie w całości wraca do puli pamięci pozostającej do dyspozycji systemu operacyjunego), albo jest to błąd zależny od stanu systemu, pojawijący się tylko w połączeniu z określonymi zasobami. 80.Nie wolno zapominać o sprzęcie. Inaczej niż oprogramowanie, sprzęt może psuć się wraz z upływem czasu i działać w nieoczekiwany sposób. Obluzowana karta, zapsuta kość pamięci albo przegrzany mikroprocesor mogą wywoływac awarie, które na pierwszy rzut oka wyglądaja jak skutki błędów oprogramowania, ale nimi nie są. Warto spróbować wywołać tę sama awarię na innym sprzęcie. To jest szczególnie istotne podczas wykonywania testowania konfiguracji i kompatybilności. Sprawdza się, czy ta sama awaria pojawia się tylko na jednym rodzaju sprzętu czy na wielu.
Jeśli mimo wszelkich wysiłków wciąż nie udaje się wyizolować znalezionego błędu i sporządzić zwięzłej listy kroków niezbędnych dla jego odtworzenia, trzeba mimo to zapisać informację o nim po to, by nie został zapomniany. Może się zdarzyć, że przy pomocy informacji zdobytej przez testera programista będzie w stanie błąd zidentyfikować. Ponieważ programista zna kod, więc opis symptomów, kroków zadania testowego i przede wszystkim tych czynności, które tester wykonal usiłując zidentyfkiować przyczynę awarii, mogą programiście podsunąć wskazówki, gdzie błąd może się ukrywać. Oczywiście programista nie będzie chciał ani nie powinien nawet tego robić w odniesieniu do wszystkich znajdowanych błędów1, ale niektóre szczególnie trudne wymagają pracy zespołowej. Błąd błędowi nierówny
1 Dlaczegóż by nie? Cóż za fantastyczny i nienaturalny pomysł podziału pracy, by zmuszać testerów do wykonywania zadania, w którym programista jest zdecydowanie lepszy, kosztem tego, co testerzy mają robić i w czym są lepsi, to jest testowania?! (przyp. tłumacza)
Każdy zgodzi się pewnie, że błąd niszczący dane użytkownika jest poważniejszy niż zwykły błąd literowy. Cóż jednak będzie wtedy, kiedy zniszczenie danych jest tak rzadkie, że być może żadnemu użytkownikowi nigdy się nie przytrafi, podczas gdy błąd lityerowy powoduje, że każdy użytkownik ma trudności z zainstalowaniem oprogramowania? Który błąd jest wtedy ważniejszy i powinien być naprawiony przede wszystkim? Decyzja staje się trudniejsza.
Gdyby projekt miał do dyspozycji nieskończoną ilość czasu, naprawionoby oba błędy, ale tak sie nigdy nie zdarza. Jak dowiedzieliśmy się wcześniej, w każdym projekcie informatycznym trzeba wyważać jedne błędy wobec drugich i podejmować ryzykowne decyzje. Ryzyko zawarte jest w decyzji, które błędy naprawić przede wszystkim, a które można pominąć lub zaplanować do naprawy dopiero w późniejszej wersji programu.
Składając raporty o błędach, tester często ma możliwość podania propozycji, co ma z nimi zostać zrobione. Tester klasyfikuje błędy i w zwięzły sposób opisuje ich znaczenie i skutki. Powszechnie stopsowaną metodą jest przypisanie błędowi wagi oraz priorytetu. Szczegóły tego procesu są różne w różnych przedsiębiorstwach, ale istota rzeczy pozostaje ta sama: 81.Waga oznacza jak poważny jest błąd i jakie są jego skutki dla produktu i dla użytkownika. 82.Priorytet oznacza jak ważne jest naprawienie błędu i kiedy należy go naprawić.
Podana poniżej lista często stosowanych kryteriów klasyfikacji wagi i priorytetu powinna ułatwić zrozumienie różnicy między nimi. Pamiętajmy, to są tylko przykłady. Niektóre firmy stosuja nawet dziesięć różnych poziomów, inne zadowalają się trzema. Bez wzglądu na ilość poziomów, cel jest ten sam.
Waga 1.Katastrofa systemu, utrata danych, zniszczenie danych 2.Błąd w działaniu, nieprawidłowy wynik, utrata funkcjonalności 3.Pomniejszy problem, błąd literowy, forma interfejsu użytkownika, rzadki wypadek 4.Propozycja
Priorytet
1.Natychmiastowa naprawa, uniemożliwia dalsze testowanie, bardzo widoczny 2.Musi być naprawiony przed wypuszczeniem produktu 3.Powinien zostać naprawiony w miarę możliwości 4.Można naprawić, ale można też wypuścić bez zmiany
Błąd polegający na rzadko występującym zniszczeniu danych można zaklasyfikować jako Waga 1, Priorytet 3. Błąd literowy w instrukcji instalacji systemu, powodujący że użytkownik zadzwoni po pomoc, można zaklasyfikować jako Waga 3, Priorytet 2.
Co powiedzieć o wersji programu, który „pada” natychmiast po wystartowaniu? Przypuszczalnie Waga 1, Priorytet 1. Pogląd, że przycisk należy przesunąć odrobinę na dół strony można chyba zaklasyfikować jako Waga 4, Priorytet 4.
Ta informacja jest kluczowa dla osoby lub zespołu dokonującego przeglądu raportu błędu1 i podejmującego decyzje, jakie błędy naprawiać i w jakiej kolejności. Programista, któremu przypisano 25 błędów do naprawy, powinien przypuszczalnie zacząć od błędów mających priorytet 1, zamiast najpierw odwalić najłatwiejsze. Podobnie, dwóch kierowników projektów - jednego zajmującego się grą komputerową, a drugiego - oprogramowaniem monitora pracy serca - mogliby otrzymać podobną informację i na jej podstawie podjąć diametralnie odmienne decyzje. Jeden z nich zapewne postawi na to, by aplikacja wyglądała jak najlepiej i działała jak najszybciej, zaś drugi przypuszczalnie wybierze w pierwszym rzędzie niezawodność. Informacja o wadze i priorytecie błędów jest podstawą do decyzji. Kawałek dalej w tym rozdziale zobaczymy, jak pola do wprowadzanie tej informacji używane są w rzeczywistym systemie do rejestracji i śledzenie błędów. Priorytety błędów mogą się zmieniać w trakcie trwania projektu. Błąd z początku zarejestrowany jako Priorytet 2 może zmienic się na Priorytet 4 kiedy czas ucieka i data wypuszczenia pierwszej wersji wisi nad głową. Tester który znalazł błąd powinien nieustannie kontrolować status danego błędu by upewnić się czy jest to nadal zgodne z jego zdaniem i móc dostarczać nowych danych na poparcie tego, by został naprawiony2. Cykl życiowy błędu
1 I zwykle taki zespół o wiele bardziej od pojednycznego testera powołany jest do nadawania raportom wagi i priorytetu - w takim zespola powinny znajdować się osoby z marketingu, osoby zajmujące się konstruowaiem wymagań itp (przyp. tłumacza).
2 A kontrolą polityki personalnej firmy oraz planowanej emisji nowych akcji nie powinien tester czasem też się zająć? W końcu i do tego są wyznaczone osoby, które mogą - jak w tym przykładzie kierwonictwo projektu gdzie bez nieustannej kontroli i interwencji testerów system do śledzenie raportów błędów nie działa - popeniać błędy… (sarkastyczny przypisek tłumacza).
W entomologii (badającej prawdziwe, żywe owady) określenie cykl życiowy odnosi się do to różnych etapów życia owada. Z lekcji biologii ze szkoły średniej przypominamy sobie, że stadia większości owadów to jajko, larwa, poczwarka i dorosły owad. Dlatego wydaje się na miejscu, wziąwszy pod uwagę że błędy oprogramowania nazywamy także „pluskwami”, że podobny system stadiów życiowych zastosuje się, by wyróżnić poszczególne fazy życia błędów. Fazy życiowe komputerowej „pluskwy” nie są dokładnie takie same jak prawdziwego owada, ale koncepcja jest analogiczna. Rysunek 18.2 pokazuje przykład najprostszego i optymalnego cyklu życiowego błędu oprogramowania.
Otwarty
Rozwiązany
Zamknięty
Tester znajduje i rejestruje błąd
Błąd przydzielony programiście
Programista naprawia błąd
Błąd przydzielony testerowi
Tester potwierdza że błąd został naprawiony
Tester zamyka błąd
Błąd znaleziony
Rysunek 18.2  Diagram stanów pokazuje, że komputerowa „pluskwa” ma cykl życiowy podobny do prawdziwego owada.
Na tym przykładzie widać, że kiedy błąd zostaje po raz pierwszy znaleziony przez testera, zostaje zarejestrowany i przypisany programiście do naprawy. Ten stan nazywa się stanem otwartym. Kiedy programista poprawi już kod, przypisuje go na powrót testerowi i błąd wchodzi w stan rozwiązany. Tester przeprowadza wtedy test regresywny aby potwierdzić, że błąd rzeczywiście został naprawiony i - jeśli tak jest - zamyka błąd. Błąd wchodzi wtedy w swą ostatnią fazę, w stan zamknięty.
Często cykl życiowy błędu nie jest bardziej skomplikowany: błąd zostaje otwarty, rozwiązany i zamknięty1. W pewnych sytaucjach jednak cykl życiowy nieco się komplikuje, jak widać na rysunku 18.3.
1 Zręczniej byłoby mówić o różnych stanach raportu o błędzie, nie o stanach błędu, ale taką nietypową terminologię stosuje autor (przyp. tłumacza).
W tym wypadku cykl zaczyna się tak samo jak poprzednio od tego, że tester otwiera błąd i przypisuje go programiście, ale programista nie naprawia błędu. Zdaniem programisty błąd nie jest dostatecznie istotny by umotywować naprawę, więc programista odwołuje się do kierownika projektu. Kierownik projektu zgadza się ze zdaniem programisty i umieszcza błąd w stanie „rozwiązany, nie będzie naprawiony”. Tester nie zgadza się z tą decyzją, znajduje bardziej ogólny i jednoznaczny przykład błędu, otwiera go ponownie i przypisuje kierownikowi porjektu. Kierownik projektu w oparciu o nową informację przyznaje rację testerowi i ponownie przypisuje błąd programiście do naprawienia. Programista naprawia błąd i rozwiązując go, przypisuje go testerowi, który potwierdza zniknięcie symptomów i zamyka raport błedu.
Otwarty
Otwarty
Rozwiązany (nie naprawiony)
Tester znajduje i rejestruje błąd
Błąd przydzielony programiście
Programista ocenia błąd jako zbyt drobny by go naprawiać Błąd przydzielony kierownikowi projektu
Kierownik projektu ocenia błąd jako nie wymagający naprawy
Błąd przypisany testerowi
Błąd znaleziony
Otwarty
Tester znajduje ogólniejszy przypadek awarii
Błąd przypisany kierownikowi projektu
Otwarty
Kierownik projektu akceptuje konieczność naprawy
Błąd przypisany programiście
Rozwiązany (naprawiony)
Zamknięty (jako naprawiony)
Programista naprawia błąd Błąd przypisany testerowi
Tester potwierdza, że błąd jest naprawiony
Tester zamyka błąd
Rysunek 18.3  Cykl życiowy błędu staje się niekiedy bardzo skomplikowany, jeśli proces naprawiania błędu nie przebiega tak gładko jak się oczekiwało.
Widzimy, że błąd może podlegać wielu zmianom i powracać do poprzednich stanów w czasie swego życia, czasem skacząc do punktu startowego i zaczynając cykl życiowy od początku. Rysunek 18.4 dodaje do prostego modelu z rysunku 18.2 możliwe decyzje, zatwierdzenia i powroty, które zdarzają się w większości projektów. Oczywiście, każde przedsiębiorstwo i projekt może mieć własny system, ale ten rysunek jest na tyle ogólny że powinien z grubsza pasować do większości ze spotykanych cykli życiowych błędów.
Ten ogólny cykl życiowy ma dwa dodatkowe stany i kilka dodatkowych linii łączących. Stan przeglądu ma miejsce wtedy, gdy kierownik projektu lub komitet, czasem nazywany Komisją Kontroli Zmian (Change Control Board, CCB), podejmuje decyzję czy błąd należy naprawić. W niektórcyh projektach wszystkie błędy przechodzą przez tę komisję zanim przypisane zostają programiście do naprawy. W innych projektach zdarza się to tylko pod koniec projektu albo wcale. Zwróćmy uwagę, że od stanu przeglądu jest strzałka prowadząca bezpośrednio do stanu zamkniętego. Korzysta się z niej, kiedy przegląd decyduje, że błędu nie trzeba naprawiać - jest zbyt drobny, nie jest w rzeczywistości błędem, albo wynika z błędu testowania. Dodany został stan odroczony. Przegląd może zadecydować, że błąd należy naprawić kiedyś w przyszłości, ale nie w obecnej wersji programu.
Otwarty
Rozwiązany
Zamknięty
Błąd znaleziony
Odroczony
Przegląd
Rysunek 18.4  Ten ogólny diagram stanów cyklu życiowego błędu pasuje do większości zdarzających się naprawdę sytuacji.
Dodatkowe połączenie od stanu rozwiązanego do otwartego dotyczy sytuacji, kiedy tester odkrywa, że błąd nie został naprawiony. Błąd otwiera się ponownie i cykl życiowy zaczyna się od początku. Dwie przerywane linie od stanu zamkniętego i odroczonego z powrotem do stanu otwartego wykorzystywane są rzadko, ale są na tyle ważne, że trzeba o nich wspomnieć. Ponieważ tester nigdy nie rezygnuje, może się zdarzyć, że błąd na pozór naprawiony, przetestowany i zamknięty pojawia się ponownie. Takie błędy nazywa się niekiedy regresjami. Zdarza się też, że błąd oproczony okazuje się potem na tyle poważny, że wymaga jednak natychmiastowej naprawy. Jeśli któraś z tych sytuacji ma miejsce, błąd zostaje ponownie otwarty i cały proces zaczyna się od początku.
Większość zespołów projektowych stosuje reguły dotyczące tego, kto ma prawo zmienić stan błędu lub przypisać błąd komuś innemu. Na przykład, być może tylko kierownik projektu ma prawo podjąć decyzję o odroczeniu błędu, lub tylko tester ma prawo zamknąć błąd. Ważne jest, żeby raz zanotowawszy istnienie błędu, śledzić jego drogę przez cykl życiowy, nie zgubić go i dostarczać informacji koniecznej do tego, by błąd został naprawiony i zamknięty. Systemy śledzenia błędów
W tej chwili powionno już być jasne, że proces raportowania błędów jest skomplikowanym stworem, wymagającym dużo informacji, sporo szczegółów i wiele dyscypliny, aby działać. Wszystko czegośmy się w tym rozdziale nauczyli brzmi dobrze, ale aby móc zastosować to w praktyce potrzebny jest system, który umożliwia rejestrowanie znalezionych błędów i śledzenie ich przez cały cykl życiowy. Takie są włąśnie zadania systemu śledzenia błędów.
Pozostała część rozdziału poświęcona jest opisowi podstaw takiego systemu. Podane będą przykłady systemów opartych na papierowych notatkach i systemów opartych o bazę danych. System, który będzie się stosować w rzeczywistości zależy oczywiście od przedsiębiorstwa lub od projektu, ale z drugiej strony, podstawowe zasady są dość podobne i spójne w całym przemyśle oprogramowania, tak więc ten opis powinien pozwolić poradzić sobie z każdym systemem, kórego przyjdzie nam używać.
Standard: raport incydentu
Nasz dobry przyjaciel, Standard Dokumentacji dla Testu Oprogramowania ANSI/IEEE 829 (można go znaleźć na standards.iee.org), definiuje dokument zwany Raportem Incydentu Testowego (Test Incident Report), którego zadaniem jest „udokumentować każde zdarzenie, które zachodzi w trakcie testowania i wymaga dalszego badania”. Mówiąc krótko, zarejestrować błąd1.
Przegląd standardu jest dobrym sposobem, by zebrać wszystko czegośmy się dotąd nauczyli o procesie raportowania i śledzenia błędów. Poniższa lista zawiera - nieco zmodyfikowany pod względem terminologii - zakres tego stadardu. 83.Identyfikator. Określa unikalny numer czy nazwę błędu, której używa się do poszukiwania błędu lub w odnośnikach do niego. 84.Streszczenie. Krótkie streszczenie istoty błędu. Zawiera też referencje do wersji testowanego oprogramowania, stosowanej procedury testowej, numeru zadania testowego i specyfikacji testu. 85.Opis wydarzenia. Jest to szczegółowy opis błędu, zawierający następującą informację: − Data i godzina − Imię i nazwisko testera − Użyta konfiguracja oprogramowania i sprzętu − Dane wejściowe − Kroki procedury testowej − Oczekiwane wyniki − Uzyskane wyniki − Usiłowania odtworzenia błędu wraz z opisem, co wypróbowano − Inne informacje i obserwacje, które mogą ułatwić programiście lokalizację błędu. 86.Skutki. Waga, priorytet oraz oszacowanie skutków błędu dla planu testowania, specyfikacji, procedur i zadań testowych.
1 Ściślej, zarejestować podejrzenie istnienia błędu. W najlepszym razie ma się do czynienia z oczywistą awarią, której dokładną przyczynę ujawni jednak dopiero dalsze poszukiwanie błędu. Często jednak raport dotyczy jakiegoś "podejrzanego" wydarzenia, gdzie analizy wymaga, czy była to w ogóle awaria, czy np. kłopoty ze środowiskiem testowym albo omyłka testera!
Ręczne raportowanie i śledzenie błędów
Standard 829 nie definiuje formatu raportu błędu, ale podaje przykład prostego dokumentu. Rysunek 18.5 pokazuje, jak taki papierowy raport błędu może wyglądać.
Nazwa projektu Raport Błędu Błąd nr: Oprogramowanie: Produkt: Wersja:
Tester: Data: Przypisany komu:
Waga: 1 2 3 4 Priorytet: 1 2 3 4 Odtwarzalność: TAK NIE Tytuł: Opis: Decyzja: NAPRAWIONY - DUPLIKAT - NIEODTWARZALNY - NIE DA SIĘ NAPRAWIĆ - ODROCZONY - NIE NAPRAWIAĆ Data rozwiązania: Rozwiązany przez: Wersja:
Komentarz na temat rozwiązania: Ponownie przetestowany przez: Przetestowana wersja: Data testu:
Komentarz na temat testu:
Podpisy: Autor: Tester: Programista: Kierownik projektu:
Marketing: Obsługa produktu: Rysunek 18.5  Przykładowy formularz raportu błędu pokazujący, jak wszystkie potrzebne dane można zmieścić na pojedynczej stronie.
Zwróćmy uwagę, że ten jednostronicowy formularz ma mijesce na wszelką informację potrzebną, by zidentyfikować i opisać błąd. Zawiera też pola, które wykorzystuje się, by móc śledzic błąd w trakcie jego całego cyklu życiowego. Kiedy formularz zostanie wypełniony przez testera, można go przypisać programiście do naprawy. Programista ma do dyspozycji pola, gdzie może wprowadzać dane na temat naprawy, w tym propozycje decyzji dotyczących błędu. Sa też pola, gdzie tester - po naprawieniu błędu - wprowadza informację na temat wyników ponowengo testu i może zamknąć błąd. Na dole formularza znajduje się miejsce na podpisy - wiele przedsiębiorstw stosuje zasadę, że podpisem poświadcza się akceptację tego, jak błąd został rozwiązany1.
W bardzo małych projektach papierowe formularze mogą być zupełnie wystarczające. Jeszcze we wczesnych latach 90-ych zdarzały się wielkie, krytyczne dla firmy projekty z tysiącami zarejestrowanych błędów, które stosowały papierowe formularze w celu raportowania i śledzenia błędów. Resztki tych metod trwają miejscami pewnie do dziś.
Kłopot z papierowymi formularzami jest taki, że są one… papierowe, a każdy kto kiedykolwiek usiłował coś znaleźć w jakimkolwiek systemie opartym na papierowej dokumentacji wie dobrze, jakie to bywa nieskuteczne. Wyobraźmy sobie tylko zawiłości możliwych cykli żcyiowych raportu błędu (przykład mieliśmy na rysunku 18.3), a zwątpimy, czy papierowy system jest w stanie za nimi nadążyć. Co będzie, jeśli ktoś zapragnie poznać status raportu numer 6329 albo zechce się dowiedzieć, jak wiele jest jeszcze otwartych raportów o priorytecie 1? Dzięki Bogu za arkusze kalkulacyjne i bazy danych.
Automatyczne raportowanie i śledzenie błędów
Tak samo jak z opisami zadań i procedur testowych, którymi zajmowaliśmy sie w rozdziale 17, nie ma powodu, by nie ówspółcześnić standardu ANSI/IEEE 829 i nie zaadaptować go do pracy w nowoczesnych systemach. W końcu informacja potrzebna do śledzenia błędów, taka jak dane na formularzu z rysunku 18.5, to tylko tekst i liczby - idealne zastosowaneie dla bazy danych. Rysunek 18.6 pokazuje taki automatyczny system do reportowania i śledzenia błędów, jaki można często dziś spotkać w pracy testera.
1 Bardzo anglosaskie podejście - "podchody" mające na celu skłonić np. kierownika testów, żeby wreszcie podpisał raport marnie naprawionego błędu i w ten sposób umożliwił wypuszczenie programu bywają tam przedmiotem wielu anekdot. Taki formalizm ma swoje zalety, ma też liczne wady (przyp. tłumacza).
Rysunek 18.6 pokazuje najwyższy poziom bazy danych zawierającej 3263 błędy. Poszczgólne błędy, ich identyfikatory, tytuły, status, priorytet, waga i podjęte decyzje pokazuje lista w górnej części ekranu. Dalsza informacja na temat wybranego błędu widoczna jest w dolnej części ekranu. Od razu widzi się, kto otworzył dany błąd, kto go rozwiązał i kto go zamknął. Można też przewijać wszystkie szczególy wprowadzone do raportu w ciągu cyklu życiowego błędu.
Zwróćmy uwagę na pasek z przyciskami na górze ekranu, przy pomocy których można stworzyć (otworzyć) nowy raport, jak również edytować, rozwiązać, zamknąć lub reaktywować (ponownie otworzyć) już istniejący raport. Na kolejnych stronach zobaczymy, jakie okna pojawiają się po wybraniu poszczególnych opcji.
Lisiting błędów
Skrócona informacja na temat cyklu życiowego wybranego błędu
Szczegółowe dane na temat błędu
Rysunek 18.6  Okno główne typowej aplikacji bazodanowej do raportowania błędów zawiera próbkę możliwości oferowanych przez taki system (ilustracje przedstawiają bazę danych Mantis, za zgodą Dave Ball’a i HBS International, Inc.).
Rysunek 18.7 przedstawia okno dialogowe Nowy Błąd, do którego wprowadza się dane na temat nowego błędu do zarejestrowania w systemie. Ogólny opis błędu zawiera tytuł, wagę, priorytet, dane na temat wersji oprogramowania itd. Jako komentarz wprowadza się opis tego, w jaki sposób doszło do wykrycia błędu. Ta aplikacja zawiera już gotowe nagłówki, służące jako pomoc do wypełnienia potrzebnej informacji. Wprowadzając opis nowgo błędu, trzeba tylko wypełnić wszystko po kolei - cel testu, przygotowanie zadania, kroki potrzebne do wywołania błędu, oczekiwane wyniki, otrzymane wyniki, konfigurację sprzętu i oprogramowania, której sie używało kiedy wystąpił błąd.

Szczegółowy opis danych wejściowych i kroków procedurey testowej
Rysunek 18.7 Nowy błąd zaczyna swój cykl życiowy w oknie dialogowym Nowy Błąd.
Kiedy błąd został już wprowadzony, a właściwie kiedykolwiek w trakcie jego cyklu życiowego, może okazać sie potrzebna nowa informacja uzupełniająca opis, zmiany priorytetu lub wagi, i wszelkie inne drobne zmiany danych dotyczących błędu. Rysunak 18.8 przedstawia okno, które t umożliwia.
Zwróćmy uwagę, że to okno dialogowe zawiera dodatkowe pola prócz pól dostępnych już przy wprowadzaniu nowgo błędu. W trakcie edycji opisu błędu można na przykład wprowadzić odnośnik do innego błędu, jeśli wydają się podobne lub w inny sposób spokrewnione. Programista może dodać informację na temat tego, na jakim etapie znajduje się praca nad naprawą błędu i ile czasu jeszcze na to potrzeba. Jest tam nawet pole umożliwiające „zwieszenie” błędu, jakby zamrożenie błędu na obecnym etapie jego cyklu życiowego.
Ważną funkcja pokazaną na rysunku 18.8 jest pole Komentarze. Za każdym razem kiedy modyfikuje się opis błędu, kiedy się go otwiera, zmienia, rozwiązuje i zamyka, infomracja ta zostaje zarejestrowana w polu Komnetarze. Na pierwszy rzut oka widać, jakie fazy błąd przeszedł już w swoim cyklu życiowym.
Informacja do śledzenia zmian cyklu życiowego Informacja do śledzenia zmian cyklu życiowego
Dodatkowe pola dostępne przay modyfikacji
Rysunek 18.8 Okno Edycja pozwala dodawać nowe informacje do istniejącego raportu błędu .
Rysunek 18.9 pokazuje okno stosowane wóczas gdy ktoś, zwykle programista lub kierownik projektu, rozwiązuje bład. Rozwijana lista zawiera różne możliwe rozwiązania, począwszy od Naprawiony, poprzez Nie daje się naprawić aż do Duplikat. Jeśli błąd został naprawiony, wprowadza się numer wersji programu zawierającej potrzebne zmiany, a informację na temat tego, co i jak zostało zmienione, wprowadza się do pola przeznaczonego na komentarze. Błąd zostaje następnie przypisany testerowi do ponownego przetestowania i zamknięcia.
Wiele baz danych dla raportów błędów zawiera nie tylko komnetarz dotyczący zmian, ale pełne szczegóły przeprowadzonych zmian: linię kodu, nazwę modułu, a nawet rodzaj błędu, jako że może to być istotną informacją dla testera stosującego metody szkalnej skrzynki.
Kiedy błąd został rozwiązany, zwykle przypisuje się go ponownie testerowi, aby go zamknął. Rysunek 18.10 pokazuje okno dialogowe Zamykanie. Ponieważ w bazie danych zapisano wszelkie zmiany w raporcie od momentu jego otwarcia, widzi się wszystkie decyzje podjęte po drodze i dokładny opis sposobu naprawienia błędu. Może się zdarzyć, że błąd został naprawiony inaczej niż tester się spodziewał, może inny, podobny błąd został znaleziony przez innego testera, albo programista dodał komentarz, że dany sposób naprawy jest ryzykowny. Wszelka informacja może przydać się testerowi, gdy będzie testował ponownie, aby się upewnić, czy rzeczywiście błąd został naprawiony. Jeśli błąd nie został naprawiony, po prosu otwiera się go ponownie i cykl życiowy zaczyna się od początku.
Rysunek 18.9  Okno dialogowe Rozwiązanie używane jest zwykle przez programistę, zapisującego dane na temat sposobu naprawienia blędu.
Rysunek 18.10  Raport błędu gotowy do zamknięcia zawiera do wglądu całą swoją historię.
Kiedy raz się zacznie stosować bazę danych do śledzenia błędów, człowiek dziwi się, jak można to było kiedykolwiek robić na papierze. Baza danych do śledzenia raportów o błędach staje się głównym ośrodkiem, używanym nie tylko przez testerów, do komunikowania statusu projektu, przypisywania uczestnikom projektu zadań do wykonania i - co najważniejsze - upewnienia się, że  żadne błędy nie zostaną zapomniane czy pominięte. Jest to stosowne zamknięcie tego wszystkiego, czego nauczyliśmy się w tym rozdziale na temat raportowania znalezionych błędów. Podsumowanie
Rozdział zaczął się od dziecinej historyjki o Kurczaku, który przestraszył się ogromnie, gdy żołądź spadł mu na głowę. Kurczak pomyślał, że znalazł poważny problem - błąd wagi 1, priorytetu 1 - i natychmiast zaczął biegać i krzyczeć, że wali się cały świat.
Testerowi tez może się coś takiego łatwo przydarzyć, gdy znajdzie w programie coś, co nie działa tak jak powinno. Nauczyliśmy się w tym rozdziale, że powinien istnieć formalny proces, wedle którego należy pracować aby porządnie wyizolować, zaklasyfikować, zarejestrować i śledzić dlasze losy znalezionych błędów tak, by mieć pewność, że zostaną w końcu rozwiązane i - miejmy nadzieję - naprawione.
Mały Kurczak nigdy nie czytał rozdziału 18-ego, więc nie przyszło mu do głowy nic innego niż opowiadać wszystkim spotkanym, co mu się zdarzyło. Oczywiście, to nie był dobry pomysł. Świat się nie walił. Gdyby Kurczak choć na chwilę zatrzymał się i spróbował wyizolować i odtworzyć problem, okazałoby się szybko, że to w ogóle nie był żadnen problem - że spadanie żołędzi z drzewa było zgodne z zamiarem konstruktora. Tymczasem panika i naiwność w końcu zgubiły Kurczaka. Dla tych, co nie znają tej historii: Kurczak i jego przyjaciele w końcu spotkali głodnego lisa, który zaprosił ich do swej nory, aby posłuchać całej historii.
Wypływa z tego taki morał, że dobry tester musi nie tylko umieć zaplanować swoje testy i znajdować błędy, ale także umieć metodycznie i systematycznie raportować ich istnienie. Przesadny, źle opisany albo wręcz nieprawdziwy błąd nie jest w ogóle błędem - i na pewno nie zostanie naprawiony. Pytania
Pytania mają na celu ułatwienie zrozumienia. W aneksie A „Odpowiedzi na pytania” znajdują się prawidłowe rozwiązania – ale nie należy ściągać! 1.Podaj kilka powodów, dla których błąd może nie zostać naprawiony. 2.Jakie są podstawowe zasady pisania raportów o błędach tak, aby zmaksymalizować szansę, że zostaną naprawione? 3.Podaj kilka technik izolowania i odtwarzania błędu. 4.Wyobraźmy sobie, że testując Kalkulator Windows otrzymujemy następujące wyniki: 1+1=2, 2+2=5, 3+3=6, 4+4+9, 5+5=10 i 6+6=13. Napisz stosowny tytuł raportu i opis błędu. 5.Jaką wagę i priorytet nadałbyś błędowi literowemu w nazwie firmy na pierwszym ekranie aplikacji? 6.Jakie są trzy podstawowe fazy cyklu życiowego błędu i dwa często stosowane stany dodatkowe? 7.Podaj kilka powodów, dla których system śledzenia błędów z użyciem bazy danych jest znacznie bardziej użyteczny niż system oparty na papierowych raportach.

Rozdział 17
21 września 2019, 15:39

Rozdział 17  Jak pisać zadania testowe i rejestrować ich wyniki
W TYM ROZDZIALE Cele planowania zadań testowych Przegląd planowania zadań testowych Organizacja i zarządzanie zadaniami testowymi
W rozdziale 16-ym „Planowanie testowania” poznaliśmy proces planowania i konstruowania planu testowania dla projektu. Informacje znajdujące się w tym planie są niezbędzne, ale na zbyt wysoki poziomie i zbyt abstrakcyjne, aby bezpośrednio kierować codzienną praca poszczególnych testerów.
Następny poziom w planowaniu testowania - konstruowanie zadań testowych - wpływa wprost na to, co wykonują testerzy. Początkujący tester zwykle tylko wykonuje zadania testowe skonstruowane i opisane przez kogoś innnego, ale wkrótce zaczyna się samemu pisać zadania testowe. W tym rozdziale dowiemy się, jak skutecznie wytwarzać i zarządzać zadaniami testowymi tak, aby swoja pracę testera wykonywać maksymalnie skutecznie.
Najważniejsze punkty w tym rozdziale: 26.Znaczenie konstruowania i zarządzania zadaniami testowymi 27.Co to jest specyfikacja projektu testów 28.Co to jest specyfikacja zadania testowego 29.Jak pisze się procedurę testową 30.Jak zorganizować zadania testowe Cele planowania zadań testowych
W początkowych rozdziałach tej książki była mowa o różnych modelach wytwarzania oprogramowania i jak różne techniki testowe dają się zastosować, by w tych modelach móc realizować skuteczne testowanie. W modelach skokowym i prób i błędów, testerzy są na łasce i niełasce projektu, często muszą domyślać się, co mają testować i czy znajdowane anomalie to rzeczywiście błędy? Przy zastosowaniau bardziej sformalizowanych modeli wytwarzania testowanie staje się nieco łatwiejsze, ponieważ ma się do dyspozycji dokumentację, taką jak specyfikacja wymagań i specyfikcaja architektury. Tworzenie oprogramowania - projektowanie, architektura i programowanie - stają się prawdziwym procesem, a nie tylko chaotyczną gonitwą, żeby produkt jak najszybciej wepchnąć użytkownikowi. W takim środowisku testowanie staje sie o wiele bardziej skuteczne i przewidywalne.
Dobrze zorganizowany projekt jest korzystny dla wszystkich, nie tylko dla testerów. Wiemy już, że programista, który natychmiast zaczyna produkować kod na podstawie specyfikacji wyagań, nie sporządziwszy wprzódy planu konstrukcji i nie poddawszy jej przeglądowi, przypuszczlanie narobi więcej szkody niż korzyści. Podobnie, tester konstruujący zadania testowe na podstawie tylko planu testowania, zapewne nie osiągnie zachwycających wyników. Jeśli testerzy oczekują od innych zdyscyplinowania, powinni sami świecić dobrym przykładem.
Satranne i metodyczne planowanie zadań testowych jest krokiem we właściwym kierunku. Jest ono istotne z czterech powodów: 31.Organizacja. Nawet w niewielki projekcie mogą istnieć tysiące zadań testowych, skonstruowanych przez kilku różnych testerów w ciągu kilku miesięcy czy nawet lat. Właściwie zaplanowana organizacja pozwoli innym korzystać z nich wygodnie i skutecznie. 32.Powtarzalność. Jak już wiemy, w trakcie projektu niejednokrotnie trzeba te same zadania testowe powtarzać więcej niż raz, szukając nowych błędów i sprawdzając, czy błędy znalezione wcześniej zpostały dobrze naprawione. Bez odpowiedzniego planowania, nie dałoby sie stwierdzić, które zadania rzeczywiście zostały wykonane i w jaki sposób, tak żeby móc je powtórzyć dokładnie tak sao. 33.Zarządzanie. W trakcie projektu trzeba umieć odpowiedzieć na kilka ważnych pytań. Ile zadań testowych planowało się wykonać? Ile zostało wykonanych na ostatniej wersji programu? Ile przeszło, a ile zawiodło? Ilu zadań nie wykonano? I tak dalej. Nie zaplanowawszy odpowiedznio układu zadań testowych, nie da się na te pytania udzielicć sensownych odpowiedzi. 34.Dowód przeprowadzenia testów. Przy wytwarzaniu systemów krytycznych ze względu na bezpieczeństwo, często trzeba móc udowodnić, że naprawdeę wykonało się wszystkie zaplanowane zadania testowe. Niezgodne z prawem - i niebezpieczne - jest wówczas wypuszczenie oporogramowania, na którym nie wszystkie zaplanowane testy zostały wykonane. Właściwie zaplanowane zadania testowe i rejestracja ich wyników pozwala udowowdnić, co się naprawdę przetestowało.
Nie należy mieszać planowania zadań testowych z ich identyfikacją, o której nauczyliśmy się w części II-iej „Podstawy testowania”. Tamte rozdziały uczyły nas, jak testować i jak wybierać zadania testowe, podobnie jak programistów uczy się programowania w danym języku. Planowanie zadań testowych jest kolejnym krokiem, podobnym do tego, kiedy prograista uczy się, jak projektować architekturę wyższego rzędu i jak poprawnie udokumentowac swoją pracę. Testowanie ad hoc Tak zwane testowanie ad hoc polega na ty, że oprogramowanie testuje się bez planu - nie ma się żadnych zadań testowych ani nawet planu testowania, tylko tester zasiada przed komputerem i zaczyna walić w klawisze. Niektórzy mają do tego wrodzony talent i szybko zaczynają znajdować błędy. Robi to zwykle wrażenie i może być cennym uzupełnieniem planowanych testów - na przykład w czasie zmasowanego „ataku na błędy” - ale nie jest zorganizowane, nie daje sie powtórzyć, nie daje się nim zarządzać, a kiedy jest zakończone, nie ma żadnego dowodu, że rzeczywiście zostało zrobione. Tak jak tester woli unikać oprogramowania, które powstało metodami ad hoc, tak klienci nie chcą mieć do czynienia z oprogramowaniem, które w sposób ad hoc zostało przetestowane. Przegląd planowania zadań testowych
Jak więc właściwie planowanie zadań testowych mieści się w wielkim planie testowania? Rysunek 17.1 pokazuje zależności między różnymi typami planów.
Plan Testowania
Specyfikacja Projektu Testów
Plan Testowania Plan Testowania Specyfikacja Zadań Testowych
Plan Testowania Plan Testowania Specyfikacja Procedur Testowych
Specyfikacja Projektu Testów Rosnąca rola procesu tworzenia planu
Rosnąca rola pisemnego planu
Rysunek 17.1 Planowanie testowania na rożnych poziomach jest ze soba ściśle powiązane. Różnica polega na tym, czy najważniejszy jest sam plan, czy też proces jego konstruowania.
Wiemy już, że w przypadku planu testowania na poziomie projektu ważniejszy jest proces planowania niż sam pisany dokumnet. Następne trzy poziomy: specyfikacja projektu testów, specyfikacja zadań testowych i specyfikacja procedur testowych, opisane są w dlaszych częściach tego rozdziału.
Jak widać na rysunku 17.1, im niżej schodzi w hierarchii tych dokumentów, tym ważniejszy staje się sam napisany dokumnet, a mniej ważny proces jego konstruowania. Te dokumenty bowiem - zwłaszcza specyfikacja zadań testowych i specyfikacja procedur testowych - używane są cały czas przez testerów wykonujących zadania testowe. Jak się dowiemy, na najniższym poziomie specyfikacja staje się szczegółową instrukcją jak - krok po kroku - wykonać zadanie testowe, przez co szczególnej wagi nabieraja dobra organizacja, przejrzystość i zwięzłość materiału, a mniej ważne jest, jakimi sposobami udało się to osiągnąć.
Treść tego rozdziału opiera się na Standardzie Dokumentacji Testu Oprogramowania1 ANSI/IEEE Std 829-1983 (dostępny pod http://standards.ieee.org). Wiele zespołów testowych dostosowało swoją dokumentację testowania do niego - świadomie lub nie - ponieważ ten standard stanowi logiczną i zdroworozsądkową zarazem medodę planowania testowania. Należy zdawać sobie sprawę, że o ile nie jest się zobligowanym do ścisłego przestrzegania tego standardu przez oficjalną politykę swego przedsiębiorstwa lub gałęzi przemysłu, należy posługiwać się nim raczej jako zbiorem dobrych rad niż jak szczegółowym standardem. Zarówno jego treść jak i proponowane w nim metody są dziś równie aktualne jak w 1983, kiedy standard powstał. Jednak to, co niegdyś najlepiej było przedstawić w formie pisanego dokumentu, dziś często lepiej i skuteczniej jest zrealizować w postaci arkusza kalkulacyjunego albo bazy danych. Przykłady takich sytuacji znajdują się w dalszej części tego rozdziału.
Podsumuwując, plan testowania dla zespołu testującego powinien obejmować pałny zakres planu testowania wg ANSI/IEEE 829. Jeśli najlepsze są dla kogoś papierowe wydruki (choć trudno w to uwierzyć), nichże je stosuje. Jeśli ktoś jest zdania, że najlepsza będzie centralna baza danych, a zespół dysponuje czasem i budżetem, by ją stworzyć samemu albo zakupić, nic nie stoi na przeszkodzie. Ważne jest tylko, by zakończywszy pracę, osiągnąć cztery główne cele planowania zadań testowych: organizację, powtarzalność, kontrolę i dowodzenie poprawności.
Grupy  zadań testowych2
1 Standard for Software Test Documentation (przyp. tłumacza).
2 Autor dzieli - zgodnie ze standardem - opis zadań testowych na trzy poziomy: grupy zadań testowych (test design), zadania testowe (test cases) oraz procedury testowe (test procedures). W rzeczywistości
Plan testowania pisze się na bardzo ogólnym poziomie. Dzieli się w nim oprogramowanie na poszczególne funkcje i elementy dające się przetestować, ale nie wyszczególnia jak będzie się je testować. Być może określi się zastosowanie automatyzacji, testowania czarnej skrzynki lub szkalnej skrzynki, ale plan nie wchodzi w szczegóły, gdzie i jak te metody zastosować. Kolejny poziom szczegółowości, opisujący sposób testowania poszczególnych funkcji i elementów, to specyfikacja grup zadań testowych (projekt konstrukcji zadań testowych), której poświęcony jest ten podrozdział.
ANSI/IEEE 829 stwierdza, że specyfikacja grup zadań testowych „opisuje bardziej szczegółowo metody [opisane w planie testowania] oraz identyfikuje funkcje, które należy uwzględnić przy tworzeniu konstrukcji testów1. Ponadto określa się zadania i procedurey testowe, o ile są wymagane, konieczne do osiągnięcia celu testowania, oraz kryteria zaliczenia/niezaliczenia.”
Celem tej specyfikacji jest zorganizowanie i opisanie testowania, które musi być wykonane na danej funkcji. Nie zawiera ona jednak szczegółowych zadań testowych ani opisu poszczególnych kroków koniecznych do wykonania zadania testowego. Następujące elementy - zaadaptowane ze standardu ANSI/IEEE 829 - powinny wchodzić w skład tej specyfikacji: 35.Identyfikatory. Unikalny identyfikator daje możliwość referowania do specyfikacji. W specyfikacji powinny znajdować się referencje do ogólnego planu testowania i do wszelkich innych wykorzystanych planów i specyfikacji. 36.Funkcje do przetestowania. Opis funkcji oprogramowania, której dotyczy ta specyfikacja, na przykład „funkcja dodawania Kalkulatora”, „wybór i wyświetlenie wielkości czcionki w WordPad”, „test konfiguracji karty wideo w QuickTime”.
cześciej spotyka się podział dwupoziomowy: zadania testowe (co jest testowane) opisane w specyfikacji testowania (test specification) oraz procedury testowe - zwane też często instrukcjami testowymi - (jak wykonać zadanie testowe). W wielu przedsiębiorstwach nawet te dwa poziomy zlewają się w jeden ("co" i "jak" opisane wspólnie w jednym dokumencie). Dodatkowo komplikuje sprawę fakt, że dla wygody i szybkości wykonywania zadań testowych zwykle opłaca się łączyć je w długie ciągi, obejmujące wiele zadań testowych (np. w ramach jednej procedury wpisać, usunąć i dokonać ponownej próby usunięcia osoby z bazy danych - trzy różne zadania testowe). Przyp. tłumacza.
1 Co to jest "test" standard nie wyjaśnia - to brak konsekwencji i spójności typowy dla wielu międzynarodowych i branżowych standardów (przyp. tłumacza).

W tej części wylicza się też funkcje, które zostaną przetestowane jako efekt uboczny podczas testowania głównej funkcji. Na przyklad: „choć nie wchodzi to w zakres niniejszego planu, interfejs użytkownika okna dialogowego otwierania plików zostanie przetestowany w trakcie testowania funkcji ładowania i zapisywania”. Wymienia się też funkcje których się nie przetestuje, lecz o których można by fałszywie sądzic że będą przetestowane przy okazji testowania głównej funkcji. Na przykład: „testowanie funkcji dodawania Kalkulatora zostanie wykonane automatycznie przy pomocy programu wysyłającego dane o naciśniętych klawiszach wprost do aplikacji, nie zostanie więc wykonane żadne pośrednie testowanie interfejsu użytkownika. Testowanie interfejsu użytkownika opisane jest w innej grupie zadań testowych”. 37.Metody. Ogólny opis metody zastosowanej do przetestowania danej funkcji. Opis metody - często zawarty już w planie testowania - zostaje tutaj pogłębiony, technika szczegółowo zdefiniowana, a sposób weryfikacji poprawności wyników określony.

Na przykład: „Zostanie sporządzone narzędzie do sekwencyjnego ładowania i zapisywania przygotowanych wcześniej plików różnych rozmiarów. Ilość plików z danymi, ich rozmiary oraz rodzaj danych zostaną określone przy pomocy technik czarnej skrzynki i uzupełnione przykładami uzyskanymi metodą szkalnej skrzynki, przygotowanymi przez programistów. Weryfikacja wyników testów będzie wykonana poprzez proównanie (na poziomie pojedynczych bitów) zapisanego pliku z oryginałem, przy użyciu narzędzia do proównywania plików”. 38.Identyfikację zadań testowych. Lista i zwięzłe definicje zadań testowych użytych do przetestowania danej funkcji. Należy okreśłić użyte klasy równoważności i podać referencje do zadań, które je testują. Na przykład: Sprawdzenie najwyższej możliwej wartości - Zadanie testowe nr 10 Sprawdzenie najniższej możliwej wartości - Zadanie testowe nr 11 Sprawdzenie kilku różnych potęg dwójki - Zadanie testowe nr 12 Nie należy w tym miejscu określać dokładnie stosowanych wartości. Dla celów inspekcji specyfikacji pod kątem pokrycia testowego, o wiele istotniejsze jest podanie klas równoważności niż konkretnych wartości użytych do ich przetestowania.
39.Kryteria zaliczenia/niezaliczenia. Określa się dokładnie jakie są warunki pozytywnej i negatywnej weryfikacji testowanej funkcji. Niekiedy jest to proste - funkcję uznaje się za działającą poprawnie, jeśli wszystkie zadania testowe zostaną wykonane bez znalezienia błędu. Czasem jest niejednoznaczne - np. funkcję weryfikuje się negatywnie, jeśli niezaliczonych zostało poad 10% zadań testowych. Nie powinny jednak istnieć żadne wątpliwości co do samego sformułowania kryterium. Tak, awaria systemu to błąd Pracowałem kiedyś w projekcie, gdzie test konfiguracyjny aplikacji multimedialnej został przekazany wyspecjalizowanej firmie. Nie była to najlepsza firma, ale jedyna dostępna w tym momencie. Żeby mieć pewność że wszystko zostanie wykonane zgodnie z zasadami sztuki, przekazano testującej firmie specyfikacje grup zadań testowych, specyfikacje zadań testowych i procedury testowe - w ten sposób nie powinno było być żadnych wątpliwości, co zostało, a co nie zostało przetestowane. Minęło kilka tygodni i wszystko zdawało się przebiegać gładko - zbyt gładko - kiedy pewnego dnia zatalefonował kierownik zespołu testującego. Złożył raport na temat tego, co znaleziono w ciągu tygodnia - nie było tego wiele -  i tuż przed odłożeniem słuchawki zapytał, czy ma również raportować błędy nie uwzględnione w dokumentacji. Okazało się, że od pierwszego dnia jego testerzy od czasu do czasu spotykali się z tymi dużymi, białymi komunikatami mówiącymi coś na temat „błędu ochrony pamięci”. Komunikaty te lekceważono, ale po jakimś czasie ekran komputera stawał się jaskrawoniebieski z kolejnym niezrozumiałym meldunkiem o błędzie, co już wymagało ponownego wystartowania maszyny. Ponieważ taki błąd nie był wymieniony jako kryterium niepowodzenia zadania testowego, kierownik zespołu nie był pewien, czy było to ważne i postanowił się upewnić1.
Zadania testowe
W rozdziałach od 4-ego do 7-ego opisane zostały podstway testowania oprogramowania - analizowanie specyfikacji, kodu źródłowego i całej aplikacji po to, by móc wygenerować minimalną ilość zadań testowych, które umożliwiają skuteczne przetestowanie tego oprogramowania. Nie omawiano jednak kwestii, jak najlepiej opisać i udokumentować wybrane zadania testowe. Kto zajmował się już testowaniem, zetknął się przypuszczalnie z rozmaitytmi sposobami i formatami zapisu. Ta część książki pozwoli zpoznać się bliżej z różnymi możliwośćiami.
1 Sarkazm autora jest trochę nie na miejscu - to, że tester czy automatyczny program testujący zignoruje nieprzewidziane skutki uboczne zadania testowego, jest zjawiskiem często spotykanym. Zapobieganiu mu służy zespół technik testowania zwany analizą dynamiczną (przyp. tłumacza).
ANSI/IEEE 829 definiuje, że specyfikacja zadań testowych „dokumentuje faktyczne wartości użyte jako dane wejściowe wraz z oczekiwanymi wartościami danych wyjściowych. Opis zadania testowego określa także ograniczenia dotyczące procedury testowej wynikające z zastosowania tego właśnie zadania testowego”.
Szczegóły opisu zadania testowego powinny więc wyjaśniać dokładnie, jakie wartości lub warunki wprowadzane są do testowanego oprogramowania i jakiego należy spodziewać się wyniku1. Standard ANSI/IEEE 829 wylicza także niektóre inne ważne pozycje, które powinny się w tym opisie znaleźć: 40.Identyfikatory. Jednoznaczny identyfikator, do którego odnośniki znajdują się zarówno w specyfikacji grup zadań testowych, jak i w specyfikacji procedur testowych. 41.Przedmiot testu. Opisana tu jest w szczegółach funkcja, moduł, czy inny przedmiot testu. Ten opis jest dokładniejszy niż w listach funkcji znajdujących się w specyfikacji grup zadań testowych. Gdy na przykłąd specyfikacja grupy zadań testowych określiła testowaną funkcję jako „dodawanie na Kalkulatorze”, to specyfikacja zadania testowego określi na przykład „test górnej granicy w procedurze obsługi przepełnienia”. Powinny się tutaj też znaleźć odnośniki do specyfikacji produktu lub innych specyfikacji, na podstawie której stworzone zostało to zadanie testowe. 42.Specyfikacja danych wejściowych2. Określa się tu wszelkie dane wejściowe i inne warunki zapoczątkowujące wykonanie zadania testowego. Jeśli testuje się Kalkulator, te dane mogą być tak proste jak na przykład 1+1. Kiedy testuje się oprogramowanie centrali do telefonii komórkowej, ma się do czynienia z setkami i tysiącami warunków wejściowych. Kiedy testuje się aplikację do obsługi plików, danymi wejściowymi mogą byc np. nazwa pliku oraz jego zawartość.
1 Autor bez wątpienia się tu bez wszelkiej potrzeby powtarza - tłumacz prosi o wybaczenia, ale taki jest często styl amaerykańskich książek…
2 Autor zdaje się - przypuszczalnie dla uproszczenia - utożsamiać dane wejściowe z czynnościami uruchamiającymi zadanie testowe, zaś dane wyjściowe - z wynikiem zadania testowego. Tak jest bardzo często, ale na pewno nie zawsze: na przykład wynikiem zadania testowego może być zmiana stanu programu, zmiana danych w rejestrze lub bazie danych, a nawet to, że żadna dająca się zaobserwować zmiana nie następuje! (przyp. tłumacza).
43.Specyfikacja danych wyjściowych. Jest to opis oczekiwanyego wyniku wykonania zadania testowego. Czy 1+1 dało wynik równy 2? Czy tysiące danych wyjściowych otrzymało prawidłowe wartości w aplikacji obsługi centrali? Czy zawartość pliku została prawidłowo załadowana? 44.Definicja wymagań środowiska. Wymagania środowiska to sprzęt, oprogramowanie, narzędzia do testowania, warunki, personel itd. potrzebne do wykonannia zadania testowego. 45.Szczególne wymagania proceduralne. Tutaj opisuje się wszystkie odbiegające od normy wymagania, które muszą być spełnione, aby móc wykonać zadanie testowe. Testowanie programu WordPad pewnie niczego takiego nie wymaga, ale testowanie elektrowni atomowej - przypuszczalnie tak. 46.Zależności pomiędzy zadaniami testowymi. W rozdziale 1-ym „Podstawy Testowania” znajdował się opis błędu, który spowodował katastrofę lądownika NASA na Marsie. Jest to doskonały przykład nieudokumentowanej zależności między zadaniami testowymi. Jeśli jedno zadanie zależy od drugiego albo może podlegać wpływom jeszcze innego zadania testowego, tę informację należy tutaj umieścić.
Czy już wpadamy w panikę? Jeśli ściśle przestrzegać opisanych tu zasad dokumentowania zadań testowych, to trzeba by było pisać co najmniej stronę tekstu do każdego zadania testowego! Tysiące zadań testowych wymagałyby tysięcy stron specyfikacji. Projekt byłby opóźniony zanim jeszcze skończyłoby się ją pisać.
Oto jeszcze jeden powód, dla którego standard ANSI/IEEE 829 należy traktować jako wskazówkę raczej niż przestrzegać go w 100 procentach - o ile się nie musi. Wielel projektów rządowych i niektóre gałęzie przemysłu muszą dokumentować zadania testowe aż w tym stopniu, ale zwykle można sobie pozwolić na uproszczenia.
Uproszczenia i skróty nie mają oznaczać, że odrzuca się lub pomija istotną informację, a jedynie że usiłuje się znaleźć bardziej skuteczne metody przekazywania tej informacji. Na przykład, nie istnieje żaden powód, żeby ograniczać się do specyfikowania zadań testowych w formie opiosowej. Rysunek 17.2 pokazuje przykład macierzy do testowania kompatybilności drukarki.

Identyfikator zadania testowego
Producent drukarki
Model Tryb pracy Opcje

Czarno-biały … Kolorowy … Wysoka rozdzielczość Średnia rozdzielczość Niska rozdzielczość
Tekst Superfoto Automatyczny Roboczy Tekstowy …
Rysunek 17.2  Zadania testowe często można opisać przy pomocy maacierzy lub tabeli.
Każda linia macierzy jest zadaniem testowym mającym własny identyfikator. Pozostała informacja - przedmiot testu, specyfikacja danych wejściowych, specyfikacja danych wyjściowych, wymagania środowiska, specjalne wymagania i zależności - jest przypuszczalnie jednakowa dla wszystkich wymienionych zadań i może być opisana dla nich wspólnie gdzieś indziej. Dokonując przyglądu specyfikacji można najpierw przeczytać i skontrolować tę wspólną informację, a następnie łatwo przejrzeć tabelę pod kątem pokrycia testowego.
Inne możłiwe sposoby opisywania zadań testowych to listy albo nawet diagramy graficzne takie jak diagram stanów programu albo diagram przepływu danych. Chodzi o to, by przekazać komu innemu opis zadania testowego i wybiera się najskuteczniejszy sposób. Warto być pomysłowym i twórczym, pamiętając jednak, że głównym celem jest udokumentowanie zadań testowych.
Procedury testowe
Udokumentowawszy grupy zadań testowych i zadania testowe, pozostaje jeszcze opisanie procedur, według których zadania testowe będą wykonywane. ANSI/IEEE 829 stwierdza, że specyfikacja procedur testowych „identyfikuje wszystkie kroki niezbędne do sterowania systemem i wykonania określonych zadań testowych w celu urzeczywistnienia grupy zadań testowych.”
Procedura tesotwa albo skrypt testowy definiuje kroki określające w szczegółach jak wykonać zadanie testowe. Oto znajdująca się w niej informacja: 47.Identyfikator. Unikalny identyfikator, łączący procedurę z odpowiednim zadaniem testowym i z grupą zadań testowych. 48.Cel. Cel procedury i odnośniki do zadań testowych, które realizuje. 49.Specjalne wymagania. Inne procedury, specjalne umiejętności testerów, albo specjalny sprzęt potrzebny do wykonania procedury. 50.Kroki procedury. Szczegółowy opis jak wykonywać test: − Log. Opis w jaki sposób będzie się nagrywać i zapisywać wyniki i inne obserwacje. − Przygotowanie. Wyjaśnienie jak przygotować test. − Start. Wyjaśnia jakie kroki potrzeben są by zacząć wykonywanie testu.
− Procedura. Opis kroków w trakcie wykonywania testu. − Pomiar. Wyjaśnienie, jak uzyska się wyniki zadań - na przykład przy pomocy stopera albo obserwacji wizualnej. − Zatrzymanie. Wyjaśnienie, jak czasowo zawiesić wykonywanie testu. − Ponowny start. Wyjaśnienie dla testera w jaki sposób ponownioe podjąć wykonywanie zadania w określonym miejscu, jeśli przyczyną zawieszenia była awaria lub zawieszenie się całego systemu. − Zakończenie. Opisuje kroki jak w kontrolowany sposób zakończyć test. − Odtworzenie warunków. Wyjaśnia jak doprowadzić środowisko do stanu poprzedzającego wykonywanie testu. − Nieprzewidziane wypadki. Wyjaśnia co robić, kiedy coś dzieje się niezgodnie z planem.
Nie wystarczy, by procedura testowa brzmiała na przykład: „Prosze wykonać następujące zadania testowe i napisać w raporcie co się stało…” Byłóby to proste i łatwe do napisania, ale nie mówiłoby testerowi nic o tym, jak wykonywać samo testowanie. Taka instrukcja nie byłaby powtarzalna i nie byłoby żadnego sposobu udowodnienia, które kroki zostały w rzeczywistości wykonane. Używając szczegółowej procedury wie się dokładnie, co i jak będzie testowane. Rysunek 17.3 pokazuje fragment fikcyjnego przykładu procedury testowania dla Kalkulatora Windows.
Realistyczny poziom szczegółowości
Stare powiedzenie „najlepszy jest złoty środek” stosuje się w zupełności do planowania zadań testowych. Pamiętajmy o czterech podstawowych celach: organizacji, powtarzalności, kontroli i uzyskaniu dowodów. Tester produkujący zadania testowe działa z grubsza w kierunku osiągnięcia tych celów, ale ich poziom określają wymagania branżowe, przedsięborstwa, projektu lub nawet zespołu. Zwykle tester nie musi dokumentować swoich zadań testowych na bardzo szczegółowym poziomie, ale też względnie rzadko ląduje się w bałaganiarskim projekcie, gdzie w ogóle niczego nie trzeba dokumentować. Zwykle praca testera znajduje się gdzieś między tymi dwiema wartościami brzegowymi.
Sztuką jest utrafić we właściwy poziom. Przypatrzmy się procedurze pokazanej na rysunku 17.3, która wymaga, że na PC musi być zainstalowany system Windows 98. Procedura wprawdzie stwierdza w części wstępnej, że potrzebne jest Windows 98, ale nie precyzuje jaka wersja. Co się stanie za rok lub dwa, kiedy pojawi się kolejna wersja Windows 98? Czy procedurę trzeba będzie zmienić, by uwzględnić tę zmianę? Aby uniknąć tego kłopotu, można pominąć numer wersji i użyć określenia „najnowsza”, ale co począć, gdy nowa wersja pojawi się w trakcie cyklu produkcyjnego? Czy należy wówczas zmienić używaną do testowania wersję w trakcie projektu?
Identyfikator: WinCalcProc98. 1872
Cel: procedura opisuje kroki, które należy wykonać aby uruchomić zadania testowe funkcji Dodawanie, od numeru WinCalc98.0051 do WinCalc98.0185.
Specjalne wymagania: Nie jest potrzebny żaden sprzęt ani oprogramowanie prócz tego, które okreśłone jest w opisie samych zadań testowych.
Kroki procedury:
Log: Tester posłuży się aplikacją WordPad z szablonem Testowanie do notowania przebiegu wykonania procedury. Wszystkie pola zaznaczone jako obowiązkowe muszą być wypełnione. System do rejestracji i śledzenia błędów Mantis służy do rejestracji wszelkich problemów, które zaistnieją w trakcie wykonywania procedury.
Ustawienie: Tester musi zainstalować czystą kopię Windows 98 na swojej maszynie przed wykonaniem procedury. Przed zainstalowaniem najnowszej wersji Windows 98 należy posłużyć się aplikacjami WipeDisk i Clone. Więcej wiadomości na temakt posługiwania się tymi narzędziami można znaleźć w dokumencie „Zaczynając od nowa”.
Start: Wystartować Windows 98 Kliknąć przycisk Start Wybrać Programy Wybrać Akcesoria Wybrać Kalkulator.
Procedura: Dla każdego z podanych wyżej zadań testowych, należy wprowadzić dane przy użyciu klawaitury (nie klawiszy numerycznyych widocznych na ekranie) i proównać wynik z oczekiwanym.
Pomiar: …
Rysunek 17.3  Przykład (fikcyjny) procedury testowej pokazuje ilość szczegółów, które trzeba uwzględnić.
Inna kwestia to zalecenie procedury, aby zainstalować „czystą kopię” Windows 98. Co to oznacza? Procedura wymienia kilka narzędzi, WipeDisk i Clone, którymi należy posłużyć się w trakcie czynności poprzedzających test, i odsyła testera do innego dokumentu po wyjaśnienia jak się nimi posłużyć. Czy kroki procedury nie powinny być bardziej szczegółowe i wyjaśnić, gdzie dokładnie znajduje się ten dokument i te narzędzia? Kto kiedykolwiek instalował system operacyjny, wie również, że jest to skomplikowany proces i  że instalator musi odpowiedzieć na wiele pytań i wybrać wiele możliwych opcji. Czy ta albo inna procedura testowa powinna wchodzić w tego typu szczegóły? Jeśli nie, to skąd będzie można wiedzieć, na jakiej dokładnie konfiguracji wykonano testy. Jeśli tak, a proces instalacji kiedyś ulegnie zmianie, może to oznaczać konieczność poprawienia stetek innych procedur testowych. Co za zamieszanie!
Niestety nie istnieje jedna, poprawna odpowiedź. Bardzo szczegółowe specyfikacje testów redukują niejednoznaczność, powodują że zadania testowe są powtarzalne i pozwalają doświadczonym testerom wykonywać je dokładnie zgodnie z opisem. Z drugiej strony, tak dokładny opis wymaga czasu i wysiłku, utrudnia zmiany oraz - z przyczyny tej całej masy szczegółów - hamuje testowanie, powodując że wymaga ono więcej czasu.
Piszać zadania testowe najlepiej dostosować się do standardów projektu, w którym się pracuje. Testując nowy sprzęt medyczny, będzie się przypuszczalnie pisać o wiele bardziej szczegółowe procedury niż przy testowaniu nowych gier komputerowych. Jeśli ma się za zadanie ustalenie metodyki i rekomendacji sposobu opisywania grup zadań testowych, zadań testowych i procedur testowych dla nowego projektu, najlepiej wziąć pod uwagę formaty zdefiniowane przez ANSI/IEEE 829, wypróbować kilka przykładów i stwierdzić, co najlepiej pasuje do zespołu i do wymagań projektu. Organizacja i zarządzanie zadaniami testowymi
Pisząc dokumentację trzeba brać pod uwagę, w jaki sposób informacja jest zorganizowana i jak będzie ją można znajdować. Oto przykłady pytań na które tester - albo zespół tesowy - powinien umieć odpowiedzieć: 51.Które zadania testowe będą wykonane? 52.Ile zadań planuje się wykonać? Ile czasu to zajmie? 53.Czy jest się w stanie wybrać grupy zadań testowych dostosowane do testowania wybranej funkcji albo części systemu? 54.Czy będzie się w stanie zanotować, które zadania zostały zaliczone, a które nie, podczas ich wykonywania?
55.Spośród zadań które nie zostały zaliczone, ile nie zostało zaliczonych również podczas wcześniejszych prób? 56.Jaki procent zadań testowych zostało zaliczonych poprzednim razem?
To są przykłady ważnych pytań, które często spotyka sie w trakcie typowego projektu. W rozdziale 19-ym „Pomiar sukcesu” zajmiemy się zbieraniem danych i statystki dokładniej, ale w tej chwili uznajmy po prostu że potrzebny jest jakiś proces pozwalający na kontrolę zadań testowych i rejestrację ich wyników. Istnieją cztery opdstwaowe typy systemów: 57.W głowie. Nie powinno się tego nawet brać pod uwagę nawet w najprostszych projektach, chyba że testuje się oprogramowanie do własnego prywatnego użytku i nie ma sie żadnego powodu dokładnego śledzenia przebiegu testowania. 58.Papier/dokumenty. W małych projektach możliwe jest zarządzanie zadaniami testowymi wyłącznie na papierze. Służyły do tego niejednokrotnie zupełnie dobrze tabele i listy kontrolne. Jest to oczywiście metoda słaba z punktu widzenia organizowania i poszukiwania danych, ale ma jedną cechę dodatnią: lista kontrolna na papierze zawiera zwykle sygnaturę albo podpis testera, co w razie potrzeby stanowi doskonały dowód w sądzie, że testy faktycznie zostały wykonane. 59.Arkusz kalkulacyjny. Popularną i bardzo dobrze działającą metodą organizowania zadań testowych jest umieszczenie ich w arkuszu kalkulacyjnym. Na rysunku 17.4 znajduje się przykład zastosowania tej metody. Dzieki temu, że wszystkie dane na temat zadań testowych zgromadzone sa w jednym miejscu, arkusz kalkulacyjny pozwala na skuteczną i szybka ocenę statusu testowania. Łatwo sie go używa, względnie łatwo konstruuje, a przede wszystkim przy jego pomocy można zupełnie dobrze organizować i kontrolować zadania testowe oraz rejestrować ich wyniki.

Rysunak 17.4  Do organizacji i zarządzania zadaniami testowymi można używać arkuszy kalkulacyjnych. 60.Baza danych. Najlepsza metodą organizacji zadań testowych jest baza danych skonstruowana specjalnie pod tym kątem. Wiele dostępnych na rynku narzędzi jest skonfigurowanych waśnie pod w ten sposób. Korzystając z dołączeń opisanych w rozdziale 21-ym „Kariera dla testera”, można zapoznać się z wieloma takimi narzędziami i z rekomnedacjami od innych testerów. Kto chce zbudować własny system, może z łątwością posłużyć się narzędziami takimi jak Claris FileMaker Pro, Microsoft Acees, i wiel innych, pozwalającymi niemal bez programowania - tylko przy użyciu myszki - w ciągu kilku godzin stworzyć bazę danych dopasowaną do formatu dokumentacji ANSI/IEEE 829. Posługując się wbudowanymi w bazę danych metodami wyszukiwania różnych kombinachji danych, jest się w stanie bezzwłocznie odpowiedzieć na prawie każde niemal możliwe pytanie dotyczące zadań testowych i przebiegu testowania.
Trzeba zdawać sobie sprawę, że zadań testowych mogą być tysiące i bez sposobu kontrolowania ich można bardzo łatwo utonąć w morzu dokumentacji. Trzeba znaleźć metodę na to, by jednym rzutem oka móc uzyskać odpowiedź na pytanie: „Co będziemy testowali jutro, ile zadań testowych trzeba będzie wykonać?” Podsumowanie
Pora już na to, by ponownie przypomnieć cztery podstawowe powody, dla których konieczne jest staranne planowanie zadań testowych: organizacja, powtarzalność, kontrola i dowody wykonania. Nigdy dość powtarzania tych zasad, bo doświadczenia poucza, że często zaniedbuje się bardzo istotna część pracy testera: szczegółowe dokumentowanie tego, co się zrobiło.
Nikt nie chciałby prowadzić samochodu, który został zaprojektowany przez zespół konstruktorski na odwrocie serwetki, ani mieszkać koło elektrowni atomowej, gdzie programy kontrolne testował zespół posługujący się wyłącznie metodami ad hoc. Chce się, by inżynierowie odpowiedzialni za jakość tych systemów posługiwali się dobrymi praktykami inżynierskimi i tak dokumentowali swą pracę, by dało się stwierdzić, czy to co zbudowano zgodne jest z pierwotnymi planami.
Początkujący tester zwykle nie ma wpływu na to, jakie metody planowania i dokumentacji stosuje projekt, ale może się starać wykonywać swoją pracę jak najskuteczniej. Trzeba odróżniać rzeczy konieczne od zbędznych, badać jak można by usprawnić proces i nigdy nie iść na łatwiznę. Na tym polega różnica między profesjonalizmem a hakerstwem.
Ten rozdział i rozdział 16-y opisuje planowanie i dokumentację tego, co zamierza się przetestować. Następne dwa rozdziały zajmą się tym, jak dokumentować uzyskane wyniki testów i w jaki sposób powiedzieć innym, że znalazło się błąd. Pytania
Pytania mają na celu ułatwienie zrozumienia. W aneksie A „Odpowiedzi na pytania” znajdują się prawidłowe rozwiązania – ale nie należy ściągać! 1.Jakie są cztery powody, aby planować zadania testowe? 2.Co to jest test metodami ad hoc? 3.Czemu służy specyfikacja grup zadań testowych? 4.Co to jest specyfikacja zadań testowych? 5.Jakich innych metod - oprócz tradycyjnej formy pisemmnego dokumentu - można używać do opisu zadań testowcyh? 6.Po co jest specyfikacja procedur testowych? 7.Jak szczegółowa powinna być procedura testowa?