Analiza poprawności kodu

Wstęp.

Testowanie jest bardzo ważnym etapem w procesie tworzenia oprogramowania. Jego rola jest niestety często lekceważona. Cierpią na tym zarówno użytkownicy jak i firmy tworzące i rozprowadzające naszpikowany błędami software (cierpi na tym ich dobre imie, ale także i portfel)..

Dowodzenie poprawności działania programów w sposób formalny byłoby idealnym rozwiązaniem. Nie da się jednak tego zastosować w większości typowych przypadków przy tworzeniu dużych aplikacji. Dlatego powstało wiele metod i narzędzi ułatwiających testowanie. Prezentacja ta ma na celu ich omówienie.

Kilka powodów dlaczego powinno się testować programy:

Testy dzielimy na:

Nigdy nie możemy być pewni, że udało nam się już wyeliminować wszystkie błędy! Testy jedynie minimalizują ryzyko ich wystąpienia.

 

Błędy.

Z raportu Software Lifecycle, sporządzonego przez National Cybersecurity Partnership's Working Group, wynika, że w komercyjnym oprogramowaniu występuje od jednego do siedmiu błędów na 1000 linii kodu!!!

Przy tych danych Linux wydaje się być systemem niemal bezbłędnym. Firma Coverity podała, że w 5 milionach 700 tysiącach linii kodu, składających się na najnowsze jądro Linuksa, znaleziono 985 błędów (0,17 błędu na 1000 linii kodu).

Co ciekawe okazuje się, że ilość błędów przypadających na 1000 linii kodu w komercyjnym oprogramowaniu nie zmienia się znacząco na przestrzeni lat.

 

Różne podejścia do problemu testowania poprawności kodu.

 

Analiza statyczna\dynamiczna.

Podział ze względu na etap w którym odbywa się testowanie.

Testowanie statyczne

Dużą część tych testów wykonuje za nas kompilator. Istnieją niestety błędy przy których znalezieniu jesteśmy zdani jedynie na siebie (np. rozmieszczenie nawiasów w wyrażeniach logicznych lub odwoływanie się do zmiennej dynamicznej, której nie zainicjalizowaliśmy).

Testowanie dynamiczne.

 

Metody czarnej i białej skrzynki.

Podział ze względu na stopień znajomości struktury programu.

Metoda białej skrzynki.

Metoda czarnej skrzynki.

  • odbywa się w oparciu jedynie o znajomośc interfejsów konkretnych modułów/funkcji programu lub interfejsu całego systemu oraz ogólnego przeznacznia testowanej aplikacji.
  • testy te powinny być realizowane przez osoby nie zaangażowane bezpośrednio w proces tworzenia kodu.
  • testuje ogólną funkcjonalność i poprawność jednak cieżko jest w ten sposób wychwycić przypadki szczególne.

 

Metodologia wykonywania testów funkcjonalnych\strukturalnych.

Testy funkcjonalne.

Jakość tych testów zależy głównie od sposobu wyboru danych testowych:

Testy strukturalne.

Najlepszą jakość tych testów zapewni badanie poprawności kodu tak, żeby:

 

Testowanie na różnych etapach projektu.

Podział ze względu na wielkość testowanych elementów:

 

 

Testowanie mutacyjne (testowanie testów).

 

Pisząc testy prawie nigdy nie możemy mieć pewności, że wykryją one wszystkie błędy testowanego programu.

Istnieje całkiem prosta metoda poprawiania jakości testów. Nazywa się: testowanie mutacyjne.

Działa w następujący sposób:

Oczywiście zastosowanie tej metody nie zapewnia nam uzyskania idealnego zestawu testów. Wiemy jedynie, że będzie niegorszy od wyjściowego.

To czy uda nam się w ten sposób rozszerzyć zbiór testów na tyle, żeby wykryć rzeczywisty błąd naszego programu zależy w dużej mierze od tego jak bardzo podobne do tego błędu są zaburzenia jakie wprowadzamy do tego programu.

 

 

Automatyzacja przeprowadzania testów.

Standardowe metody testowania stosowane przez programistów:

Metody te są skuteczne, ale ich wielokrotne stosowanie po dodaniu kolejnych poprawek jest pracochłonne i niezbyt wygodne. Programista łatwo może się zniechęcić i przez to nie będzie mógł wykonywać testów tak często jakby chciał.

Dlatego powstało wiele programów, które autoamtyzują proces testowania.

Dwie techniki automatyzowania testów:

Główne zalety automatyzacji testów:

 

 



Strona główna