Testy jednostkowe to testy pojedynczych, najmniejszych metod w programie. Testowanie polega na porównaniu wyników jakie zwróci metoda (nie chodzi tylko o return, ale o wszystko na co ma wpływ, czyli np. czy dobrze zapisze wartość do bazy, czy usunie obiekt z listy) z wynikami oczekiwanymi zawartymi w teście. Przed rozpoczęciem testu można przygotować jego środowisko, czyli warunki w jakich metoda ma pracować (stworzeni obiektów, połączeń z bazą z których może korzystać).
Klasy testowe JUnit to zwykłe klasy, w których za pomocą specjalnych adnotacji określa się testy.
Podstawowe adnotacje:
- @BeforeClass – metoda wykonywana raz przed wszystkimi testami,
- @Before – metoda wykonywana przed każdym testem,
- @Test – oznaczenie testu,
- @After – metoda wykonywana po każdym teście,
- @AfterClass –metoda wykonywana raz po wszystkich testach,
- @Ignore – wyłączenie testu,
Podstawowe metody używane w testach:
- fail(wiadomość); – informuje, że metoda jest niepoprawna, zwraca komunikat „wiadomość”
- assertTrue(warunek); - test poprawny gdy warunek = true,
- assertTrue(wiadomość, warunek); - jeżeli warunek = true test jest poprawny, inaczej zwróci błąd i komunikat „ wiadomość”
- assertEquals(wiadomość, spodziewane, aktualne); - porównuje wartość spodziewaną z wartością aktualną, porównuje kolejne wartości w listach, przy będzie wyświetli dodatkowo wiadomość,
- assertEquals(wiadomość, spodziewane, aktualne, tolerancja); - porównuje wartości float i double i jeżeli róznica miedzy nimi nie jest większa niż tolerancja test jest pozytywny,
- assertNull(wartość); – jeżeli wartość = null test jest pozytywny,
- assertNotNull(„wiadomość”,wartość); – jeżeli wartość != null test jest pozytywny, jeżeli wartość = null wyświetli wiadomość,
- assertSame(wiadomość, oczekiwana, aktualna); – sprawdza czy obiekt oczekiwany i aktualny jest takiego samego typu (czyli np. String int), jeżeli nie wyświetli wiadomość
- assertNotSame(wiadomość, oczekiwana, aktualna); – sprawdza czy obiekt oczekiwany i aktualny jest różnego typu (czyli np. String int), jeżeli nie wyświetli wiadomość
Cechy testów:
- Automatyzacja – uruchamianie testów musi być łatwe,
- Kompletność – należy testować wszystko co może zawieść,
- Powtarzalność – wielokrotne wykonanie testu daje te same wyniki,
- Niezależność – od środowiska i innych testów,
Nazewnictwo:
- KlasaPierwszaTest - Klasa w której testujemy klasę o nazwie „KlasaPierwsza”,
- testMetodaPierwsza – metoda, która testuje metodę o nazwie „metodapierwsza”
Przykład:
Dla interfejsu:
public interface UserService {class IllegalUsernameException extends RuntimeException {}void addUser(User user) throws IllegalUsernameException;User getUser(String username) throws IllegalUsernameException;}
Klasa wygenerowana automatycznie w Eclipse (ppm na nazwę klasy w menagerze -> New -> JUnit Test Case):
import static org.junit.Assert.*;import org.junit.After;import org.junit.AfterClass;import org.junit.Before;import org.junit.BeforeClass;import org.junit.Test;public class UserServiceTest {@BeforeClasspublic static void setUpBeforeClass() throws Exception {}@AfterClasspublic static void tearDownAfterClass() throws Exception {}@Beforepublic void setUp() throws Exception {}@Afterpublic void tearDown() throws Exception {}@Testpublic void testAddUser() {fail("Not yet implemented");}@Testpublic void testGetUser() {fail("Not yet implemented");}}
Klasa testowa:
import static org.junit.Assert.assertEquals;import static org.junit.Assert.assertNotNull;import static org.junit.Assert.assertTrue;import java.util.ArrayList;import org.junit.Before;import org.junit.Test;public class UserServiceTest {@Beforepublic void setUp() throws Exception {ArrayList<User> listUsers = Main.getListUsers();listUsers = new ArrayList<User>();Main.setListUsers(listUsers);}@Testpublic void testAddUser() {UserServiceImpl impl = new UserServiceImpl();User u1 = new User();impl.addUser(u1);ArrayList<User> listUsers = Main.getListUsers();assertNotNull( listUsers.get(0));}@Testpublic void testGetUser() {UserServiceImpl impl = new UserServiceImpl();User u1 = new User();String imie = "kkk";u1.setName(imie);impl.addUser(u1);User u2 = impl.getUser(imie);ArrayList<User> listUsers = Main.getListUsers();assertTrue( listUsers.get(0)==u2);}}
Brak komentarzy:
Prześlij komentarz