Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Zdzisław Sroczyński Politechnika Śląska Instytut Matematyki Inżynieria programowania.

1 Z. SroczyńskiInżynieria programowania Uruchamianie i te...
Author: Roman Muszyński
0 downloads 3 Views

1 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Zdzisław Sroczyński Politechnika Śląska Instytut Matematyki Inżynieria programowania Uruchamianie i testowanie programów Uruchamianie (debugging) Testowanie: – Atestowanie (validation) kontrola zgodności działania systemu z faktycznymi wymaganiami użytkownika – Weryfikacja (verification) kontrola zgodności systemu ze zdefiniowanymi wymaganiami Cele testowania: – Wykrycie i usunięcie błędów w systemie – uzyskanie poprawnego programu, tj. dającego poprawne wyniki – Ocena niezawodności systemu

2 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Testowanie – cele i metody Program uruchomiony nie zawiera błędów składniowych sygnalizowanych przez translator i generuje wyniki Testowanie pozwala zapewnić, aby otrzymywane wyniki były zgodne z oczekiwaniami (specyfikacją) (?) Organizacja testowania: – Sprowokowanie/odnalezienie błędów – Dokumentacja testowania – Liczba/czasochłonność testów (testowanie gruntowne) – Intuicja i doświadczenie

3 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Uruchamianie Uruchamianie to proces wyszukiwania i usuwania błędów. Fazy testowania i uruchamiania przeplatają się - testowanie stwierdza jedynie istnienie błędów Cykl testowania i uruchamiania: – testowanie (znaleziono błędy) – zlokalizuj błąd – zaplanuj naprawę – napraw błąd – testowanie powrotne (redundantne), jeżeli były błędy to przejdź do

4 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Kodowanie i uruchamianie – zasady przejrzysta implementacja: zasada KISS (ang.: Keep It Simple Stupid) pol.: BUZI (Bez Udziwnień Zapisuj Idioto) narzędzia wspomagające - debuggery kod wspomagający uruchamianie — mechanizmy nadzorujące poprawność wykonywania programu (np. kontrola indeksów tablic, asercje) informacje diagnostyczne ślad sterowania, ślad zmiennych zrzuty stanu programu (post mortem dump)

5 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Usterki w stylu programowania używanie niewłaściwie dobranych struktur pamięciowych używanie niewłaściwie dobranych struktur sterujących wykonaniem programu (pętli) bazowanie na niestandardowych, nieprzenośnych właściwościach kompilatora, efektach ubocznych niepotrzebne implementowanie czynności wykonywanych przez standardową bibliotekę zaniedbywanie zaleceń o przejrzystym formatowaniu, komentowaniu kodu, używaniu znaczących nazw

6 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Błędy kodowania - syntaktyczne Błędy syntaktyczne - nieprzestrzeganie zasad składni języka programowania: – brak średnika, nawiasu, innego znaku interpunkcyjnego lub wymaganego słowa kluczowego – nieprawidłowy lub nieprawidłowo umieszczony symbol, nawias, znak – nieprawidłowa postać identyfikatora lub stałej liczbowej lub tekstowej Wykrywane przez kompilator

7 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Błędy kodowania - semantyczne Błędy semantyczne - niezgodność zapisu z zasadami semantyki - reguł opisujących znaczenie programu: – brak deklaracji – niezgodność typów w wyrażeniu – przekroczenie zakresu typu w deklaracji (np. int n=10000000000; ) – niedozwolona wartość argumentu operacji (np. ujemny argument logarytmu) Wykrywane przez translator (statyczne) i nie wykrywane przez translator (dynamiczne)

8 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Błędy kodowania - logiczne błędy logiczne - kod napisany prawidłowo składniowo i semantycznie, lecz czynności niezgodne z intencją programisty: – użycie nieodpowiedniej konstrukcji (repeat zamiast while), procedury bibliotecznej – użycie nieodpowiedniego wzoru lub algorytmu – brak nadania wartości początkowych zmiennym – niewłaściwe indeksowanie pętli; – zamiana dróg po rozgałęzieniu w programie Literówki – do jakiej kategorii zaliczyć?

9 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Błąd a błędne wykonanie Błąd (fault, error) – niepoprawna konstrukcja w programie Błędne wykonanie (failure) [awaria] – niepoprawne działanie programu w trakcie pracy – efekt lub zachowanie niedopuszczalne w warunkach normalnych (np. powolne przetwarzanie dla pewnej klasy danych) Błąd może prowadzić do wielu błędnych wykonań, takie same błędne wykonania mogą być spowodowane różnymi błędami

10 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Klasyfikacja błędów - inaczej błędy kompilacji (uruchamianie) błędy wykona nia (ang. run-time errors) – niedozwolona operacja arytmetyczna (dzielenie przez zero, nadmiar arytmetyczny, przekroczenie zakresu) – niedozwolona operacja wejścia-wyjścia (otwieranie nieistniejącego pliku) – naruszenie mechanizmów ochrony pamięci – przekroczenie przyznanego czasu procesora błędne wyniki

11 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Podziały testów Testy statystyczne – wykrycie przyczyn błędnych wykonań i ocena niezawodności systemu Wykrywanie błędów – wykrycie jak największej liczby błędów Testy dynamiczne – wykonanie kodu i porównanie wyników ze wzorcem Testy statyczne – analiza kodu Testy modułów/systemu/akceptacyjne

12 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Testy statystyczne i niezawodność programu Losowa konstrukcja danych wejściowych/ automatyzacja Rozkład prawdopodobieństwa danych wejściowych zbliżony do rzeczywistego Miary niezawodności: – Prawdopodobieństwo błędnego wykonania (systemy transakcyjne) – Częstotliwość występowania błędnych wykonań (0,3/h) (systemy interakcyjne) – Średni czas między błędnymi wykonaniami (MTBF np. 200tys.h ->4,38% -> 1/23) – Dostępność (system zdatny do użytku)

13 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Oszacowanie niezawodności Dla testów statystycznych – dążenie do modelu liniowego Określenie zasobów potrzebnych do serwisowania (call- center, dział wdrożeń) Przewidywanie czasu zakończenia testów (osiągnięcia pożądanej jakości) N = Ns * exp(-C*t) – N – niezawodność – Ns – niezawodność początkowa – t – liczba testów – C – stała charakterystyczna

14 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Testy dynamiczne - wykrywanie błędów Testy funkcjonalne/względem specyfikacji zewnętrznej (black-box) – zakładamy znajomość jedynie wymagań (tester nie może znać implementacji!) Testy strukturalne/względem kodu/struktury wewnętrznej (white/glass-box) – zakładamy znajomość implementacji testowanych funkcji

15 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Testy funkcjonalne Podział danych wejściowych na klasy, dla których działanie powinno być analogiczne Heurystyczny dobór danych/klas Przykład: – przelew powyżej kwoty 10tys. zł powinien być zatwierdzony kodem jednorazowym – łączny dzienny limit przelewów dla konta wynosi 30tys. zł

16 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Testy funkcjonalne - zasady Objęcie testami wszystkich/możliwie wielu kombinacji warunków opisanych w specyfikacji Możliwość wykonania ważniejsza niż jakość (np. Błędne odświeżanie podglądu) Funkcjonalność poprzedniej wersji ważniejsza niż nowe możliwości Sytuacje typowe ważniejsze niż wyjątkowe

17 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Testy strukturalne Dane wejściowe na podstawie analizy struktury kodu programu Pokrycie wszystkich instrukcji (nie gwarantuje pokrycia dziedziny danych) Pokrycie instrukcji warunkowych (warunek spełniony/nie spełniony/wartości graniczne) Kryterium pokrycia ścieżek w grafie przepływu programu Pętle: minimalna/przeciętna/maksymalna liczba iteracji

18 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Testy strukturalne - przykład int a,b,w; //dowolne wartosci a i b0 //gwarantuja pelne pokrycie kodu if(b!=0) a = 2*b; //... w = (b-a)/a; //ale tylko b==0 pozwala //znalezc blad dzielenia dla a==0!

19 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Testy strukturalne - DPS DPS – diagram przepływu sterowania

20 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów DPS Macierz gałęzi 1,2,3 – nr zestawu testowego Na przecięciu oznaczenie decyzji dla danego zestawu

21 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów DPS Zbiór zestawów danych testowych

22 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Testy statyczne Dowody poprawności Metody nieformalne: – Analiza przebiegu sterowania w programie ● (w umyśle programisty) – Poszukiwanie typowych błędów ● inicjalizacja zmiennych ● porównania wartości zmiennoprzecinkowych ● indeksy przekraczające tablice ● operacje na wskaźnikach ● warunki ● zapętlenia ● wartości graniczne przedziałów (<

23 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Konserwacja oprogramowania – liczba błędów Liczba błędów ma bezpośredni wpływ na koszty konserwacji oprogramowania – szacunkowa liczba błędów w programie – średni % błędów zgłaszanych przez użytkownika – średni koszt usunięcia błędu Szacowanie liczby błędów - posiewanie błędów (błędy podobne do występujących): – N – liczba wprowadzonych błędów, – M – liczba wszystkich wykrytych błędów, – X – l. wprowadzonych błędów, które zostały wykryte S = (M-X) * N/X X/N – efektywność prowadzonych testów

24 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Etapy testowania Testowanie specyfikacji/projektu Dyrektywy kompilacji warunkowej – przygotowanie do testów Testowanie modułów (procedur, funkcji, fragmentów o określonej funkcjonalności) Testowanie integracyjne – test scalania Testowanie funkcjonalne Testowanie systemu – środowisko sztuczne Testowanie akceptacyjne – środowisko rzeczywiste (przykład: mysz a programy Insert) Testowanie instalacyjne

25 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Modele testowania Testowanie wstępujące: – Najpierw testowanie pojedynczych modułów – Późna detekcja błędów systemu jako całości Testowanie zstępujące: – Najpierw testowanie systemu (szkielet/zaślepka dla modułu) – Brak wpływu na dane przekazywane do modułów Zmodyfikowane testowanie zstępujące: – Najpierw moduły metodą wstępującą Testowanie mieszane – duże aplikacje, systemy operacyjne itp. Testowanie BigBang

26 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Testowanie systemu - uwagi Testy pod obciążeniem (stress testing): – systemy wielodostępne i wieloprocesorowe – Wydajności/dostępność/ciągłość Testy odporności (robustness testing) – działanie systemu pomimo zajścia zdarzeń niepożądanych (zanik zasilania, awaria sprzętu, niepoprawne dane, błędna sekwencja poleceń) Bezpieczeństwo systemów IT Programowanie defensywne Testowanie programów wielowątkowych Testowanie aplikacji webowych/ na urządzenia mobilne

27 Z. SroczyńskiInżynieria programowania Uruchamianie i testowanie programów Dziękuję za uwagę Następny temat: automatyzacja testów, testowanie GUI