Moim zdaniem w takim przypadku warto oddzielnie zarządzać danymi i algorytmami testowymi i umiejscowić je w różnych plikach. Wówczas istnieje możliwość, aby dane testowe przygotowywała inna osoba niż autor algorytmów testowych, nie trzeba ponownie kompilować testów gdy się zmieniły dane, no i łatwiej można uniknąć problemów z kodowaniem danych wejściowych.
DataProvider w TestNG nie wspiera bezpośrednio zaczytywania danych testowych z plików XML. Ale jak się okazało, robienie tego samemu nie jest trudne i co najważniejsze nie wymaga znaczących nakładów kodowania. Wystarczy zastosować dostarczaną przez specyfikacje J2SE serializację XML JavaBean'ów.
Schema serializacji jest relatywnie zrozumiała dla ludzi, a co najważniejsze jest bardzo elastyczna. Schema ta dopuszcza zapisywanie dowolnej liczby dowolnych obiektów. Ponadto można łatwo wygenerować przykładowy plik wejściowy do testów, poprzez zserializowanie spreparowanych w kodzie przykładowych danych.
Poniżej zamieszczam przykładową zawartość pliku XML z danymi testowymi:
<?xml version="1.0" encoding="UTF-8" ?> <java version="1.5.0" class="java.beans.XMLDecoder"> <array> <string>test1</string> <object class="pl.dwalczak.testngdp1.User"> <void property="nickName"> <string>heniek</string> </void> <void property="address"> <object class="pl.dwalczak.testngdp1.Address" id="addr1"> <void property="city"> <string>PoznaĹ„</string> </void> <void property="postcode"> <string>11-111</string> </void> <void property="street"> <string>Jadwigi</string> </void> <void property="number"> <string>11a/3</string> </void> </object> </void> <void property="mailingAddress"> <object idref="addr1" /> </void> </object> </array> <array> <string>test2</string> <object class="pl.dwalczak.testngdp1.User"> <void property="nickName"> <string>maniek</string> </void> <void property="address"> <object idref="addr1" /> </void> <void property="mailingAddress"> <object idref="addr1" /> </void> </object> </array> </java>Natomiast implementacja TestNG'owego data providera, korzystającego z tego pliku XML, może wyglądać następująco:
package pl.dwalczak.testngdp1; import java.beans.XMLDecoder; import java.io.FileInputStream; import java.util.ArrayList; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @Test public class SimpleTest { @DataProvider(name="dp") public Object[][] createData() { ArrayList<Object[]> result = new ArrayList<Object[]>(); XMLDecoder dec = null; try { dec = new XMLDecoder(new FileInputStream("testData.xml")); while (true) { Object o = dec.readObject(); result.add((Object[]) o); } } catch (ArrayIndexOutOfBoundsException e) { // no more objects in stream } catch (Exception e) { throw new RuntimeException(e); } finally { if (dec != null) { dec.close(); } } return result.toArray(new Object[result.size()][]); } @Test(dataProvider="dp") public void test(String arg0, User user) { System.out.println("arg0: " + arg0); System.out.println("user: " + user); } }
Zasoby
Pliki źródłowe przykładuLong Term Persistence of JavaBeans Components: XML Schema
Dokumentacja TestNG - 5.5.2 - From DataProviders
Brak komentarzy:
Prześlij komentarz