piątek, 28 marca 2008

TestNG - dostawca danych

Jak wspomniałem w artykule TestNG - pierwsze kroki. Framework TestNG umożliwia definiowanie parametrów w pliku konfiguracyjnym, które później można wykorzystać jako argumenty metod testujących.
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ładu
Dokumentacja TestNG - 5.5.2 - From DataProviders

Brak komentarzy: