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

Podobne dokumenty