Gibt es eine Möglichkeit, meine eigenen benutzerdefinierten Testfallnamen festzulegen, wenn parametrisierte Tests in JUnit4 verwendet werden?
Ich möchte die Standardeinstellung - [Test class].runTest[n]
- in etwas Sinnvolles ändern .
quelle
Gibt es eine Möglichkeit, meine eigenen benutzerdefinierten Testfallnamen festzulegen, wenn parametrisierte Tests in JUnit4 verwendet werden?
Ich möchte die Standardeinstellung - [Test class].runTest[n]
- in etwas Sinnvolles ändern .
Diese Funktion hat es in JUnit 4.11 geschafft .
Um den Namen parametrisierter Tests zu ändern, sagen Sie:
@Parameters(name="namestring")
namestring
ist eine Zeichenfolge, die die folgenden speziellen Platzhalter haben kann:
{index}
- der Index dieser Argumente. Der Standardwert namestring
ist {index}
.{0}
- der erste Parameterwert aus diesem Aufruf des Tests.{1}
- der zweite ParameterwertDer endgültige Name des Tests ist der Name der Testmethode, gefolgt von den namestring
in Klammern gesetzten Klammern (siehe unten).
Zum Beispiel (angepasst aus dem Unit-Test für die Parameterized
Annotation):
@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;
}
}
wird Namen wie testFib[1: fib(1)=1]
und geben testFib[4: fib(4)=3]
. (Der testFib
Teil des Namens ist der Methodenname von @Test
).
{0}
und{1}
sind Arrays? JUnit sollte im Idealfall nenntArrays.toString({0})
, nicht{0}.toString()
. Zum Beispiel gibt meinedata()
Methode zurückArrays.asList(new Object[][] {{ new int[] { 1, 3, 2 }, new int[] { 1, 2, 3 } }});
.Bei JUnit 4.5 unterstützt der Runner dies eindeutig nicht, da diese Logik in einer privaten Klasse innerhalb der parametrisierten Klasse vergraben ist. Sie könnten den JUnit-parametrisierten Runner nicht verwenden und stattdessen einen eigenen erstellen, der das Konzept der Namen versteht (was zu der Frage führt, wie Sie einen Namen festlegen könnten ...).
Aus Sicht von JUnit wäre es schön, wenn anstelle (oder zusätzlich zu) der Übergabe eines Inkrements die durch Kommas getrennten Argumente übergeben würden. TestNG macht das. Wenn die Funktion für Sie wichtig ist, können Sie die Yahoo-Mailingliste kommentieren, auf die unter www.junit.org verwiesen wird.
quelle
Ich bin kürzlich auf dasselbe Problem gestoßen, als ich JUnit 4.3.1 verwendet habe. Ich habe eine neue Klasse implementiert, die Parameterized mit dem Namen LabelledParameterized erweitert. Es wurde mit JUnit 4.3.1, 4.4 und 4.5 getestet. Es rekonstruiert die Description-Instanz mithilfe der String-Darstellung des ersten Arguments jedes Parameterarrays aus der @ Parameters-Methode. Sie können den Code dafür sehen unter:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../LabelledParameterized.java?r=3789
und ein Beispiel für seine Verwendung bei:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../ServerBuilderTest.java?r=3789
Die Testbeschreibung ist in Eclipse gut formatiert, was ich wollte, da dies das Auffinden fehlgeschlagener Tests erheblich erleichtert! Ich werde die Kurse wahrscheinlich in den nächsten Tagen / Wochen weiter verfeinern und dokumentieren. Lass fallen '?' Teil der URLs, wenn Sie die Blutungskante wollen. :-)
Um es zu verwenden, müssen Sie nur diese Klasse (GPL v3) kopieren und @RunWith (Parameterized.class) in @RunWith (LabelledParameterized.class) ändern, vorausgesetzt, das erste Element Ihrer Parameterliste ist eine sinnvolle Bezeichnung.
Ich weiß nicht, ob spätere Versionen von JUnit dieses Problem beheben, aber selbst wenn dies der Fall ist, kann ich JUnit nicht aktualisieren, da alle meine Mitentwickler ebenfalls aktualisieren müssten und wir höhere Prioritäten als das Nachrüsten haben. Daher muss die Arbeit in der Klasse von mehreren Versionen von JUnit kompiliert werden.
Hinweis: Es gibt einige Reflection Jiggery-Pokery, so dass es über die verschiedenen JUnit-Versionen läuft, wie oben aufgeführt. Die Version speziell für JUnit 4.3.1 finden Sie hier und für JUnit 4.4 und 4.5 hier .
quelle
execute[0], execute[1] ... execute[n]
in den generierten Testberichten benannt .Mit
Parameterized
als Modell habe ich meinen eigenen Testläufer / meine eigene Test-Suite geschrieben - es dauerte nur etwa eine halbe Stunde. Es unterscheidet sich geringfügig von DarrenpLabelledParameterized
darin, dass Sie einen Namen explizit angeben können, anstatt sich auf die ersten Parameter zu verlassentoString()
.Es werden auch keine Arrays verwendet, weil ich Arrays hasse. :) :)
Und ein Beispiel:
quelle
Ab junit4.8.2 können Sie Ihre eigene MyParameterized-Klasse erstellen, indem Sie einfach die parametrisierte Klasse kopieren. Ändern Sie die Methoden getName () und testName () in TestClassRunnerForParameters.
quelle
Möglicherweise möchten Sie auch JUnitParams ausprobieren: http://code.google.com/p/junitparams/
quelle
Sie können eine Methode wie erstellen
Obwohl ich es nicht die ganze Zeit benutzen würde, wäre es nützlich, genau herauszufinden, welche Testnummer 143 ist.
quelle
Ich verwende den statischen Import für Assert und Freunde in großem Umfang, sodass ich Assertion leicht neu definieren kann:
Sie können beispielsweise Ihrer Testklasse ein Feld "Name" hinzufügen, das im Konstruktor initialisiert wurde, und dieses Feld bei einem Testfehler anzeigen. Übergeben Sie es einfach als erstes Element Ihres Parameterarrays für jeden Test. Dies hilft auch beim Beschriften der Daten:
quelle
Nichts davon funktionierte für mich, also habe ich die Quelle für Parametrisiert und modifiziert, um einen neuen Testläufer zu erstellen. Ich musste nicht viel ändern, aber es funktioniert !!!
quelle
Eine Problemumgehung besteht darin, alle Throwables mit einer benutzerdefinierten Nachricht zu fangen und in eine neue Throwable zu verschachteln, die alle Informationen zu den Parametern enthält. Die Nachricht wird im Stack-Trace angezeigt. Dies funktioniert immer dann, wenn ein Test für alle Zusicherungen, Fehler und Ausnahmen fehlschlägt, da sie alle Unterklassen von Throwable sind.
Mein Code sieht folgendermaßen aus:
Die Stapelverfolgung des fehlgeschlagenen Tests lautet:
quelle
Schauen Sie sich JUnitParams an, wie von dsaff erwähnt, und arbeiten Sie mit ant, um parametrisierte Testmethodenbeschreibungen im HTML-Bericht zu erstellen.
Dies geschah, nachdem LabelledParameterized ausprobiert wurde und festgestellt wurde, dass es, obwohl es mit Eclipse funktioniert, mit Ant nicht funktioniert, was den HTML-Bericht betrifft.
Prost,
quelle
Da auf den Parameter zugegriffen wird (z. B. mit
"{0}"
immer dietoString()
Darstellung zurückgibt , besteht eine Problemumgehung darin, eine anonyme Implementierung vorzunehmen und jeweils zu überschreibentoString()
. Beispiel:quelle