Automatyzacja testowania oprogramowania Automatyzacja testowania oprogramowania 1/36
Automatyzacja testowania oprogramowania 2/36 Potrzeba szybkich rozwiązań Testowanie oprogramowania powinno być: efektywne wydajne Testowanie to 30% 40% (dla systemów krytycznych 80%) całkowitej pracochłonności Przetestowane programy zawierają błędy
Automatyzacja testowania oprogramowania 3/36 Obietnice automatyzacji testowania Zwiększenie testowania (przypadki testowe uruchamiane w minutach) Zmniejszenie kosztu testowania aż do 80 % wysiłku ręcznego testowania Lepszej jakości oprogramowanie wyprodukowane szybciej
Ocena jakości wariantu testu Automatyzacja testowania oprogramowania 4/36
Ocena jakości wariantu testu cd. Automatyzacja testowania oprogramowania 5/36
Automatyzacja testowania oprogramowania 6/36 Kto automatyzuje Test automator: Tester Programista
Automatyzacja testowania oprogramowania 7/36 Zalety Testy regresyjne Więcej testów częściej Wykonanie testów trudnych do wykonania ręcznie Lepsze użycie zasobów Spójność i powtarzalność testów Reużywalność testów Szybciej na rynek Zwiększona pewność Testowanie może odbywać się w nocy
Automatyzacja testowania oprogramowania 8/36 Ograniczenia automatyzacji Zautomatyzowane testy znajdują tylko 15% błędów. Ręczne testowanie znajduje 85% Bach, 1997 Automatyzacja testów nie poprawia ich efektywności Automatyzacja chaosu daje tylko szybszy chaos Automatyzacja testów może ograniczyć wytwarzanie oprogramowania (względy ekonomiczne) Duży koszt wytworzenia automatycznego testu 2 10x (max 30x) wysiłek związany z ręcznym wykonywaniem testów Automatyczne testy nie mają wyobraźni
Automatyzacja testowania oprogramowania 9/36 Kiedy testować ręcznie Testy są wykonywane rzadko Testowany program często ulega zmianom Wyniki są łatwe do sprawdzenia przez człowieka i trudne do zautomatyzowania (np. audio, schemat kolorów, układ kontrolek na formatce) Test wymaga fizycznej interakcji ze strony użytkownika
Automatyzacja testowania oprogramowania 10/36 Czynności w ramach testowania 1. Identyfikacja warunków testu 2. Zaprojektowanie przypadków testowych 3. Zbudowanie przypadków testowych 4. Uruchomienie przypadków testowych 5. Porównanie uzyskanych wyników z oczekiwanymi
Automatyzacja testowania oprogramowania 11/36 Czynności w ramach testowania 1. Identyfikacja warunków testu Warunek 1: przelew < 0 Warunek 2: użytkownik posiada konto
Automatyzacja testowania oprogramowania 12/36 Czynności w ramach testowania 2. Zaprojektowanie przypadków testowych Stan systemu: Zalogowany do systemu Baza danych posiada dane testowe Krok Wejście Oczekiwane wyjście Warunki testu 1. Wprowadź dane Komunikat pytający kwota = -1, przelewu o potwierdzenie nr konta = XXX 2. Potwierdź Informacja o błędnych danych kwota = -1, nr konta = XXX
Automatyzacja testowania oprogramowania 13/36 Czynności w ramach testowania 3. Zbudowanie przypadków testowych Przygotowanie procedur testowych Procedura testowa dla testu wprowadzenia ujemnej wartości kwoty przelewu: 1. Wciśnij przycisk Tab. 2. Wprowadź -1. 3. Wciśnij przycisk Tab. 4. Wprowadź nr konta = XXX 5. Wciśnij Tab. 6. Po podświetleniu się przycisku Submit wciśnij ENTER.
Automatyzacja testowania oprogramowania 14/36 Czynności w ramach testowania 3. Zbudowanie przypadków testowych cd. Przygotowanie danych wejściowych. Przygotowanie oczekiwanego wyjścia. Procedura testowa dla testu wprowadzenia ujemnej wartości kwoty przelewu:... 7. Sprawdź czy system pyta o potwierdzenie wykonania operacji. Jeśli nie to oznacza to błąd systemu. Wtedy wykonaj......
Automatyzacja testowania oprogramowania 15/36 Czynności w ramach testowania Kandydaci do automatyzacji: 4. Uruchomienie przypadków testowych 5. Porównanie uzyskanych wyników z oczekiwanymi
Automatyzacja testowania oprogramowania 16/36 Automatyzacja projektowania wariantów testu Na ogół są to generatory danych wejściowych Generują dużą liczbę testów Nie zidentyfikują brakujących wymagań
Automatyzacja testowania oprogramowania 17/36 Automaty oparte na kodzie aplikacji i f ( a > 0)... e l s e... Wygenerowane dane wejściowe dla a: 0, 1, 1000, -2 Własności: Generuje dane wejściowe Nie wygeneruje oczekiwanego wyjścia Nie zidentyfikuje brakujących wymagań
Automatyzacja testowania oprogramowania 18/36 Automaty oparte na interfejsie użytkownika Sprawdź czy dla każdej kontrolki istnieje funkcja pomocy Sprawdź czy można edytować pola tylko do odczytu Sprawdź wszystkie linki na stronie www Własności: Generuje dane wejściowe Oczekiwane wyjście jest częściowo generowane
Automatyzacja testowania oprogramowania 19/36 Automaty oparte na specyfikacji / @pre arg!= 0 / void show ( i n t arg1, double arg2 ) ; Własności: Specyfikacja musi być w formie możliwej do analizy przez automat Generuje dane wejściowe Czasem generuje oczekiwane wyjście
Automatyzacja testowania oprogramowania 20/36 Automatyzacja porównywania wyników Przewidź oczekiwane wyjście Testowanie referencyjne (ang. Reference testing) Oczekiwanym wyjściem jest wyjście zaobserwowane przy pierwszym wykonaniu testu Co powinno być porównywane? Zautomatyzowane porównanie może ukryć błąd (jeśli jest błąd w oczekiwanym wyjściu)
Automatyzacja testowania oprogramowania 21/36 Proste porównania Oczekiwane wyjście = faktyczne wyjście
Automatyzacja testowania oprogramowania 22/36 Filtry do porównań Rysunek: Filtry do porównań
Filtry do porównań cd. Automatyzacja testowania oprogramowania 23/36
Automatyzacja testowania oprogramowania 24/36 Filtry do porównań zalety i wady Zalety: Reużywalność filtrów Praca tylko nad wybranymi fragmentami wyjścia Łatwiejsza implementacja testu Możliwość stosowania prostych porównań Wady: Wymaga umiejętności programistycznych Wymagana jest pielęgnacja filtrów Konieczność stworzenia dokumentacji
Automatyzacja testowania oprogramowania 25/36 Automatyzacja pre-/post-processing Pre-processing: Ustawia stan systemu niezbędny do wykonania wariantu testu Wiele wariantów ma ustawia ten sam stan Warto zautomatyzować i reużywać Post-processing: Sprząta po wykonaniu wariantu testu Wiele wariantów sprząta w ten sam sposób Warto zautomatyzować i reużywać
Automatyzacja testowania oprogramowania 26/36 Automatyzacja wykonywanie testów Biblioteka CppUnit: wykonuje testy automatycznie pokazuje przebieg wykonania testów proste porównania wsparcie dla pre-/post-processingu
Automatyzacja testowania oprogramowania 27/36 Architektura CppUnit Rysunek: Diagram dziedziczenia
TestCase idea działania Automatyzacja testowania oprogramowania 28/36
Automatyzacja testowania oprogramowania 29/36 Proste porównania w klasie TestCase CPPUNIT ASSERT EQUAL ( oczekiwane, f a k t y c z n e ) CPPUNIT ASSERT DOUBLES EQUAL ( ocz, f a k t, t o l ) CPPUNIT ASSERT ( warunek ) CPPUNIT ASSERT THROW ( f u n k c j a, w y j ą t e k )
Automatyzacja testowania oprogramowania 30/36 TestCase przykład #i n c l u d e <s t d e x c e p t > c l a s s P i e n i a d z e { p r i v a t e : i n t kwota ; p u b l i c : P i e n i a d z e ( i n t k ) { i f ( k < 0) throw s t d : : r a n g e e r r o r ( " kwota mniejsza od 0" ) ; kwota = k ; } b o o l o p e r a t o r==(c o n s t P i e n i a d z e& o b j ) c o n s t { r e t u r n o b j. kwota == kwota ; } P i e n i a d z e d o d a j ( c o n s t P i e n i a d z e& p ) c o n s t { r e t u r n P i e n i a d z e ( kwota + p. kwota ) ; } P i e n i a d z e o d e j m i j ( c o n s t P i e n i a d z e& p ) c o n s t { r e t u r n P i e n i a d z e ( kwota p. kwota ) ; } } ;
Automatyzacja testowania oprogramowania 31/36 TestCase przyklad #i n c l u d e <c p p u n i t / T e s t F i x t u r e. h> #i n c l u d e <c p p u n i t / e x t e n s i o n s / HelperMacros. h> #i n c l u d e " Pieniadze.h" c l a s s P i e n i a d z e T e s t : p u b l i c CppUnit : : T e s t F i x t u r e { p r i v a t e : P i e n i a d z e p i e n i a d z e ; p r o t e c t e d : v o i d t e s t D o d a j ( ) ; v o i d t e s t O d e j m i j ( ) ; p u b l i c : P i e n i a d z e T e s t ( ) { } v o i d setup ( ) ; v o i d teardown ( ) ; } ;
Automatyzacja testowania oprogramowania 32/36 TestCase przyklad #i n c l u d e " PieniadzeTest.h" v o i d P i e n i a d z e T e s t : : t e s t D o d a j ( ) { CPPUNIT ASSERT ( p i e n i a d z e >d o d a j ( 8 ) == P i e n i a d z e ( 1 2 ) ) ; } v o i d P i e n i a d z e T e s t : : t e s t O d e j m i j ( ) { CPPUNIT ASSERT ( p i e n i a d z e >o d e j m i j ( 3 ) == P i e n i a d z e ( 1 ) ) ; } v o i d P i e n i a d z e T e s t : : setup ( ) { p i e n i a d z e = new P i e n i a d z e ( 4 ) ; } v o i d P i e n i a d z e T e s t : : teardown ( ) { d e l e t e p i e n i a d z e ; }
TestCase przyklad Automatyzacja testowania oprogramowania 33/36
Automatyzacja testowania oprogramowania 34/36 Tworzenie zbiorów przypadków testowych #i n c l u d e <c p p u n i t / e x t e n s i o n s / HelperMacros. h> #i n c l u d e <c p p u n i t / u i / t e x t / TestRunner. h> c l a s s P i e n i a d z e T e s t : p u b l i c CppUnit : : T e s t F i x t u r e { CPPUNIT TEST SUITE ( P i e n i a d z e T e s t ) ; CPPUNIT TEST( t e s t D o d a j ) ; CPPUNIT TEST( t e s t O d e j m i j ) ; CPPUNIT TEST SUITE END ( ) ; //... } ; i n t main ( i n t argc, char a r g v ) { CppUnit : : TextUi : : TestRunner r u n n e r ; r u n n e r. addtest ( P i e n i a d z e T e s t : : s u i t e ( ) ) ; r u n n e r. run ( ) ; r e t u r n 0 ; }
Automatyzacja testowania oprogramowania 35/36 CppUnit dobre praktyki programistyczne konstruktor() vs setup() unikać wpisywania na sztywno ścieżek dostępu do zasobów uniezależnić testy od czasu, lokalizacji itd. obsługa wyjątków zakładaj, że przypadki testowe są wykonywane w dowolnej kolejności unikaj pisania przypadków testowych z efektami ubocznymi testowanie prywatnych metod
Automatyzacja testowania oprogramowania 36/36 W wykładzie wykorzystano materiały Automatyzacja wykonywania testów, Błażej Pietrzak, http://wazniak.mimuw.edu.pl/index.php?title=io-11-wyk-toc