sobota, 15 października 2011

Testowanie programu – JUnit

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 {
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
    }
    @AfterClass
    public static void tearDownAfterClass() throws Exception {
    }
    @Before
    public void setUp() throws Exception {
    }
    @After
    public void tearDown() throws Exception {
    }
    @Test
    public void testAddUser() {
                        fail("Not yet implemented");
    }
    @Test
    public 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 {
    @Before
    public void setUp() throws Exception {
                        ArrayList<User> listUsers = Main.getListUsers();
                        listUsers = new ArrayList<User>();
                        Main.setListUsers(listUsers);
    }
    @Test
    public void testAddUser() {  
                        UserServiceImpl impl = new UserServiceImpl();
                        User u1 = new User();
                        impl.addUser(u1);
                        ArrayList<User> listUsers = Main.getListUsers();
                        assertNotNull( listUsers.get(0));
    }
    @Test
    public 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