Testowanie I Cel zajęć Celem zajęć jest zapoznanie studentów z podstawami testowania ze szczególnym uwzględnieniem testowania jednostkowego. Testowanie oprogramowania Testowanie to proces słyżący do oceny jakości wytwarzanego oprogramowania. Testowanie może odbywać się na kilku najważniejszych poziomach: testowanie jednostkowe testuje implementację najmniejszej jednostki (komponentu) oprogramowania w przypadku programiania obiektowego jest to zwykle klasa, testowanie integracyjne skupia się na wykrywaniu defektów w interfejsach oraz interakcjach między komponentami, testowanie akceptacyjne preprowadzane często przez klienta, użytkownika końcowego w celu sprawdzenia, czy produkt można zaakceptować. Podczas testowania można wykryć: błędy (ang. faults) defekty programistyczne, które mogą (w pewnych warunkach) okazać się blędami wykonania, błędne wykonania niepoprawne wykonanie się programu (niezgodne z tym czego oczekujemy). Z punktu widzenia osoby, która przygotowuje testy można je też podzielić na: testy czarnej skrzynki (ang. black box testing) nie biorą pod uwagę tego w jaki sposób dany element jest zbudowany/zaimplementowany. Osoba testująca nie może sprawdzić w jaki sposób dany element działa, podaje jedynie dane wejściowe i sprawdza, czy otrzymany wynik zgadza się z wynikiem oczekiwanym. testy białek skrzynki (ang. white box testing) biorą po uwagę wewnętrzną budowę testowanego elementu. Osoba testująca ma wgląd w wewnętrzną strukturę danego elementu, może spojrzeć na wykorzystane algorytmy, implementację, itp. Podczas testowania należy pamiętać, że: Nie jest możliwe całkowite przetestowanie programu. Testowanie może pokazać jedynie, że błedy istnieją, a nie ich brak.
Testowanie jednostkowe (przy wykorzystaniu narzędzia JUnit) Testowanie jednostkowe pozwala: sprawdzić, czy pojedyncza jednostka kodu zachowuje się poprawnie, porównać oczekiwany wynik z wynikiem otrzymanym z kodu sprawdzić poprawność kodu po wprowadzeniu zmian JUnit jest narzędziem umożliwiającym sprawne automatyczne testowanie jednostkowe kodu napisanego w Javie (istnieją również odpowiedniki dla innych języków, np. NUnit dla C#, czy CppUnit dla C++). W celu pracu z JUnitem wykorzystamy Eclipse''a, który w znaczyny sposób ułatwia i przyspiesza korzystanie z tego narzędzia. 1. Zaimportuj projekt z pliku SimpleCalculator.zip (File->Import->Existing Project Into Workspace). 2. Przejdź do widoku Package Explorer (Window->Show View). W projekcie tworzymy source folder o nazwie test, pozwoli nam to utrzymać porządek. W widoku Package Explorer klikamy PPM na projekcie i wybieramy New->Source Folder 3. Klikając PPM na klasie w widoku Package Explorer wybieramy New->JUnit Test Case:
4. W kreatorze nowego testu podajemy wymagana informacje oraz zaznaczamy opcję New JUnita 4 test: Zwróćmy uwagę na folder, w którym umieszczamy nasz test, na nazwę pakietu oraz na nazwę klasy testującej. Klikamy Finish. 5. Zostanie wygenerowana klasa testująca. W pliku SimpleCalculatorTest.java przygotowane są przykładowe metody testujące kopiujemy je do wygenerowanej klasy. Najważniejsze elementy kodu testującego to: Metody testujące oznaczane są przez @Test Metoda uruchamiana przed każdą metodą testującą oznaczana jest przez @Before Metoda uruchamiana po każdej metodzie testującej oznaczana jest przez @After Metoda uruchamiana jednokrotnie przed wszystkimi metodami testujęcymi oznaczana jest przez @BeforeClass Metoda uruchamiana jednokrotnie po wszystkich metodach testujęcych oznaczana jest przez @AfterClass Annotacja @Test może być sparametryzowana przez nazwę wyjątku jakiego spodziewamy się z testowanej metody Annotacja @Ignore pozwala zignorować daną metodę testującą 6. Pozostaje nam uruchomić testy. Klikamy PPM na klasie SimpleCalculatorTest i wybieramy Run As->JUnit Test Case:
Spójrzmy do widoku Console. Znajdziemy tam komunikaty wypisywane w metodach oznaczanych przez @Before, @After, @BeforeClass, @AfterClass oraz w metodach testujących. Łatwo zauważyć, że metoda oznaczana przez @BeforeClass została wykonana tylko raz na samym początku, metoda oznaczona przez @AfterClass została wykonana raz na samym końcu. Natomiast metoda @Before wykonywana była przed każdą metodą testującą (oznaczoną przez @Test), a metoda @After była wykonywana po każdej metodzie testującej. 7. Po zakończeniu testów pojawi się widok JUnit z wynikami testów: 8. Jak widzimy jeden z testów nie powiódł się. Zaglądamy do źródeł, staramy się naprawić problem i uruchamiamy testy ponownie. Po naprawie widok JUnit powinien wyglądać mniej więcej tak:
Ćwiczenie 1. Zaimportuj projekt z pliku ComplexCalculator4Students.zip (File->Import->Existing Project Into Workspace). W zaimportowanym projekcie w folderze lib znajduje się biblioteka jar z klasą ComplexCalculator (biblioteka fizycznie znajduje się w katalogu lib, ale w widoku Package Explorer jest widoczna jako Referenced Library, gdyż została dodana do ścieżki projektu <Build Path>). Naszym zadaniem będzie napisanie testów dla tej klasy. W katalogu doc znajduje się dokumentacja javadoc dla tej klasy. 2. Stwórz folder o nazwie test. 3. Stwórz klasę ComplexCalculatorTest i wypełnij ją testami dla klasy ComplexCalculator. 4. Po znalezieniu błędów (w każdej dostępnej metodzie klasy ComplexCalculator ukryty jest co najmniej jeden błąd) Twoim zadaniem będzie ich naprawa. W tym celu potrzebujemy źródła naszej biblioteki complexcalculator.jar., tak żebyśmy mogli wprowadzać do nich zmiany i móc bezpośrednio uruchamiać testy. 5. Zaimportuj projekt z pliku ComplexCalculator.zip (File->Import->Existing Project Into Workspace). W projekcie tym znajdują się źródła dla biblioteki complexcalculator.jar. 6. Usuń bibliotekę complexcalculator.jar ze ścieżki projektu kliknij PPM na bibliotece i wybierz Build Path->Remove from Build Path. W tym momencie Twój projekt z testami powinien przestać się kompilować. 7. Dodaj projekt ComplexCalculator jako zależność dla projaktu ComplexCalculator4Students kliknij PPM na projekcie ComplexCalculator4Students i wybierz Properties. We właśniwościach przejdź na stronę Java Build Path, następnie wybierz zakładkę Projects. Kliknij przycisk Add... i wybierz projekt ComplexCalculator. Na koniec zatwierdź zmiany klikając OK.
Teraz Twój projekt powinien się kompilować. 8. Popraw błędy w projekcie ComplexCalculator. Uruchom testy, aby sprawdzić, czy błędy zostały naprawione.