Jednak w TestNG dostępny jest także znacznie potężniejszy mechanizm parametryzacji testów danymi. Jest nim tzw. dostawca danych - data provider.
Dostawcę danych definiuje się jako metodę oznaczaną adnotacją
DataProvider
. Metoda ta powinna zwracać dwuwymiarową tablicę obiektów (Object[][]
) lub iterator po jednowymiarowych tablicach objektów (Iterator<Object[]>
). Przy czym kolejne tablice obiektów zwracane przez iterator (lub te w dwuwymiarowej tablicy) zawierają argumenty do kolejnego wywołania (tyle razy ile jest tych tablic) danej metody testującej.Metoda dostawcy danych może być bezargumentowa lub posiadać jeden argument o typie
java.lang.reflect.Method
, który określa metodę testującą, dla której będą dostarczane dane.W celu przypisania dostawcy danych do metody testującej, trzeba odpowiednio ustawić parametr
dataProvider
dla adnotacji Test
, którą jest oznaczona dana metoda testująca. Opcjonalnie, jeśli metoda testująca jest w innej klasie niż metoda dostarczająca dane, należy ustawić jeszcze parametr dataProviderClass
adnotacji Test
. Poza tym typy argumentów metody testującej muszą być zgodne z typami obiektów w tablicach zwracanych przez dostawcę danych.Niestety nie można łącznie wykorzystywać dostawcy danych i parametrów definiowanych w pliku konfiguracyjnym. Nie można również przekazywać tych parametrów do metod dostarczających dane.
Poniżej zamieszam przykładowe użycie dostawcy danych TestNG:
package pl.dwalczak.jpapg2; import org.apache.log4j.Logger; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import pl.dwalczak.jpapg2.model.Address; import pl.dwalczak.jpapg2.model.User; @Test public class UserTest extends JpaTestCase{ private static final Logger LOG = Logger.getLogger(UserTest.class); @DataProvider(name="address") public Object[][] createTestData() { LOG.debug("createTestData"); return new Object[][] { {"Heniek", new Address("Poznan", "11-111", "Jadwigi", "12c/23")}, {"Maniek", new Address("Wroclaw", "22-222", "Kosciuszki", "14b")}}; } @Test(dataProvider="address") public void createUser(String user, Address address) { LOG.debug("create user: " + user); em.persist(new User(user, address, address)); } @Test(dependsOnMethods={"createUser"}, dataProvider="address") public void findUser(String user, Address address) { LOG.debug("find user: " + user); User u = (User) em.createNamedQuery("user.findByNickName").setParameter("nickName", user).getSingleResult(); LOG.debug("found user: " + u); Assert.assertNotNull(u); Assert.assertEquals(address, u.getAddress()); } }
Zasoby
Pliki źródłowe przykładuDokumentacja TestNG - 5.5.2 - From DataProviders
Brak komentarzy:
Prześlij komentarz