estowanie oprogramowania Adam Roman Instytut Informatyki UJ Wykład 6 techniki projektowania testów oparte o strukturę: pokrycia logiczne pokrycie decyzji, warunków, D/C, MC/DC pokrycia elementów projektowych 1/41
OPARE O SKŁADNIĘ (CZARNOSKRZYNKOWE) OPARE O SRUKURĘ (BIAŁOSKRZYNKOWE) OPARE NA DOŚWIADCZENIU I DEEKACH PRZEGLĄDY ANALIZA SAYCZNA KODU ANALIZA SAYCZNA ARCHIEKURY ANALIZA DYNAMICZNA klasy równoważności, wartości brzegowe tablice decyzyjne, grafy przyczynowo-skutkowe przejścia pomiędzy stanami (maszyna stanowa) drzewa klasyfikacji, tablice ortogonalne pokrycie specyfikacji, pokrycie przypadków użycia przypadki użycia, testowanie losowe pokrycia przepływu sterowania i danych testowanie ścieżek (LCSAJ, ścieżki bazowe, CC) techniki oparte o składnię (np. t. mutacyjne) taksonomie błędów zgadywanie błędów testowanie w oparciu o listy kontrolne testowanie eksploracyjne ataki usterkowe analiza złożoności, metryki kodu analiza przepływu sterowania analiza przepływu danych zgodność ze standardami programowania analiza statyczna strony webowej grafy wywołań wykrywanie wycieków pamięci wykrywanie dzikich wskaźników analiza wydajności 2/41
Dlaczego kryteria oparte o logikę? przykład Włączenie kryteriów bazujących na wyrażeniach logicznych do standardów akceptowanych przez ederalną Administrację Lotnictwa USA dla zapewnienia bezpieczeństwa systemów krytycznych awioniki w lotnictwie cywilnym 3/41
Klasyfikacja pokryć logicznych POKRYCIA LOGICZNE POKRYCIA KODU POKRYCIA INNYCH AREAKÓW OPROGRAMOWANIA D (pokrycie decyzji) C (pokrycie warunków) C/D (p. decyzyjno-warunkowe) MC (p, wielokrotnych warunków) MC/DC (p. warunków znaczących) pokrycie logiczne oparte o specyfikację pokrycie logiczne maszyny stanowej 4/41
Przykłady źródeł wyrażeń logicznych if (((a>b) C) && (x<y)) o.m(); else o.n(); c!=delimit InWord End c==eo c==delimit c==eol Dupeound prev==cur EndWord 5/41
Podstawowe definicje (1) predykat, operatory logiczne Decyzja (predykat) to wyrażenie posiadające wartość logiczną, np.: Decyzja może zawierać: stałe i zmienne logiczne zmienne porównywane operatorami porównania wywołania funkcji Wewnętrzna struktura oparta o operatory logiczne negacji implikacji koniunkcji rozłącznej alternatywy alternatywy równoważności 6/41
Podstawowe definicje (2) warunek (klauzula) Warunek (klauzula) to predykat nie zawierający operatorów logicznych 7/41
Oznaczenia zbiór predykatów zbiór klauzul w predykatach z P zbiór klauzul w predykacie p P ewaluacja predykatu p P (prawda lub fałsz) 8/41
Pokrycie decyzji DC decision coverage Inna nazwa: pokrycie predykatów, PC predicate coverage Dla każdego p P, R zawiera dwa wymagania: a b C q(x) p t 1 5 4 RUE RUE RUE t 2 5 6 RUE ALSE ALSE 9/41
Pokrycie decyzji a pokrycie rozgałęzień praktycznie to samo, ale subtelna różnica dot. pokrycia 100% pokrycie warunków = 100% pokrycie rozgałęzień różnią się dla niższych stopni pokrycia 1 2 3 5 7 6 Decyzje w 1, 3, 5 p = (1, 3, 5, 7) Pokrycie decyzji: 3/6 = 50% 4 Pokrycie rozgałęzień: 3/9 = 33% 10/41
Pokrycie warunków C condition coverage Inna nazwa: pokrycie klauzul, CC clause coverage Dla każdego c C, R zawiera dwa wymagania: a b C q(x) a>b p t 1 5 4 RUE ALSE RUE ALSE t 2 5 6 ALSE RUE ALSE ALSE 11/41
Pokrycie wielokrotnych warunków MC multiple condition coverage inna nazwa: CoC combinatorial coverage Dla każdego p P, R zawiera wymagania dla klauzul w C p ewaluacji wszystkich możliwych kombinacji wartości logicznych a b C q(x) a>b p t 1 5 4 RUE RUE RUE RUE t 2 5 6 RUE RUE ALSE RUE t 3 5 4 RUE ALSE RUE ALSE t 4 5 6 RUE ALSE ALSE ALSE t 5 5 4 ALSE RUE RUE RUE t 6 5 6 ALSE RUE ALSE ALSE t 7 5 4 ALSE ALSE RUE ALSE t 8 5 6 ALSE ALSE ALSE ALSE 12/41
Pokrycie warunków znaczących (1) MC/DC modified D/C coverage Inne nazwy: pokrycie klauzulami aktywnymi, ACC active clause coverage Motywacja: Chcemy, by testy na poziomie klauzul miały również efekt na poziomie predykatów UWAGA z definicji wymaga pokrycia klauzul i predykatów! W predykacie wyróżniamy jedną klauzulę (klauzula główna), a reszta to klauzule poboczne Kluczowe pojęcie: determinacja Klauzula główna c i w predykacie p determinuje p, jeśli klauzule poboczne c j p, j i, mają wartości takie, że zmiana wartości logicznej c i zmienia wartość logiczną p. 13/41
Pokrycie warunków znaczących (2) MC/DC modified D/C coverage 14/41
Pokrycie warunków znaczących (3) ogólna definicja (pamiętać o wymogu pokrycia klauzul i predykatów!) (MC/DC): Dla każdego p P i każdej klauzuli głównej c i C p, wybierz klauzule poboczne c j, j i tak, by c i determinowało p. R zawiera dwa wymagania dla każdej c i : a b RUE ALSE ALSE ALSE ALSE RUE ALSE ALSE test a b t 1 RUE ALSE t 2 ALSE ALSE t 3 ALSE RUE 15/41
Pokrycie warunków znaczących (4) wersja1: General Active Clause Coverage (GACC) Dla każdego p P i każdej klauzuli głównej c i C p, wybierz klauzule poboczne c j, j i tak, że c i determinuje p. R ma dwa wymagania dla każdej c i : Wartości wybrane dla klauzul pobocznych nie muszą być takie same dla obu przypadków: c i true oraz c i false. test a b t 1 RUE RUE t 2 ALSE ALSE 16/41
Pokrycie warunków znaczących (5) wersja2: Correlated Active Clause Coverage (CACC) Dla każdego p P i każdej klauzuli głównej c i C p, wybierz klauzule poboczne c j, j i tak, że c i determinuje p. R ma dwa wymagania dla każdej c i : Wartości wybrane dla klauzul pobocznych muszą ewaluować p na true w jednym przypadku i na false w drugim. a główna b główna test a b p t 1 ALSE RUE ALSE t 2 RUE RUE RUE t 3 RUE ALSE ALSE 17/41
Pokrycie warunków znaczących (6) wersja3: Restricted Active Clause Coverage (RACC) Dla każdego p P i każdej klauzuli głównej c i C p, wybierz klauzule poboczne c j, j i tak, że c i determinuje p. R ma dwa wymagania dla każdej c i : Wartości wybrane dla klauzul pobocznych muszą być takie same dla obu przypadków: c i true oraz c i false. abela zbioru testów tylko dla a jako głównej test a b c p t 1 RUE RUE RUE RUE t 2 ALSE RUE RUE ALSE 18/41
Pokrycie warunków znaczących (7) CACC vs. RACC Pewne wyrażenia można pokryć CACC, ale nie można RACC Więzy: 1) zawór otwarty w trybie Operational i zamknięty w innych 2) tryb nie może być jednocześnie Operational i Standby a = zawór zamknięty, b = tryb Operational, c = tryb Standby p = zawór zamknięty i (tryb Operational lub tryb Standby) test a b c p co narusza? t 1 RUE RUE RUE RUE 1, 2 t 2 RUE RUE ALSE RUE 1 t 3 RUE ALSE RUE RUE t 4 RUE ALSE ALSE ALSE t 5 ALSE RUE RUE ALSE 2 t 6 ALSE RUE ALSE ALSE t 7 ALSE ALSE RUE ALSE 1 t 8 ALSE ALSE ALSE ALSE 1 19/41
Pokrycie warunków znaczących (8) CACC vs. RACC Pewne wyrażenia można pokryć CACC, ale nie można RACC Więzy: 1) zawór otwarty w trybie Operational i zamknięty w innych przypadek, gdy a determinuje P 2) tryb nie może być jednocześnie Operational i Standby CACC można spełnić wybierając jeden a = zawór zamknięty, b = tryb Operational, c = tryb Standby wiersz z 1, 2, 3 oraz jeden z 5, 6, 7 p = zawór zamknięty i (tryb Operational lub tryb Standby) test a b c p co narusza? t 1 RUE RUE RUE RUE 1, 2 t 2 RUE RUE ALSE RUE 1 t 3 RUE ALSE RUE RUE t 4 RUE ALSE ALSE ALSE t 5 ALSE RUE RUE ALSE 2 t 6 ALSE RUE ALSE ALSE t 7 ALSE ALSE RUE ALSE 1 t 8 ALSE ALSE ALSE ALSE 1 20/41
Pokrycie warunków znaczących (9) CACC vs. RACC Pewne wyrażenia można pokryć CACC, ale nie można RACC Więzy: 1) zawór otwarty w trybie przypadek, Operational gdy a i zamknięty determinuje w P innych 2) tryb nie może być jednocześnie RACC można spełnić Operational wybierając i Standby jedną z a = zawór zamknięty, b = tryb par: Operational, (2, 6), (3, 7) lub c = (1, tryb 5) Standby p = zawór zamknięty i (tryb RACC Operational jest więc lub nieosiągalne! tryb Standby) test a b c p co narusza? t 1 RUE RUE RUE RUE 1, 2 t 2 RUE RUE ALSE RUE 1 t 3 RUE ALSE RUE RUE t 4 RUE ALSE ALSE ALSE t 5 ALSE RUE RUE ALSE 2 t 6 ALSE RUE ALSE ALSE t 7 ALSE ALSE RUE ALSE 1 t 8 ALSE ALSE ALSE ALSE 1 21/41
Jak zdeterminować predykat? Dla predykatu p z klauzulą c niech oznacza predykat p z każdym wystąpieniem c zmienionym na true, a oznacza predykat p z każdym wystąpieniem c zmienionym na false. Wtedy opisuje warunki, pod jakimi c determinuje p. 22/41
Przykłady 23/41
Nieosiągalność wymagań (infeasibility) while (i<n && a[i]!=0) { zrób coś z a[i] } typowa konstrukcja pętli z short circuit semantic przypadek, gdy i>=n oraz a[1]!=0 jest nieosiągalny Możliwe postępowania w sytuacji wystąpienia nieosiągalnych wymagań: (najprostsze): zignorować nieosiągalne wymagania (lepsze): rozważyć spełnienie wymagań w innym, subsumowanym kryterium 24/41
Subsumpcja kryteriów MC Multiple Condition Coverage RACC Restricted Active Clause Coverage CACC Correlated Active Clause Coverage GACC General Active Clause Coverage D/C Decision/Condition Coverage C Condition Coverage D Decision Coverage 25/41
Przykład (1) Read a, b, c a=0 & b>c c++ a++ b==c a>b END a = b+c 26/41
Przykład (2): pokrycie decyzji Read a, b, c a=0 & b>c c++ a++ b==c Jaka jest najmniejsza liczba przypadków testowych spełniających kryterium pokrycia predykatów (decyzji) dla zadanego programu? a>b END a = b+c 27/41
Przykład (2): pokrycie decyzji Read a, b, c a=0 & b>c c++ a++ C 1: (a = 5, b = 7, c = 4) C 2: (a = 0, b = 3, c = 1) C 3: (a = 0, b = 2, c = 2) b==c a>b END a = b+c 28/41
Przykład (3): pokrycie warunków Read a, b, c a=0 & b>c c++ a++ b==c Jaka jest najmniejsza liczba przypadków testowych spełniających kryterium pokrycia klauzul (warunków) dla zadanego programu? a>b END a = b+c 29/41
Przykład (3): pokrycie warunków Read a, b, c a=0 & b>c c++ a++ C 1: (a = 0, b = 7, c = 4) C 2: (a = 0, b = 3, c = 5) C 3: (a = 1, b = 2, c = 3) b==c C 1 C 2 C 3 a==0 b>c a>b b==c,, a>b END a = b+c 30/41
Przykład (4): pokrycie MC/DC Read a, b, c a=0 & b>c c++ a++ b==c Jaka jest najmniejsza liczba przypadków testowych spełniających kryterium pokrycia MC/DC dla zadanego programu? a>b 1. klauzule 2. predykaty 3. klauzule aktywne END a = b+c 31/41
Przykład (4): pokrycie MC/DC Read a, b, c a=0 & b>c c++ a++ C 1: (a = 0, b = 7, c = 4) C 2: (a = 0, b = 3, c = 5) C 3: (a = 1, b = 3, c = 2) C 4: (a = 0, b = 0, c = 8) b==c C 1 C 2 C 3 C 4 a==0 a>b b>c b==c,, a>b END a = b+c 32/41
Pokrycie elementów projektowych (1) ABSRAKCJA DANYCH PARADYGMA PROGRAMOWANIA ZORIENOWANEGO OBIEKOWO ZWIĘKSZONY NACISK NA MODULARNOŚĆ I PONOWNE UŻYCIE (REUSE) typ testowania związany najczęściej z testowaniem integracyjnym zaleta modularności: komponenty mogą być testowane niezależnie, np. na etapie testów jednostkowych ESOWANIE BAZUJĄCE NA ELEMENACH PROJEKOWYCH (DESIGN ELEMENS) grafy zwykle opisują powiązania (ang. coupling) pomiędzy elementami 33/41
Pokrycie elementów projektowych (2) strukturalne pokrycie grafowe grafy wywołań (call graphs) A wierzchołki = metody (moduły) krawędzie = wywołania metod NC: każda metoda musi być wywołana co najmniej raz B C D EC: każde wywołanie musi być wykonane co najmniej raz E Graf może być niespójny. Przypadek ekstremalny: brak wywołań wtedy ta technika nie jest właściwa (należy użyć techniki bazującej na sekwencyjności wywołań) 34/41
Pokrycie elementów projektowych (3) kryteria pokrycia dla programów zorientowanych obiektowo A B wciąż brak ustabilizowanej wiedzy o tym jak to najlepiej testować najbardziej oczywisty pomysł: testowanie dziedziczenia, ale klasy nie są testowane bezpośrednio! (dlaczego?) C D krawędzie przepływ wywołań krawędzie = zależności dotyczące dziedziczenia potrzeba modelu: czym jest tutaj pokrycie? 35/41
Pokrycie elementów projektowych (4) kryteria pokrycia dla programów zorientowanych obiektowo c.d. a1 b1 A B by zastosować pokrycie należy dokonać instancjacji obiektów NC: stworzony co najmniej 1 obiekt każdej klasy (nieciekawe nie mówi nic o wykonaniu) OO pokrycie wywołań: wymaga, by kryterium było zastosowane do co najmniej 1 obiektu każdej klasy c1 C d1 D rozszerzenie: All Object Call wymaga, by pokrycie dotyczyło wszystkich obiektów stworzonych dla każdej klasy 36/41
Pokrycie elementów projektowych (5) kryteria pokrycia przepływu danych dla elementów projektowych o wiele bardziej skomplikowane niż kryteria przepływu sterowania, a więc potencjalne źródło błędów! w testowaniu jednostkowym def i use są w tym samym module, w testowaniu integracyjnym mogą być w innych modułach interfejs caller (wołający) A... B(X)... end A B(Y)... end B caller (wołający) parametr aktualny parametr formalny 37/41
Pokrycie elementów projektowych (6) powiązane du-pary 1. X = 5 2. X = 4 3. X = 3 10. B(int y) 11. Z = y 12. = y 13. print(y) last-defs: {2, 3} first-uses: {11, 12} 4. B(X) last-def: zbiór wierzchołków definiujących zmienną, dla której istnieje def-czysta ścieżka z tych wierzchołków przez callsite do użycia w innym module first-use: zbiór wierzchołków używających zmiennej, dla których istnieje defczysta i use-czysta ścieżka z punktu wejścia (jeśli use jest w callee) lub z callsite (jeśli use jest w caller) do tych wierzchołków 38/41
Pokrycie elementów projektowych (7) powiązane du-pary caller callee G(a) du-para du-para x = 14... y = G(x)... print(y) print(a)... b = 42... return(b) last-def callsite first-use first-use last-def 39/41
Pokrycie elementów projektowych (8) inne rodzaje przepływu danych komplikujące testowanie A()... B() A B def use P1 A def komunikat (http, RMI, CORBA ) B P2 use OO bezpośrednio powiązany przepływ danych przepływ danych w oprogramowaniu rozproszonym M()... N() M N A() B() A B def use OO pośrednio powiązany przepływ danych 40/41
KONIEC 41/41