testowanie na podstawie ryzyka
Transkrypt
testowanie na podstawie ryzyka
Bogdan Bereza-Jarociński TESTOWANIE NA PODSTAWIE RYZYKA (RISK-BASED TESTING) JAKO SPOSÓB ZARZĄDZANIA ZAGROŻENIAMI W PROJEKCIE INFORMATYCZNYM © NewQuality Wstęp Zagrożenia dla projektu (risks) to czynniki, co do których nie wiemy z góry, czy wystąpią, mogące spowodować opóźnienia, przekroczenie budżetu lub skonstruowanie wadliwego, niezgodnego ze specyfikacją produktu. Testowanie jest główną czynnością wykonywaną w ramach zarządzania zagrożeniami. Bez testowania zarządzanie zagrożeniami pozbawione jest oparcia w rzeczywistości. Podstawową metodą doboru testów jest tzw. testowanie na podstawie ryzyka, którego opis przedstawiamy w niniejszej pracy. Zarządzanie zagrożeniami Zagrożenia dla projektu (risks) to czynniki, co do których nie wiemy z góry, czy wystąpią, mogące spowodować opóźnienia, przekroczenie budżetu lub skonstruowanie wadliwego, niezgodnego ze specyfikacją produktu. Z zagrożeniami, które nieodłącznie towarzyszą wszelkim ludzkim przedsięwzięciom, można postępować trojako. Po pierwsze, można ich unikać (risk avoidance) nie podejmując się zadań ryzykownych, nowatorskich, unikając wyzwań. Czynności rutynowe, dobrze znane, z reguły obciążone są znacznie niższym ryzykiem niż nieznane, oparte na nowych technologiach, dążące do osiągnięcia celów, których wcześniej osiągnąć się nie dało. Takie podejście może się opłacać tylko na krótką metę, dopóki śmielsza konkurencja nie wyprze z rynku aktora unikającego wszelkich nowości i wyzwań. Po drugie, zagrożenia można lekceważyć (ignoring risks), przymykać na nie oczy i z desperacką odwagą rzucać się w najbardziej ryzykowne przedsięwzięcia. Wydaje się niekiedy, że niektórych firmach informatycznych występuje swoista kultura premiująca takie podejście. Kierownik projektu, który lekceważył sygnały ostrzegawcze i przedstawił nierealny harmonogram, nawet po znacznym opóźnieniu projektu będzie chwalony jako śmiałek i usprawiedliwiany tym, że każdemu może się nie udać natomiast kierownik racjonalnie oceniający trudności i zagrożenia zostanie napiętnowany jako przesadny pesymista, wręcz nielojalny wobec firmy. Setki popularnych w przemyśle informatycznym anegdot, rozpowszechniona nieufność czy zgoła cynizm wobec wszelkich obietnic dotyczących obiecywanych terminów i celów, jest dobitnym symptomem tej kultury wzajemnego okłamywania się i obowiązkowego, fałszywego optymizmu. Wreszcie zagrożeniami można zarządzać (risk management), to znaczy identyfikować je, oceniać ich wielkość i tę wiedzę wykorzystywać do nadzorowania projektu. Harmonogram projektu, w którym mądrze zarządza się zagrożeniami, nie będzie miał wprawdzie daty zakończenia (nierealnie optymistycznej) wykutej złotymi literami, tylko ocenę prawdopodobieństwa osiągnięcia celu projektu w określonym terminie, ale za to będzie oparty na prawdziwych przesłankach i umożliwiający autentyczne zarządzanie projektem, a nie tylko jego namiastkę. Zagrożenia dzieli się niekiedy na dwie klasy: produktowe i projektowe. Zagrożenia projektowe (project risks) to takie, które mogą spowodować opóźnienie lub przekroczenie budżetu projektu, ale bezpośrednio nie wpływają na jakość końcowego produktu. Przykładowo, jeśli okaże się, że wydajność pracy programistów będzie niższa od spodziewanej, zaplanowany harmonogram zostanie przekroczony. Zagrożenia produktowe (product risks) oznaczają ryzyko, że produkt nie będzie spełniał specyfikacji, na przykład że nie będzie miał pełnej funkcjonalności lub że niektóre funkcje będą działać wadliwie, lub że nie będą spełnione inne wymagania, takie jak osiągi, przepustowość czy łatwość obsługi. W praktyce taka klasyfikacja nie jest specjalnie użyteczna: konkretne wydarzenia lub stany będące zagrożeniami z reguły przekładają się zarówno na ryzyko projektowe jak i produktowe. Przykładowo, zła organizacja i spowodowana ją słabsza od zakłada wydajność pracy w projekcie spowoduje opóźnienie, które być może zostanie zlikwidowane kosztem funkcjonalności czy jakości produktu. Podobnie wady produktu, spowodowane nieprzewidzianymi trudnościami technicznymi, mogą pociągnąć za sobą opóźnienie dostawy końcowej lub konieczność przekroczenia budżetu. Ocena zagrożeń Pierwszym krokiem w zarządzaniu zagrożeniami jest ich identyfikacja (risk identification). Często stosowaną metodą identyfikacji jest tzw. burza mózgów, czyli zbiorowe generowanie wielu pomysłów, często niekonwencjonalnych, bez próby ich analizy czy krytyki. Zaletą tego sposobu podejścia jest możność oderwania się od utartych schematów i stereotypów. W praktyce doświadczenie poucza, że mimo stosowania burzy mózgów wiele istotnych zagrożeń pozostaje niezidentyfikowanych, zwłaszcza gdy dotyczą obszarów tabu w danym przedsiębiorstwie czy organizacji. Przykłady takich tematów to brak środków finansowych na ukończenie projektu, zbiorowe odejście grupy kluczowych pracowników (np. w celu założenia konkurencyjnej firmy), bankructwo kluczowego dostawcy, niepowodzenie zastosowania technologii uznanej przez kierownictwo firmy za jedyną słuszną itp. Skuteczność identyfikacji poprawia się, jeśli dane z wcześniejszych projektów wykorzystuje się do stworzenia wstępnej listy zagrożeń. Problemy z poprzedzającego projektu powinny automatycznie wejść w skład listy zagrożeń następnego projektu. Efektywność tej metody zależy przede wszystkim od tego, na ile gromadzone są, przechowywane i udostępniane metryki z kolejnych projektów w organizacji. Wielkość zagrożeń określamy na dwóch skalach. Oceniamy prawdopodobieństwo zmaterializowania się danego zagrożenia (risk probability) – na przykład prawdopodobieństwo trafienia działu informatycznego firmy przez meteoryt jest mniejsze niż prawdopodobieństwo epidemii grypy wśród pracowników w styczniu. Zagrożenia o których wiemy, że na pewno wystąpią – na przykład fakt, że w lipcu część pracowników weźmie urlop – nie są już przedmiotem zarządzania zagrożeniami, lecz po prostu jednym z czynników, które bierze się pod uwagę przy planowaniu projektu tak samo jak dostępne zasoby, kwalifikacje personelu itp. Oceniamy także konsekwencje zagrożeń (risk consequences) – na przykład skutki nieoczekiwanego podkupienia wszystkich naszych programistów przez konkurencję byłyby o wiele poważniejsze niż skutki 3-dniowej niedyspozycji administratora systemu. Na pierwszy rzut oka powyższe stwierdzenia wydają się oczywiste, w praktyce jednak już sama ocena wielkości zagrożeń nastręcza wiele trudności. Oszacowanie zarówno prawdopodobieństwa jak i konsekwencji natrafia na szereg trudności. Trudność pierwsza to wybór stosownej skali. Częstą pułapką jest zastosowanie zbyt dokładnej skali, np. 10-stopniowej, podczas gdy tak precyzyjne oszacowanie prawdopodobieństwa czy konsekwencji jest zwykle zupełną fikcją. Najczęściej stosowana w praktyce jest skala 3-stopniowa. Trudność druga to uświadomienie sobie rodzaju stosowanej skali i dopuszczalnych sposobów interpretacji uzyskanych wyników. Jeśli np. prawdopodobieństwo oceniamy od „1” (niskie) do „3” (wysokie), czy dopuszczalne jest twierdzenie, że zagrożenie o prawdopodobieństwie „3” jest trzykrotnie bardziej prawdopodobne niż grożenia wycenione na prawdopodobieństwo „1”? Trudność trzecia polega na psychologicznych uwarunkowaniach oszacowań zarówno prawdopodobieństwa jak i konsekwencji. Istnieje rozległa wiedza na temat psychologicznych mechanizmów powodujących nietrafność – niekiedy rażącą – takich oszacowań, kiedy dokonuje się ich intuicyjnie. Nie mamy niezawodnego sposobu uniknięcia ani nawet ograniczenia wpływu tych mechanizmów, które dotyczą szeregu zagadnień: dynamiki grupowej, subiektywnej oceny prawdopodobieństwa, dysonansu poznawczego, postrzegania zależności korelacyjnych czy przyczynowych na podstawie niedostatecznych przesłanek, pomijanie efektów pojawiających się z opóźnieniem w odniesieniu do sytuacji zmiennych w czasie, itp. Trudność czwarta dotyczy sposobu priorytetyzacji zagrożeń na podstawie funkcji ich prawdopodobieństwa i konsekwencji. Często stosuje się proste mnożenie wartości z obu skali, ale uzyskane w ten sposób wyniki mają istotność w najlepszym razie orientacyjną. Przeciwdziałanie zagrożeniom Zagrożeniom można przeciwdziałać dwojako: po pierwsze, ograniczając prawdopodobieństwa ich zaistnienia (zapobieganie), po drugie ograniczając ich skutki (konsekwencje) gdy wystąpią (czynności zaradcze). Zapobieganie zagrożeniom (risk mitigation) składa się z czterech kroków. Po pierwsze, trzeba zidentyfikować możliwe metody zapobiegawcze – również te niekonwencjonalne. Po drugie, trzeba oszacować skuteczność każdej z metod (o ile spadnie prawdopodobieństwo zagrożenia gdy zastosujemy daną metodę) oraz – po trzecie – koszty zastosowania metody. Na tej podstawie można wyliczyć opłacalność zastosowania czynności zapobiegawczych: Jeśli koszt_zapobiegania < koszt_konsekwencji * prawdopodobieństwo wówczas zastosowanie czynności zapobiegawczych jest uzasadnioneii. Planując czynności zaradcze (contingencies), bierzemy pod uwagę koszt wdrożenia czynności zaradczych w razie zmaterializowania się zagrożenia oraz ewentualny koszt przygotowania czynności zaradczych i utrzymywania ich w gotowości. Jeśli koszt_wdrożenia + koszt_przygotowania < koszt_konsekwencji wówczas zaplanowanie czynności zaradczych jest uzasadnione. W praktyce uzyskanie dostatecznie dokładnych i pewnych oszacowań kosztów jest zwykle trudne, aby umożliwić precyzyjne obliczenia wg powyższych wzorów, wobec czego stosuje się metody przybliżone, heurystyczne lub wręcz intuicyjne, ze wszystkimi ich zagrożeniami. Zarządzanie zagrożeniami nie jest czynnością jednorazową, lecz procesem, który powinien biec równolegle z projektem przez cały czas jego trwania. Pewne zagrożenia znikną, inne nowe się pojawią, zmianie mogą też ulec oszacowania kosztów i prawdopodobieństwa. Dlatego zbiór zagrożeń powinien podlegać nieustającemu monitorowaniu (risk monitoring), mającemu wykryć ewentualne zmiany. Monitorowanie polega na systematycznym wykonywaniu pomiarów oraz ich analizie w celu wykrycia zmian w zbiorze zagrożeń. Zarządzanie zagrożeniami a testowanie Testowanie w projektach informatycznych często rozumiane jest w wąskim sensie jako uruchamianie aplikacji (systemu) lub jej części w celu sprawdzenia, czy działa poprawnie. W tej pracy używamy pojęcia testowanie w szerszym znaczeniu, jako ogół czynności (weryfikacja, walidacja, certyfikacja, testowanie dynamiczne, analiza statyczna, przeglądy) wykonywanych w trakcie projektu w celu skontrolowania czy artefakty projektu zgodne są z założeniami, wymaganiami i specyfikacjami. Sprawdzane artefakty to zarówno cały produkt (program, aplikacja, system informatyczny) jak i jego części, dokumentacja będąca częścią produktu, dokumentacja będąca specyfikacją produktu, a także dokumentacja projektowa, np. plany, harmonogramy itp. Natomiast nie wchodzi w skład tak rozumianego testowania kontrola jakości samego projektu, np. audyty przestrzegania w projekcie przyjętego procesu, norm i standardów, ani pomiary jakości czy dojrzałości procesów i projektu. Testowanie jest główną czynnością wykonywaną w ramach zarządzania zagrożeniami. Bez testowania zarządzanie zagrożeniami pozbawione jest oparcia w rzeczywistości, staje się jedynie teoretycznym roztrząsaniem, bez możliwości stwierdzenia, czy zagrożenia materializują się lub jakie są ich faktyczne konsekwencje. Wyniki testów z wcześniejszych projektów, odpowiednio wykorzystane, są znakomitym źródłem, przy pomocy którego identyfikujemy zagrożenia istniejące w bieżącym projekcie. Ponadto w trakcie projektu, odpowiednio wcześnie rozpoczęte testowanie umożliwia zarówno identyfikację ew. nowych zagrożeń, jak i monitorowanie zagrożeń. Wyniki testów są sygnałem ostrzegawczym informującym, że zagrożenie zaczyna się materializować lub że prawdopodobieństwo zagrożenia wzrasta. Pozytywne wyniki testów są z kolei informacją, że jakieś zagrożenie maleje lub wręcz przestało istnieć. Testowanie jest przede wszystkim metodą wykrywania i pomiaru zagrożeń dotyczących produktu, które jednak z reguły przekładają się – jak zaznaczono wyżej – na zagrożenia projektowe. Testowanie dokumentacji projektowej (planów, harmonogramów) może także wykryć lub zmierzyć zagrożenia projektowe bezpośrednio. Zarys testowania na podstawie ryzyka Testowanie, zwłaszcza testowanie produktu, ma na celu przede wszystkim wykrycie jak największej liczby ważnych błędów, tak aby umożliwić ich usunięcie o zmniejszyć liczbę i konsekwencje awarii produktu w działaniu. Drugim podstawowym celem testowania jest pomiar jakości produktu tak, by móc możliwie trafnie ocenić jego przyszłą niezawodność w działaniu i na tej podstawie podejmować trafne decyzje projektowe i biznesowe, np. dotyczące terminu wdrożenia, przewidywanych kosztów utrzymania i konserwacji itd. Zwykle nie ma możliwości zupełnego przetestowania produktów informatycznych, czyli takiego, które skontroluje działanie produktu we wszystkich możliwych stanach, konfiguracjach i z wszelkimi możliwymi danymi, które mogą zaistnieć podczas wieloletniego posługiwania się produktem przez setki czy wręcz tysiące użytkowników. Przeciwnie – możliwych przypadków (scenariuszy, danych, warunków) testowych są zwykle setki miliardów czy wręcz nieskończona liczba, a w projekcie mamy możliwości wykonania ledwo kilku tysięcy testów. W tej sytuacji kluczowym warunkiem sukcesu jest trafny dobór testów, tak aby jak najlepiej odwzorowywały rzeczywiste zastosowanie systemu w działaniu i pozwalały wykrywać jak największą liczbę ważnych błędów. Jednym słowem, dobór przypadków testowych powinien gwarantować miarodajność wyników testowania dla oceny niezawodności systemu informatycznego w działaniu. Inżynieria oprogramowania dysponuje szeregiem metodyk i technik pozwalających na zbliżanie się do tego celu. Tutaj skoncentrujemy się na podstawowej metodzie, zwanej testowaniem na podstawie ryzyka. Nazwa ta jest często nadużywana, wobec czego jej zakres znaczeniowy stał się w praktycznym zastosowaniu zamazany i niejednoznaczny. Poniżej przedstawiamy kompletny model znaczenia tego pojęcia. Model i definicja testowania na podstawie ryzyka Przedmiotem testowania powinny być – zgodnie z paradygmatem testowania na podstawie ryzyka – te funkcje lub właściwości produktu (systemu, aplikacji) informatycznego, których wadliwe działanie powodowałoby największe straty. Wielkość strat poniesionych w wyniku awarii zależy zarówno od tego, jak wysokie są koszty pojedynczej awarii, jak i od tego, jak często ta awaria ma miejsce. Nie każdy rodzaj zagrożenia daje się równie łatwo ocenić i wykryć przy pomocy testowania. Przykładowo, wpływ trzęsienia ziemi na sprzęt systemu informatycznego, daje się przetestować wyłącznie przy użyciu kosztownych symulatorów trzęsienia ziemi. Zależności opisane powyżej pokrótce, można opisać dokładniej przy pomocy grafu: 1. 1. waga waga testu testu 2. 2. koszt koszt testu testu 4. 4. techniki techniki testów testów ii charakter zagrożenia charakter zagrożenia 7. 7. oszacowania oszacowania biznesowe biznesowe 3. 3. waga waga awarii awarii 5. 5. koszt koszt awarii awarii 8. 8. profil profil użycia użycia 10. 10. wiedza wiedza nt. nt. użycia użycia 6. 6. częstość częstość awarii awarii 9. 9. częstość częstość błędów błędów 11. 11. szereg szereg czynników czynników Rys. 1 Zależności pozwalające określić wagę przypadków testowych 1. Waga testu to miara pozwalająca porównywać testy między sobą i wybierać te, które bardziej się opłacają. Waga testu jest skorelowana pozytywnie z kosztami (wagą) awarii, którym ten test pozwala zapobiec [5], a negatywnie z kosztem (trudnościami) wykonania tego testu [2]. 2. Koszt testu jest miarą określającą, na ile danej awarii da się w ogóle zapobiec poprzez testy mające na celu zlokalizowanie mogących ją spowodować błędów. Im dokładniejszą ma się wiedzę o technicznych i organizacyjnych aspektach testowania [4], tym trafnej można oszacować ten koszt. 3. Waga awarii zależy od konsekwencji (kosztu) tej awarii [5] oraz od przewidywanej częstotliwości jej występowania [6]. Kształt tej zależności nie da się jednoznacznie określić, na pewno jest różny dla różnych projektów, rodzajów produktów, wymagań klientów. 4. Informacje o skuteczności i kosztach testów uzyskujemy ze szczegółowych danych nt. pokrycia testowego, kosztów wykonania testów, organizacji testów (poziomy testowania, testy regresji) oraz na podstawie danych archiwalnych z poprzednich projektów. 5. Informację o koszcie awarii uzyskuje się na podstawie oceny biznesowej [7]. 6. Częstotliwość awarii wpływa, podobnie jak jej koszty, na wagę awarii. Im częściej dana awaria występuje, tym wyższe jej łączne koszty. Zależność ta nie zawsze ma charakter liniowy, bowiem np. awaria o niskim koszcie jednostkowym, ale występująca szczególnie często, może mieć nieoczekiwanie wysoki wpływ na subiektywną ocenę jakości systemu przez klientów/użytkowników, co z kolei wpływa na wysokość ponoszonych w wyniku awarii strat. Częstotliwość awarii zależy od dwóch czynników, częstotliwości sposobu użycia [8] oraz od gęstości błędów w kodzie, realizującym testowaną funkcjonalność [9]. Jeśli dwie funkcje mają podobną liczbę błędów, to awarie pojawiają się częściej w tej, która jest intensywniej (częściej) używana. Istnieje też zależność odwrotna: kiedy dwie funkcje są jednakowo intensywnie użytkowane, to więcej awarii wystąpi przy wykonywaniu tej funkcji, która ma większą gęstość błędów. 7. Oszacowanie biznesowe pozwala ocenić koszty awarii. W praktyce pewne składowe kosztów daje się ocenić względnie precyzyjnie (np. wysokość kar umownych, koszty wytworzenia i wdrożenia nowej wersji systemu itp.), inne składowe jednak z trudem pozwalają się wyliczyć (efekty długofalowe, stopniowa utrata klientów itp.). 8. Profile użycia, jeśli są dostępne, pozwalają określić, jak intensywnie i z jakimi danymi użytkowane są poszczególne funkcjonalności i ścieżki testowanego systemu. 9. Zwykle nie jest nam znana gęstość błędów w danej funkcji czy części systemu, jednak często można ją próbować oszacować na podstawie wartości danych skorelowanych [11], takich jak złożoność algorytmu, liczba osób odpowiedzialnych za implementację, historia wcześniejszych podobnych błędów, jakość projektu systemu itp. 10. Profile użycia uzyskujemy bądź to na podstawie wcześniej gromadzonych danych archiwalnych, bądź na podstawie analizy przewidywanego profilu użytkowania, bądź wreszcie przy pomocy analizy logów i innych pomiarów wykonywanych na systemie działającym już w środowisku produkcyjnym. Podsumowanie Przedsięwzięcia informatyczne obciążone są niepewnością. Istniejące zagrożenia mogą spowodować fiasko planowanego wyniku przedsięwzięcia. Zarządzenie zagrożeniami (Risk Management) umożliwia osiągnięcie sukcesu nawet w sytuacji realnie zmaterializowanych zagrożeń. Kluczowym elementem zarządzania zagrożeniami jest testowanie. Testowanie pozwala na skuteczną identyfikację zagrożeń produktowych, oszacowanie prawdopodobieństwa ich materializacji i monitorowania, jak również usprawnia ocenę konsekwencji zagrożeń. Skuteczne testowanie musi dotyczyć przede wszystkim obszarów o największych zagrożeniach. Przypadki testowe do takiego testowania dobiera się tak, aby dotyczyły najwyższych zagrożeń produktowych (Risk Based Testing). Literatura A. Andrzej Kobyliński, Modele jakości produktów i procesów programowych, Oficyna Wydawnicza SGH, Warszawa, 2005 B. Tom DeMarco, Timothy Lister, Waltzing with Bears –Managing Risk on SW Projects, Dorset House Publishing, New York, 2003 C. Rex Black, Managing the Test Process – Practical Tools and Techniques for Managing HW and SW Testing, Wiley Publishing, 2002 D. Fredrick P. Brooks, The Mythical Man-Month – Essays on SW Engineering Anniversary Edition, ADDISON-WESLAEY, 2001 E. Dietrich Dorner, Rita Kimber (Translator), Robert Kimber (Translator), The Logic of Failure: Recognizing and Avoiding Error in Complex Situations, Metropolitan Books, 1996 F. Martyn Ould, Managing SW Quality and Business Risk, Wiley, 1999 G. Andreas Spillner, Tilno Lintz, Hans Schaeffer, SW Testing Foundations, dpunkt.verlag, 2006 H. Erik van Veenendaal, The Testing Practitioner, UTN Publishers, 2002 i Np. zagrożenie mające prawdopodobieństwo „2” i konsekwencje „2” otrzymuje priorytet „4” (2 * 2 = 4), podczas gdy zagrożenie o prawdopodobieństwie „1” i konsekwencjach „3” otrzymuje priorytet „3” (1 * 3 = 3). ii Ściślej, rozstrzygnięcie zależy od przyjętej strategii decyzji, np. przy strategii maksymalizacji zysku można przyjąć unikanie jakichkolwiek dodatkowych kosztów zapobiegania zagrożeniom, które mogą przecież wcale się nie zmaterializować.