Ta funkcja została wprowadzona do JUnit 4.11 .
Aby użyć zmień nazwę sparametryzowanych testów, powiedz:
@Parameters(name="namestring")
namestring
jest ciągiem, który może mieć następujące specjalne symbole zastępcze:
{index}
- indeks tego zestawu argumentów. Domyślnie namestring
jest to {index}
.
{0}
- pierwsza wartość parametru z tego wywołania testu.
{1}
- druga wartość parametru
- i tak dalej
Ostateczna nazwa testu to nazwa metody testowej, po której następuje namestring
w nawiasach, jak pokazano poniżej.
Na przykład (na podstawie testu jednostkowego Parameterized
adnotacji):
@RunWith(Parameterized.class)
static public class FibonacciTest {
@Parameters( name = "{index}: fib({0})={1}" )
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
}
private final int fInput;
private final int fExpected;
public FibonacciTest(int input, int expected) {
fInput= input;
fExpected= expected;
}
@Test
public void testFib() {
assertEquals(fExpected, fib(fInput));
}
private int fib(int x) {
// TODO: actually calculate Fibonacci numbers
return 0;
}
}
nada imiona takie jak testFib[1: fib(1)=1]
i testFib[4: fib(4)=3]
. ( testFib
Część nazwy to nazwa metody @Test
).
{0}
i{1}
są tablice? JUnit powinien idealnie zadzwonićArrays.toString({0})
, a nie{0}.toString()
. Na przykład mojadata()
metoda zwracaArrays.asList(new Object[][] {{ new int[] { 1, 3, 2 }, new int[] { 1, 2, 3 } }});
.Patrząc na JUnit 4.5, jego biegacz wyraźnie tego nie obsługuje, ponieważ logika ta jest zakopana w prywatnej klasie w klasie Sparametryzowanej. Nie można użyć narzędzia do parametryzacji JUnit i zamiast tego utworzyć własny, który zrozumiałby pojęcie nazw (co prowadzi do pytania, w jaki sposób można ustawić nazwę ...).
Z perspektywy JUnit byłoby miło, gdyby zamiast (lub oprócz) po prostu przekazać przyrost, przekazali argumenty rozdzielane przecinkami. TestNG to robi. Jeśli ta funkcja jest dla Ciebie ważna, możesz komentować listę dyskusyjną Yahoo, do której odwołuje się strona www.junit.org.
źródło
Ostatnio natknąłem się na ten sam problem podczas korzystania z JUnit 4.3.1. Zaimplementowałem nową klasę, która rozszerza Parameterized o nazwie LabelledParameterized. Został przetestowany przy użyciu JUnit 4.3.1, 4.4 i 4.5. Odtwarza instancję Description za pomocą reprezentacji ciągu pierwszego argumentu każdej tablicy parametrów z metody @Parameters. Możesz zobaczyć kod tego na:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../LabelledParameterized.java?r=3789
i przykład jego zastosowania w:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../ServerBuilderTest.java?r=3789
Opis testu ładnie formatuje się w Eclipse, co jest tym, czego chciałem, ponieważ dzięki temu nieudane testy są znacznie łatwiejsze do znalezienia! Prawdopodobnie będę dalej doskonalić i dokumentować zajęcia w ciągu najbliższych kilku dni / tygodni. Upuść '?' część adresów URL, jeśli chcesz mieć przewagę. :-)
Aby go użyć, wystarczy skopiować tę klasę (GPL v3) i zmienić @RunWith (Parameterized.class) na @RunWith (LabelledParameterized.class), zakładając, że pierwszy element listy parametrów jest sensowną etykietą.
Nie wiem, czy jakiekolwiek późniejsze wydania JUnit rozwiązują ten problem, ale nawet jeśli tak, nie mogę zaktualizować JUnit, ponieważ wszyscy moi programiści również musieliby zaktualizować i mamy wyższe priorytety niż ponowne oprzyrządowanie. Stąd praca w klasie, która ma być kompilowana przez wiele wersji JUnit.
Uwaga: istnieje pewien jiggery-pokery refleksji, dzięki czemu działa on w różnych wersjach JUnit wymienionych powyżej. Wersję specjalnie dla JUnit 4.3.1 można znaleźć tutaj, a dla JUnit 4.4 i 4.5 tutaj .
źródło
execute[0], execute[1] ... execute[n]
w wygenerowanych raportach z testów.Dzięki
Parameterized
za wzór, napisałem mój własny niestandardowy testy biegacz / apartament - tylko trwało około pół godziny. Różni się nieco od darrenpaLabelledParameterized
tym, że pozwala jawnie określać nazwę zamiast polegać na pierwszym parametrzetoString()
.Nie używa również tablic, ponieważ nienawidzę tablic. :)
I przykład:
źródło
z junit4.8.2 możesz stworzyć własną klasę MyParameterized, po prostu kopiując Parameterized class. zmień metody getName () i testName () w TestClassRunnerForParameters.
źródło
Możesz również wypróbować JUnitParams: http://code.google.com/p/junitparams/
źródło
Możesz stworzyć metodę podobną do
Chociaż nie używałbym go cały czas, dobrze byłoby dowiedzieć się, który test nr 143 jest.
źródło
W szerokim zakresie korzystam z importu statycznego dla Assert i przyjaciół, więc łatwo jest mi na nowo zdefiniować asercję:
Na przykład możesz dodać pole „name” do swojej klasy testowej, zainicjowane w konstruktorze i wyświetlić je w przypadku niepowodzenia testu. Wystarczy przekazać go jako pierwsze elementy tablicy parametrów dla każdego testu. Pomaga to również oznaczyć dane:
źródło
Nic z tego nie działało, więc dostałem źródło dla Sparametryzowanego i zmodyfikowałem go, tworząc nowy tester. Nie musiałem wiele zmieniać, ale TO DZIAŁA !!!
źródło
Rozwiązaniem byłoby złapanie i zagnieżdżenie wszystkich Throwables w nowym Throwable z niestandardowym komunikatem, który zawiera wszystkie informacje o parametrach. Komunikat pojawi się w śladzie stosu. Działa to zawsze, gdy test kończy się niepowodzeniem dla wszystkich stwierdzeń, błędów i wyjątków, ponieważ wszystkie są podklasami Throwable.
Mój kod wygląda następująco:
Ślad stosu nieudanego testu to:
źródło
Sprawdź JUnitParams, jak wspomniano dsaff, działa przy użyciu ant, aby zbudować sparametryzowane opisy metod testowych w raporcie HTML.
Było to po wypróbowaniu LabelledParameterized i stwierdzeniu, że chociaż działa z zaćmieniem, nie działa z mrówką, jeśli chodzi o raport HTML.
Twoje zdrowie,
źródło
Ponieważ parametr, do którego uzyskano dostęp (np. Z
"{0}"
zawsze zwracatoString()
reprezentację, jednym z obejść byłoby wykonanie anonimowej implementacji i zastąpienietoString()
w każdym przypadku. Na przykład:źródło