In JUnit 3 konnte ich den Namen des aktuell laufenden Tests wie folgt abrufen:
public class MyTest extends TestCase
{
public void testSomething()
{
System.out.println("Current test is " + getName());
...
}
}
das würde "Aktueller Test ist testSomething" drucken.
Gibt es in JUnit 4 eine sofort einsatzbereite oder einfache Möglichkeit, dies zu tun?
Hintergrund: Natürlich möchte ich nicht nur den Namen des Tests ausdrucken. Ich möchte testspezifische Daten laden, die in einer Ressource mit demselben Namen wie der Test gespeichert sind. Sie wissen, Konvention über Konfiguration und all das.
java
unit-testing
junit
Dave Ray
quelle
quelle
Antworten:
JUnit 4.7 hat diese Funktion hinzugefügt, anscheinend mit TestName-Rule . Sieht so aus, als würden Sie den Methodennamen erhalten:
quelle
@Rule
bevor@Before
- ich JUnit bin neu und wurde je nachTestName
meinem@Before
ohne Schwierigkeiten.JUnit 4.9.x und höher
Seit JUnit 4.9 ist die
TestWatchman
Klasse zugunsten derTestWatcher
Klasse mit dem Aufruf veraltet :Hinweis: Die enthaltende Klasse muss deklariert werden
public
.JUnit 4.7.x - 4.8.x.
Der folgende Ansatz druckt Methodennamen für alle Tests in einer Klasse:
quelle
public
Feld verwenden?Einheit 5 und höher
In JUnit 5 können Sie injizieren,
TestInfo
was die Bereitstellung von Test-Metadaten für Testmethoden vereinfacht. Beispielsweise:Weitere Informationen : JUnit 5 Benutzerhandbuch , TestInfo javadoc .
quelle
Versuchen Sie stattdessen Folgendes:
Die Ausgabe sieht folgendermaßen aus:
HINWEIS: Dies funktioniert NICHT , wenn Ihr Test eine Unterklasse von TestCase ist ! Der Test wird ausgeführt, aber der @ Regel- Code wird nie ausgeführt.
quelle
Die Verwendung von SLF4J (Simple Logging Facade für Java) bietet einige nette Verbesserungen bei der Verwendung parametrisierter Nachrichten. Durch die Kombination von SLF4J mit JUnit 4-Regelimplementierungen können effizientere Protokollierungstechniken für Testklassen bereitgestellt werden.
quelle
Ein komplizierter Weg besteht darin, einen eigenen Runner zu erstellen, indem Sie org.junit.runners.BlockJUnit4ClassRunner in eine Unterklasse unterteilen.
Sie können dann so etwas tun:
Anschließend müssen Sie für jede Testklasse eine Annotation @RunWith (NameAwareRunner.class) hinzufügen. Alternativ können Sie diese Anmerkung in eine Test-Superklasse einfügen, wenn Sie sich nicht jedes Mal daran erinnern möchten. Dies schränkt natürlich Ihre Auswahl an Läufern ein, aber das kann akzeptabel sein.
Es kann auch ein wenig Kung Fu dauern, bis der aktuelle Testname aus dem Runner in Ihr Framework gelangt, aber dadurch erhalten Sie zumindest den Namen.
quelle
JUnit 4 verfügt nicht über einen sofort einsatzbereiten Mechanismus für einen Testfall, um seinen eigenen Namen zu erhalten (auch während des Auf- und Abbaus).
quelle
quelle
Basierend auf dem vorherigen Kommentar und weiteren Überlegungen habe ich eine Erweiterung von TestWather erstellt, die Sie in Ihren JUnit-Testmethoden verwenden können:
Die Testhelferklasse ist die nächste:
Genießen!
quelle
ImportUtilsTest
, ich bekomme eine Fehlermeldung, es scheint eine Logger-Klasse zu sein, habe ich weitere Informationen? Dankequelle
Ich würde vorschlagen, dass Sie den Namen der Testmethode von Ihrem Testdatensatz entkoppeln. Ich würde eine DataLoaderFactory-Klasse modellieren, die die Testdatensätze aus Ihren Ressourcen lädt / zwischenspeichert, und dann in Ihrem Testfall eine Schnittstellenmethode aufrufen, die einen Satz von Testdaten für den Testfall zurückgibt. Wenn die Testdaten mit dem Namen der Testmethode verknüpft sind, wird davon ausgegangen, dass die Testdaten nur einmal verwendet werden können. In den meisten Fällen würde ich vorschlagen, dass dieselben Testdaten in mehreren Tests verwendet werden, um verschiedene Aspekte Ihrer Geschäftslogik zu überprüfen.
quelle
Sie können dies mit
Slf4j
und erreichenTestWatcher
quelle
In JUnit 5
TestInfo
fungiert es als Drop-In-Ersatz für die TestName-Regel von JUnit 4.Aus der Dokumentation:
Um den Methodennamen des aktuell ausgeführten Tests abzurufen, haben Sie zwei Möglichkeiten:
String TestInfo.getDisplayName()
undMethod TestInfo.getTestMethod()
.Es
TestInfo.getDisplayName()
reicht möglicherweise nicht aus, nur den Namen der aktuellen Testmethode abzurufen , da der Standardanzeigename der Testmethode lautetmethodName(TypeArg1, TypeArg2, ... TypeArg3)
.Duplizieren von Methodennamen in
@DisplayName("..")
ist keine gute Idee.Alternativ können Sie
TestInfo.getTestMethod()
einOptional<Method>
Objekt zurückgeben.Wenn die Abrufmethode innerhalb einer Testmethode verwendet wird, müssen Sie den
Optional
umschlossenen Wert nicht einmal testen .quelle
JUnit 5 über ExtensionContext
Vorteil:
Sie erhalten die zusätzlichen Funktionen von
ExtensionContext
durch ÜberschreibenafterEach(ExtensionContext context)
.quelle