Wie der Titel schon sagt, suche ich nach einer einfachen Möglichkeit, JUnit 4.x-Tests mehrmals hintereinander automatisch mit Eclipse auszuführen.
Ein Beispiel wäre, denselben Test zehnmal hintereinander auszuführen und das Ergebnis zurückzumelden.
Wir haben bereits eine komplexe Methode, aber ich suche nach einer einfachen Methode, damit ich sicher sein kann, dass der schuppige Test, den ich zu beheben versucht habe, behoben bleibt.
Eine ideale Lösung wäre ein Eclipse-Plugin / -Einstellung / -Funktion, das mir nicht bekannt ist.
Antworten:
Der einfachste Weg (da nur die geringste Menge an neuem Code erforderlich ist) besteht darin, den Test als parametrisierten Test auszuführen (mit einem zu kommentieren
@RunWith(Parameterized.class)
und eine Methode hinzuzufügen, um 10 leere Parameter bereitzustellen). Auf diese Weise führt das Framework den Test zehnmal aus.Dieser Test muss der einzige Test in der Klasse sein, oder besser gesagt, alle Testmethoden müssen zehnmal in der Klasse ausgeführt werden.
Hier ist ein Beispiel:
Mit dem oben Gesagten ist es sogar möglich, dies mit einem parameterlosen Konstruktor zu tun, aber ich bin mir nicht sicher, ob die Framework-Autoren dies beabsichtigt haben oder ob dies in Zukunft nicht mehr funktioniert.
Wenn Sie Ihren eigenen Läufer implementieren, kann der Läufer den Test zehnmal ausführen. Wenn Sie einen Runner eines Drittanbieters verwenden, können Sie mit 4.7 die neue
@Rule
Annotation verwenden und dieMethodRule
Schnittstelle so implementieren , dass sie die Anweisung aufnimmt und sie zehnmal in einer for-Schleife ausführt. Der aktuelle Nachteil dieses Ansatzes ist , dass@Before
und@After
erhält nur einmal ausgeführt. Dies wird sich wahrscheinlich in der nächsten Version von JUnit ändern (die@Before
wird nach der ausgeführt@Rule
), aber unabhängig davon, ob Sie auf dieselbe Instanz des Objekts reagieren (etwas, das für denParameterized
Läufer nicht zutrifft ). Dies setzt voraus, dass jeder Läufer, mit dem Sie die Klasse ausführen, die@Rule
Anmerkungen korrekt erkennt . Dies ist nur dann der Fall, wenn es an die JUnit-Läufer delegiert.Wenn Sie mit einem benutzerdefinierten Runner arbeiten, der die
@Rule
Anmerkung nicht erkennt , müssen Sie wirklich Ihren eigenen Runner schreiben, der entsprechend an diesen Runner delegiert und ihn zehnmal ausführt.Beachten Sie, dass es andere Möglichkeiten gibt, dies möglicherweise zu lösen (z. B. den Theories-Läufer), für die jedoch alle ein Läufer erforderlich ist. Leider unterstützt JUnit derzeit keine Schichten von Läufern. Das ist ein Läufer, der andere Läufer kettet.
quelle
Mit IntelliJ können Sie dies über die Testkonfiguration tun. Sobald Sie dieses Fenster geöffnet haben, können Sie den Test beliebig oft ausführen.
Wenn Sie den Test ausführen, führt Intellij alle von Ihnen ausgewählten Tests so oft aus, wie Sie es angegeben haben.
Beispiel für 10-maliges Ausführen von 624 Tests:
quelle
Ich habe festgestellt, dass die wiederholte Anmerkung von Spring für solche Dinge nützlich ist:
Neuestes Dokument (Spring Framework 4.3.11.RELEASE API):
quelle
Inspiriert von folgenden Ressourcen:
Beispiel
Erstellen und verwenden Sie eine
@Repeat
Anmerkung wie folgt:Repeat.java
RepeatRule.java
PowerMock
Die Verwendung dieser Lösung mit
@RunWith(PowerMockRunner.class)
erfordert ein Update auf Powermock 1.6.5 (das einen Patch enthält ).quelle
Mit JUnit 5 konnte ich dies mithilfe der Annotation @RepeatedTest lösen :
Beachten Sie, dass
@Test
Anmerkungen nicht zusammen mit verwendet werden sollten@RepeatedTest
.quelle
Irgendwas falsch mit:
Im Gegensatz zu dem Fall, in dem Sie jedes einzelne Array von Werten testen, ist es Ihnen egal, welcher Lauf fehlgeschlagen ist.
Sie müssen in der Konfiguration oder in den Anmerkungen nicht tun, was Sie im Code tun können.
quelle
@Before
kommentierten Methode, bevoritWorks()
mein Problem gelöst wurde.Das funktioniert für mich viel einfacher.
quelle
public class RepeatRunner extends BlockJUnit4ClassRunner { public RepeatRunner(Class klass) throws InitializationError { super(klass); } @Override public void run(final RunNotifier notifier) { for (int i = 0; i < 10; i++) { super.run(notifier); } } }
Obwohl zumindest im Eclipse JUnit-Plugin folgende Ergebnisse angezeigt werden : "10/1 Tests bestanden"Es gibt eine intermittierende Anmerkung in der Tempus-Fugit- Bibliothek, die mit JUnit 4.7 zusammenarbeitet
@Rule
, um einen Test mehrmals oder mit zu wiederholen@RunWith
.Beispielsweise,
Nach dem Ausführen des Tests (mit dem IntermittentTestRunner im
@RunWith
)testCounter
wäre gleich 99.quelle
Ich baue ein Modul, das diese Art von Tests ermöglicht. Es wird aber nicht nur wiederholt fokussiert. Aber in der Garantie, dass ein Teil des Codes Thread-sicher ist.
https://github.com/anderson-marques/concurrent-testing
Maven-Abhängigkeit:
Anwendungsbeispiel:
Dies ist ein Open Source-Projekt. Fühlen Sie sich frei zu verbessern.
quelle
Sie können Ihren JUnit-Test mit einer Hauptmethode ausführen und ihn so oft wiederholen, bis Sie Folgendes benötigen:
quelle
Dies ist im Wesentlichen die Antwort, die Yishai oben in Kotlin neu geschrieben hat:
quelle