Testowanie algorytmow, przypadki brzegowe, tabele sledzenia, debugowanie
ð Podstawa programowa: I.3Napisanie algorytmu to dopiero polowa sukcesu. Musimy upewnic sie, ze dziala on poprawnie dla wszystkich dopuszczalnych danych wejsciowych. Bledny algorytm moze dawac pozornie dobre wyniki dla niektorych danych, ale zawiesc w innych przypadkach. W profesjonalnym programowaniu bledy w algorytmach moga prowadzic do powaznyz konsekwencji - od strat finansowych po zagrozenie ludzkiego zycia (np. w systemach sterowania samolotami lub urzadzeniach medycznych).
Weryfikacja algorytmow jest kluczowa umiejetnoscia kazdego programisty. Istnieja rozne metody sprawdzania poprawnosci - od recznego sledzenia krokowego, przez testowanie na przykladowych danych, az po formalne dowody matematyczne. Na naszym poziomie skupimy sie na praktycznych metodach testowania, ktore pozwola nam skutecznie wykrywac bledy w algorytmach.
Przypadki brzegowe to dane wejsciowe, ktore sa w jakis sposob specjalne lub ekstremalne. To wlasnie dla takich danych algorytmy najczesciej zawieraja bledy. Dobry programista zawsze testuje swoj algorytm na przypadkach brzegowych:
Tabela sledzenia to systematyczne narzedzie do recznego przesledzenia algorytmu. Tworzymy tabele z kolumnami dla kazdej zmiennej i wpisujemy ich wartosci po kazdym kroku algorytmu:
Przyklad: Sledzenie algorytmu silni dla n=4
ALGORYTM Silnia(n): | Krok | i | wynik
wynik = 1 |------|---|-------
DLA i OD 1 DO n: | 0 | - | 1
wynik = wynik * i | 1 | 1 | 1
ZWROC wynik | 2 | 2 | 2
| 3 | 3 | 6
| 4 | 4 | 24
| Wynik: 24 (4! = 24, OK)
Aby skutecznie testowac algorytmy, nalezy przygotowac zestaw przypadkow testowych pokrywajacy rozne kategorie danych. Kazdy test powinien zawierac: dane wejsciowe, oczekiwany wynik i typ testu. Dobrze zaprojektowany zestaw testow powinien obejmowac cztery kategorie:
ALGORYTM CzyPierwsza(n):
JESLI n <= 1 ZWROC "NIE"
JESLI n = 2 ZWROC "TAK"
JESLI n MOD 2 = 0 ZWROC "NIE"
DLA i OD 3 DO sqrt(n), KROK 2:
JESLI n MOD i = 0 ZWROC "NIE"
ZWROC "TAK"
Zestaw testow:
| Dane | Oczekiwany | Typ testu |
|-------|------------|---------------|
| n=0 | NIE | brzegowy |
| n=1 | NIE | brzegowy |
| n=2 | TAK | brzegowy |
| n=7 | TAK | typowy |
| n=25 | NIE | typowy (5*5) |
| n=97 | TAK | duza pierwsza |
| n=-5 | NIE | negatywny |
Wykonaj sledzenie krokowe algorytmu Euklidesa (wersja z MOD) dla danych: NWD(84, 36). Wypelnij tabele sledzenia z kolumnami: krok, a, b, r. Zweryfikuj wynik.
Sprawdz, czy algorytm sortowania przez wstawianie dziala poprawnie dla: a) tablica jednoelementowa [5], b) tablica juz posortowana [1,2,3,4], c) tablica posortowana odwrotnie [4,3,2,1], d) tablica z powtorzeniami [3,1,3,1,2].
Algorytm szuka maksimum w tablicy, ale zawiera blad. Znajdz go i popraw: max = 0; DLA i OD 0 DO n-1: JESLI T[i] > max: max = T[i]; ZWROC max. Wskazowka: sprawdz dla tablicy [-3, -1, -5].
Zaprojektuj zestaw minimum 8 testow dla algorytmu szyfru Cezara. Dla kazdego testu podaj: dane wejsciowe, oczekiwany wynik, typ testu (typowy/brzegowy/negatywny). Uwzglednij zawijanie liter, klucz zerowy, pusty tekst i znaki specjalne.