TESTOWANIE I JAKOŚĆ OPROGRAMOWANIA – LABORATORIUM
Transkrypt
TESTOWANIE I JAKOŚĆ OPROGRAMOWANIA – LABORATORIUM
TESTOWANIE I JAKOŚĆ OPROGRAMOWANIA – LABORATORIUM NR 4 Obiekty imitacji – EasyMock: podstawy Klasa EasyMock umożliwia proste tworzenie obiektów imitacji na podstawie interfejsu. Dla danego testu możemy „nagrad” sekwencję wywołao metod danego interfejsu podając także oczekiwane odpowiedzi. Następnie przełączamy obiekt imitacji w stan odtwarzania. Instalacja Sciągnij najnowszą wersję EasyMock : http://easymock.org/ Dodaj easymock.jar do wykorzystywanych bibliotek : w Eclipse: Project->Properties zakładka Java Build Path a w niej na zakładce Libraries wybieramy Add External JARs... Przykład import static org.easymock.EasyMock.*; import junit.framework.*; interface IMath{ // dla danej liczby rzeczywistej x zwraca // największa liczbę całkowitą mniejszą od x public int floor(double x); // zapamietuje liczbę w "pamięci" public void store(double x); // zwraca zapamiętaną liczbę i ja usuwa z "pamięci" // gdy nie ma takiej rzuca wyjątek public double restore() throws RuntimeException; } public class EasyMockTest extends TestCase{ public void testEasyMock(){ // tworzymy obiekt imitacji IMath mat = createMock(IMath.class); // Nagrywamy sekwencje wywołań // kolejność wywołań na znaczenie, dlatego ma być sprawdzana checkOrder(mat,true); mat.store(1.0); expect(mat.restore()).andReturn(1.0); expect(mat.restore()).andThrow(new RuntimeException("Pusta pamięć")); checkOrder(mat,false); // funkcja mat.floor z argumentem 1.1 musi byc wywolana dokladnie raz expect(mat.floor(1.1)).andReturn(1); // funkcja mat.floor z argumentem 2.2 musi byc wywolana dokladnie 2 razy expect(mat.floor(2.2)).andReturn(2).times(2); // funkcja mat.floor z arg. 3.3 może być wywołana dowolna liczbę razy (także zero) expect(mat.floor(3.3)).andStubReturn(3); // przełączamy obiekt imitacji w tryb odtwarzania replay(mat); mat.store(1.0); assertEquals(1.0, mat.restore(), 0.0001); try{ mat.restore(); fail("Powinien byc rzucony wyjatek"); }catch(RuntimeException e){ } assertEquals(2,mat.floor(2.2)); assertEquals(1,mat.floor(1.1)); assertEquals(2,mat.floor(2.2)); // To rzuci wyjatek Unexpected method call: za duzo wywolan // assertEquals(2,mat.floor(2.2)); // To nie jest konieczne assertEquals(3,mat.floor(3.3)); // To rzuci wyjatek Unexpected method call: nie ma takiego wywolania nagranego //assertEquals(2,mat.floor(2.3)); // sprawdzamy czy wszystkie wymagane wywolania zostaly wykonane verify(mat); } } Testowanie servletu. Obiekty imitacji. W załączonych plikach znajduje się wycinek serwisu WWW. Zadaniem servletu Bouncer (Bramkarz) jest „zdradzanie” właściwego adresu tylko zarejestrowanym użytkownikom. Weryfikacji dokonuje na podstawie danych z formularza (pola o nazwach login i password) otrzymanych metoda POST. W celu autoryzacji używa obiektu klasy LoginService. LoginService szyfruje hasło przy pomocy Encoder'a a następnie sprawdza w UserDataBase czy dany użytkownik istnieje (w bazie przechowywane są „zaszyfrowane” hasła). Celem dwiczenia jest napisanie testów jednostkowych dla klas LoginService oraz Bouncer. UWAGA: Aby serwis poprawnie się kompilował konieczne jest dodanie biblioteki JAVA2 EE (jeżeli taka jest dostępna w środowisku) lub dołączenie do projektu pliku servlet.jar (do pobrania z internetu). Zadanie 1. Gdzie najlepiej umieścid testy? Jakie są zalety umieszczenia ich w tym samym katalogu co testowana klasa? Dlaczego jednak nie najlepiej jest umieszczad je w tym samym katalogu? Jakie inne rozwiązanie można zaproponowad? Zadanie 2. Napisz testy jednostkowe które przetestują metodę login klasy LoginService. Ponieważ LoginService może korzystad z różnych enkoderów jak również baz danych, które potencjalnie mogą zawierad błędy. Aby zapewnid izolację testów konieczne jest stworzenie obiektów imitacji (mock) dla Encoder i UserDataBase. W tym celu wykorzystaj EasyMock. Zadanie 3. Napisz testy jednostkowe dla klasy Bouncer. Ponieważ ta klasa jest wykonywana na serwerze, aby można ją było przetestowad lokalnie potrzebne jest stworzenie/użycie odpowiednich namiastek: stwórz klasę MyLoginServiceFactory zwracającą przez odpowiednie metody namiastki UserDataBase i Encoder, stwórz namiastkę ServletConfig, która dla wywołania getInitParameter(„LoginServiceFactory”) zwróci „MyLoginServiceFactory”, aby możliwe było wywołanie metody doPost potrzebne są jeszcze namiastki HttpServletRequest dostarczającej parametry zapytania oraz HttpServletResponse dostarczającej namiastkę PrintWriter’a. W dwiczeniu tym można użyd gotowych obiektów imitacji z pakietu MockObjects dostępnego pod adresem http://sourceforge.net/projects/mockobjects