Testowanie heurystyczne

Testowanie bazujące na heurystykach jest jedną z popularniejszych metod testowania, ale samo pojęcie nie jest szeroko stosowane w polskich projektach. Czym jest heurystyka i jak możemy testować w tym podejściu.

Zacznijmy od słownika pojęć testerskich ISTQB, w którym to pojawia się hasło "ocena heurystyczna" definiowana jako technika statycznego testowania użyteczności mającą na celu określenie zgodności interfejsu użytkownika lub projektu tegoż interfejsu. Wykorzystując tę technikę, przeglądający sprawdzają interfejs i oceniają jego zgodność z uznanymi zasadami użyteczności (tzw. „heurystykami”). Redukuje to testowanie heurystyczne do oceny użyteczności co jest dość znaczącym okrojeniem przydatności samej metody.

Musimy więc zdefiniować testowanie heurystyczne odwołując się do innych źródeł. Zacznijmy od samych heurystyk.

Wikipedia podaje następujące znaczenie słowa heurystyka w odniesieniu do logiki - umiejętność wykrywania nowych faktów oraz znajdowania związków między faktami, zwłaszcza z wykorzystaniem hipotez. Na podstawie istniejącej wiedzy stawia się hipotezy, których nie trzeba udowadniać. Nie widać tu bezpośredniego nawiązania do testowania. Kiedy jednak czytam o własnościach heurystyk możemy znaleźć linki do testów.

Oto własności i ich interpretacja na polu testowania:

  • odkrywanie i tworzenie nowych rzeczy i zjawisk - poznawanie oprogramowania i odkrywanie obszarów do tej pory nie testowanych; widzimy tu pierwszy link do testowania kontekstowego i bez specyfikacji,
  • rozwiązywanie problemów w sposób twórczy - kreatywność testerska, która prowadzi do znajdywania ciekawych defektów,
  • wspieranie procesu tworzenia oraz rozwój cech z tym związanych - bezpośrednie nawiązanie do procesu wytwarzania oprogramowania wspieranego przez weryfikację wytwarzanych w procesie produktów,
  • wykrywanie powiązań między faktami - analizowanie powiązań między obszarami aplikacji i szukanie obszarów narażonych na regres,
  • samodzielne dochodzenie do prawdy, tworzenie hipotez - poszukiwanie informacji o jakości oprogramowania przez znajdywanie i nieznajdywanie defektów
  • brak gwarancji uzyskania najlepszego rozwiązania - brak możliwości przetestowania wszystkiego, ale szukanie najbardziej krytycznych defektów.

Jeszcze ciekawsza definicja pojawia się w odwołaniu do heurystyk w informatyce.

Heurystyka (gr. heuresis – odnaleźć, odkryć, heureka – znalazłem) – metoda znajdowania rozwiązań, dla której nie ma gwarancji znalezienia rozwiązania optymalnego, a często nawet prawidłowego.

Jako "rozwiązanie" w tej definicji możemy potraktować odpowiedź na pytanie czy oprogramowanie jest gotowe do wdrożenia?  Dopuszczamy jednocześnie, że przy skończonym czasie i budżecie udzielona przez nas odpowiedź może być błędna?

Rozwiązań tych używa się np. wtedy, gdy pełny algorytm jest z przyczyn technicznych zbyt kosztowny lub gdy jest nieznany (np. przy przewidywaniu pogody lub przy wykrywaniu niektórych zagrożeń komputerowych, takich jak wirusy lub robaki).

Pełne przetestowanie oprogramownia jest zbyt kosztowne, a najefektywniejsza metoda oceny jakości oprogramowania jest nieznana.

Metody używa się też często do znajdowania rozwiązań przybliżonych, na podstawie których później wylicza się ostateczny rezultat pełnym algorytmem.

Nasza odpowiedź na pytanie czy oprogramowanie może być wdrożone czy też nie będzie obarczona ryzykiem i często niepełna. Musimy pamiętać, że jeśli w testowaniu oprzemy się na heurystykach definiowanych jako zbiór reguł oraz wskazówek, to mogą one, ale nie muszą, doprowadzić nas do właściwego rozwiązania.

 

Heurystki w zarządzaniu również można łatwo przełożyć na testowanie. Ponownie odwołujemy się do Wikipedii.
Heurystyka proponuje metody, które pomagają rozwiązać problem w warunkach niedostatecznej informacji i zrekompensować jej brak intuicją oraz wyobraźnią. Celem większości z nich jest rozwiązanie problemu lub przynajmniej zebranie idei prowadzących do jego rozwiązania oraz rozbudzanie fantazji, wyobraźni i kreatywności ludzi.
Tłumacząc to na testowanie można powiedzieć, że nie mając pełnej informacji o oprogramowaniu będziemy testować w oparciu o wiedzę i doświadczenie, czyli eksploracyjnie. Dobre testowanie opiera się na myśleniu kreatywnym, które pozwala nam lepiej zrozumieć użytkownika i jego potrzeby.

I jeszcze coś o testowaniu zespołowym:

Wyższa jakość uzyskiwanych rozwiązań oraz krótszy czas potrzebny na jego osiągnięcie to wynik pracy zespołowej, która stanowi podstawowe założenie znacznej większości metod heurystycznych. Kreatywność zbiorowa ma wiele zalet, w

  • wysoką efektywność w zakresie rozwiązywania złożonych problemów,
  • nieograniczoną komunikację i większe możliwości opracowywania rozwiązań,
  • wyższy stopień tolerancji ryzyka w związku ze zwiększeniem szans na rozwiązanie problemu.

... i pracy w parach:

Koncepcja „twórczego ścierania się” G. Hirshberga, zgodnie z którą nad projektem powinny pracować pary projektantów różniących się podejściem zawodowym, stylem pracy, doświadczeniem, wiedzą itp., zakłada, że takie zderzenia są źródłem twórczych napięć, a wszelkie nowe pomysły będą przeanalizowane przez druga stronę i zrównoważone odmienną ideą. Interakcje pomiędzy ludźmi o różnych specjalizacjach, wnoszenie odmiennych spojrzeń i kompetencji zwiększa szansę na znalezienie nowatorskich rozwiązań.

 

Zbudował nam się więc całościowy obraz testowania heurystycznego jako weryfikacji oprogramowania opartej na znanych regułach i metodach, doświadczeniu i wiedzy dodatkowo rozszerzonych o naszą kreatywność, twórcze podejście do rozwiązania i umiejętność logicznego myślenia. Widzimy również, że testowanie wymusza rozumienie kontekstu oprogramowania oraz jego eksplorowania. Każdy aspekt heurystyki można logicznie powiązać z testowaniem, a kolejnym przykładem może być jedna z metod wydawanie sądów tzw. heurystyka reprezentatywności, która uproszczoną metodą wnioskowania polegająca na dokonywaniu klasyfikacji na podstawie częściowego podobieństwa do przypadku typowego, charakterystycznego, reprezentatywnego, który już znamy. Przykładowo ocena jakości może bazować na podobnych i znanych nam funkcjach w innym oprogramowaniu.

Testowanie heurystyczne może być definiowane jako testowanie modułów kodu lub oprogramowania, w których strategie testowania opierają się na danych z przeszłości uwzględniających prawdopodobieństwo. Ten typ testów często pozwala na bardziej inteligentne analizowanie, gdzie mogą wystąpić jakiekolwiek błędy lub problemy. Testy heurystyczne często będą więc nazywane testami opartymi na doświadczeniu. Testerzy wykorzystują swoją wiedzę z podobnych projektów i w odniesieniu do podobnych produktów, by zwiększyć jakość swoich testów.

Testy heurystyczne są inteligentne, w przeciwieństwie do czysto ilościowego testowania oprogramowania, które działa stosunkowo ślepo, bez żadnego głębszego analizowania testowanego produktu. Załóżmy, że automatyk testów musi przetestować projekt zawierający 100 000 linii kodu. Pokrycie wszystkich funkcji (rozumiane np. jako pokrycie wszystkich linii) w tych 100 000 linii stanowiłoby wyłącznie testowanie ilościowe. Z kolei testowanie heurystyczne wymagałoby sprawdzenia, jak często występują defekty w niektórych częściach kodu. Tester analizuje dane historyczne, aby zrozumieć, że dany moduł był w przeszłości bardziej podatny na defekty. Strategia testowania heurystycznego może obejmować izolowanie tego modułu lub funkcji i przypisanie do niej większej liczby testów lub osób testujących, a nie równoczesne testowanie mniej intensywnie pozostałych linii kodu.

Dla testowania zdefiniowano bardzo wiele heurystyk, które mogą pomóc ukierunkować nasze działania. Zostały one ciekawie opisane przez Santosha Tuppada na poniższej grafice. Widać wyraźnie, że największy wkład w definiowanie reguł ma James Bach. 

 

Niektóre z heurystk już opisaliśmy na naszych łamach, a niektóre wkrótce opiszemy.

 

Źródła

 

 

 

Najbliższe terminy szkoleń

 

9-11 stycznia - Katowice

ISTQB Poziom Podstawowy


17 stycznia - Kraków

Odbiór oprogramowania - testowanie akceptacyjne


21 stycznia - Wrocław

ISTQB Poziom Zaawansowany - Analityk Testów

 

Partnerzy

Narzędzia testerskie