Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
TESTOWANIEOPROGRAMOWANIA
„Uważaj na ten program – ja tylkoudowodniłem jego poprawność,nie testowałem go”
Donald Knuth
Plan prezentacji
Testowanie oprogramowania 2 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
Testowanie – wstęp
Testowanie oprogramowania 3 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
„Testowanie może wykazać wyłącznie istnienie bugów, nigdy ich brak.”
Edsger W. Dijkstra
„Jeśli nie masz ochoty na testowanie swojego produktu, pamiętaj, że twoi klienci też nie będą tego robić”
autor nieznany
Testowanie – wstęp
Testowanie oprogramowania 4 / 20
• testowanie kodu na bieżąco wielokrotnie skraca czas potrzebny na usunięcie błędów w oprogramowaniu
•bez testów ukończenie programu (stworzenie działającej wersji) jest praktycznie niemożliwe
Testowanie – wstęp
Testowanie oprogramowania 5 / 32
•poprawność – zgodność faktycznego zachowania programu z oczekiwanym
•wydajność – spełnianie wymagań czasowych
•niezawodność – odporność na działanie pod wymaganym obciążeniem
•bezpieczeństwo – odporność na ataki, ochrona danych
Co można testować?
Testowanie – wstęp
Testowanie oprogramowania 6 / 32
•black-box testing – spojrzenie na system z zewnętrznego punktu widzenia; system jako „czarna skrzynka”, która ma realizować określone zadania i tylko pod tym kątem jest testowana – np. testy odbioru
•white-box testing – testowanie obejmujące wgląd we wnętrze programu: testujący przeprowadza test jednocześnie badając kod programu. Wymagane umiejętności programistyczne – np. testy jednostkowe
Typy testowania ze względu na perspektywę
Refaktoryzacja
Testowanie oprogramowania 7 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
•kluczowa dla skutecznego testowania i poprawiania błędów
•przeprowadzenie testu to tylko połowa sukcesu - należy jeszcze poprawić błąd
•dobrze napisany kod ułatwia programowanie przyrostowe („małymi krokami”)
refaktoryzacja – poprawa jakości kodu bez zmiany jego funkcjonalności
Refaktoryzacja
Testowanie oprogramowania 8 / 32
„Pierwszy lepszy głupiec potrafi napisać kod zrozumiały dla komputera. Dobrzy programiści piszą kod zrozumiały dla człowieka.”
Martin Fowler
„To świetna zabawa, kiedy można rozwikłać zagadkę morderstwa, ale kod nie powinien wymagać rozwikłania. Kod powinien dawać się czytać.”
Steve McConnell
Testowanie – podstawowe pojęcia
Testowanie oprogramowania 9 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
bug – każde zachowanie programu, które odbiega od oczekiwanego; zadaniem testów jest ich „wyłapywanie”i diagnozowanie
jednostka – pojedynczy element programu, podlegający testom jednostkowym, np. metoda, funkcja, klasa
przypadek testowy – zestaw danych, który służy do przetestowania danej jednostki; zawiera dane wejściowe i odpowiadający im poprawny wynik
Programowanie sterowane testami(ang. test-driven programming)
Testowanie oprogramowania 10 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
• testy jako sformalizowany sposóbzapisu wymagań funkcjonalnych
•najpierw przygotowywany jesttest (klasa testowa, przypadektestowy), a dopiero potemtworzona jest jednostka, która ma za zadanie „przejść” test
•niezaliczenie testu jest równoznaczne z błędnym kodem (niespełnieniem wymagań)
Programowanie sterowane testami(ang. test-driven programming)
Testowanie oprogramowania 11 / 32
przygotowanietestu
kompilacja testu
przygotowaniejednostki testowanej
kompilacja testu
analiza wynikui ewentualne
poprawki
BŁĄD
błąd kompilacji(brak testowanej jednostki)
Programowanie sterowane testami(ang. test-driven development)
Testowanie oprogramowania 12 / 32
• dodatkowe nakłady pracy bez wyczuwalnych zysków (więcej tworzonego kodu)
• żmudny proces tworzenia testów
• bardzo przejrzyście sformułowane wymagania względem systemu
• zmniejszenie ilości błędów – usterkiwyłapywane „na bieżąco”
• oszczędności czasowe! (mniej debugowania)• modularność, rozszerzalność kodu
ZALETY
WADY
Testy jednostkowe
Testowanie oprogramowania 13 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów 11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
•najniższy poziom testówzorganizowanych
•poprawność pojedynczychjednostek (klas, funkcji)
• fragment programu (jednostka) poddawany jest testowi, a wynik działania porównywany jest z wcześniej przygotowanym wynikiem wzorcowym
Testy jednostkowe
Testowanie oprogramowania 14 / 32
•bardzo elastyczne tworzenie przypadków testowych (można np. stworzyć zestaw testowy, który oczekuje na rzucenie określonego wyjątku)
• testy zautomatyzowane, wykonywane na bieżąco
• tworzą swoistą dokumentację – czytając kod testu, można rozpoznać, jaka funkcjonalność jest wymagana od danej jednostki
Testy jednostkowe
Testowanie oprogramowania 15 / 32
Mock Objects(ang. mock - przedrzeźniać, udawać)
•obiekty symulujące działanie zewnętrznych, złożonych komponentów
• testy powinny być odizolowane od zewnętrznych czynników – testowana powinna być wyłącznie jednostka
•przykład – testując moduł wyświetlania, zamiast łączyć się z bazą przy każdym teście, tworzymy „podróbkę” połączenia, oszczędzając czas
Testy jednostkowe
Testowanie oprogramowania 16 / 32
Asercje•warunki konieczne do zaliczenia testu
• jeden test – zero lub więcej asercji; niezaliczenie którejkolwiek asercji to przerwanie testu z wynikiem negatywnym
Przykłady:
• assertEquals(a, b) – przechodzi, gdy a == b
• assertNotNull(a) – przechodzi, gdy a nie jest null
JUnit – testy jednostkowe w Javie
Testowanie oprogramowania 17 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
http://junit.org
•wspiera zautomatyzowaneprzeprowadzanie testów
•klasy testowe opisywaneza pomocą annotacji
•bogata kolekcja pluginów do integracji Junitróżnymi środowiskami użytkownika(Eclipse, NetBeans)
JUnit – testy jednostkowe w Javie
Testowanie oprogramowania 18 / 32
objectTestResult
interfaceTestListener
objectTestFailure
TestSuite TestCase
Assert
BaseTestRunner
TestRunner
błędy
interfaceTest
JUnit – testy jednostkowe w Javie
Testowanie oprogramowania 19 / 32
PrzykładPrzetestujemy metodę max() z klasy java.lang.Math
import org.junit.Test;import static org.junit.Assert.assertEquals;public class MyTestClass {
@Testpublic void testMax() {
//kod testujący}
}
JUnit – testy jednostkowe w Javie
Testowanie oprogramowania 20 / 32
PrzykładTestujemy metodę max() z klasy java.lang.Math
import org.junit.Test;import static org.junit.Assert.assertEquals;public class MyTestClass {
@Testpublic void testMax() {
assertEquals( 3, (int)Math.max(3,6) ); //oblanyassertEquals( 6, (int)Math.max(3,6) ); //zaliczony
}}
CppUnit – testy jednostkowe w C++
Testowanie oprogramowania 21 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
http://cppunit.sourceforge.net
•Podobnie jak Junit wspieraautomatyczne przeprowadzanietestów
•klasy testujące dziedziczą po klasieCppUnit::TestCase i przykrywają metodę wirtualną runTest()
• rezultat jest obiektem (referencją do obiektu)klasy CppUnit::TestResult
CppUnit – testy jednostkowe w C++
Testowanie oprogramowania 22 / 32
TestRunner
Test
TexTestRunnerTestResult
TestSuite TestSuite
TestCaller
TestFixture
CppUnit – testy jednostkowe w C++
Testowanie oprogramowania 23 / 32
#include #include class Max_test : public CppUnit::TestCase {public: void runTest() { assert(max(1,2)==1); //sztucznie wprowadzony błąd! assert(max(2,1)==2);};
PrzykładPrzetestujemy następującą funkcję max():
int max (int a, int b) {if ( a > b ) {
return a;}else {
return b;}
}Tworzymy klasę testującą:
CppUnit – testy jednostkowe w C++
Testowanie oprogramowania 24 / 32
PrzykładUruchamiamy test z klasy testującej:
void main() {CppUnit::TestResult result;Max_test max;max.run( &result );
}
Testy integracyjne
Testowanie oprogramowania 25 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
•sprawdzanie poprawności współpracy pomiędzy komponentami systemu
•coraz większe grupy komponentówsą integrowane i testowane podkątem wzajemnej komunikacji (met. iteracyjna),do momentu przetestowania systemu jako całości
•wykrywa usterki w interfejsach
Testy systemowe
Testowanie oprogramowania 26 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
• testowanie systemu z perspektywyużytkownika końcowego
•przeprowadzane na kompletnym(w pełni zintegrowanym) systemie
•badanie pod kątem spełnienia wymagań funkcjonalnych
• testerzy umyślnie usiłują wywołać błędy, robiąc wszystko, czego tylko można się spodziewać po userze (ang. destructive attitude)
Testy regresyjne
Testowanie oprogramowania 27 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów 11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
„Patch to poprawka do programu, usuwająca stare błędy i dodająca nowe.”
Prawo Murphy'ego
„Błędy pojawią się w jednej części działającego programu, kiedy zmienisz drugą, zupełnie z nią niepowiązaną”
Prawo Murphy'ego
Testy regresyjne
Testowanie oprogramowania 28 / 32
•polegają na ponownym testowaniu fragmentu programu po wprowadzeniu modyfikacji
•mają na celu upewnienie się, że wprowadzona poprawka/modyfikacja nie stworzyła nowych bugów w innych częściach programu
•częstą metodą przeprowadzania jest ponowne uruchomienie wcześniej zaliczonych testów – sprawdzenie, czy nie pojawiają się nowe błędy
Pozostałe testy
Testowanie oprogramowania 29 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
• testowanie stworzonego systemu podkątem współpracy z innymi (system jako komponent)
Testy integracyjno-systemowe
• ostateczne testowanie gotowej aplikacji, gotowej do przekazania klientowi
• klient może dokonać testów odbioru na własną rękę(UAT, ang. User Acceptance Testing)
Testy odbioru
Hierarchia testów
Testowanie oprogramowania 30 / 32
testy jednostkowe
testy integracyjne
testy integracyjno-systemowe
testy systemowe
testy odbioru(developera)
testy odbioru(klienta)
poprawki
testy regresyjne
BŁĄD
wykrycie błędu
testowanie
Narzędzia wspomagające testowanie
Testowanie oprogramowania 31 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
xUnit umowna nazwa bibliotek/frameworków do testów jednostkowych dostępny dla wielu języków
JIRA, trac, Bugzilla oprogramowanie wspomagające zarządzanie projektem, raportowanie błędów i usterek
Canoo WebTest, WatiN otwarte narzędzia do efektywnego testowania aplikacji webowych
JSystem narzędzie do zautomatyzowanego tworzenia testów systemowych
więcej:
http://www.opensourcetesting.org/
Źródła, dalsze informacje
http://wazniak.mimuw.edu.pl/ [PL] (kurs Zaawansowane CPP, wykład 4 - „Testowanie”)
http://en.wikipedia.org/wiki/Software_testing [EN] (bardzo rozbudowany artykuł)
http://www.testinggeek.com/ [EN] (portal dla testerów)
http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/ [EN] (artykuł na temat testowania oprogramowania)
Książki:
„Software Testing: A Craftsman's Approach” Paul Jorgensen„Sztuka testowania oprogramowania” Glenford J. Myers
Testowanie oprogramowania 32 / 32
1. Testowanie – wstęp2. Refaktoryzacja3. Pojęcia związane z testowaniem4. Programowanie sterowane testami5. Testy jednostkowe
5.1. JUnit 5.2. CppUnit
6. Testy integracyjne7. Testy systemowe8. Testy regresyjne9. Pozostałe testy
10. Hierarchia testów11. Narzędzia wspomagające testowanie12. Źródła i przydatne linki
http://wazniak.mimuw.edu.pl/http://en.wikipedia.org/wiki/Software_testinghttp://www.testinggeek.com/http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/
TytułSpis treściTestowanie - po co?Slajd 4Slajd 5Slajd 6Slajd 7Slajd 8Slajd 9Slajd 10Slajd 11Slajd 12Slajd 13Slajd 14Slajd 15Slajd 16Slajd 17Slajd 18Slajd 19Slajd 20Slajd 21Slajd 22Slajd 23Slajd 24Slajd 25Slajd 26Slajd 27Slajd 28Slajd 29Slajd 30Slajd 31Slajd 32