Ich möchte Testmethoden ausführen, die @Test
in einer bestimmten Reihenfolge mit Anmerkungen versehen sind .
Zum Beispiel:
public class MyTest {
@Test public void test1(){}
@Test public void test2(){}
}
Ich möchte sicherstellen, dass es test1()
vor test2()
jedem Start ausgeführt MyTest
wird, konnte jedoch keine Anmerkungen wie finden @Test(order=xx)
.
Ich denke , es ist ganz wichtiges Merkmal für JUnit, wenn Autor von JUnit nicht die will , um Funktion , warum?
java
unit-testing
junit
junit4
Gy 声 远 Shengyuan Lu
quelle
quelle
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
, halten Sie die@Test
Anmerkung für alle Prüfverfahren und sie alphabetisch umbenennen auf die gewünschte Reihenfolge der Ausführung abhängig, zum Beispielt1_firstTest()
,t2_secondTest()
usw.Antworten:
Ich bin mir nicht sicher, ob es einen sauberen Weg gibt, dies mit JUnit zu tun. Meines Wissens geht JUnit davon aus, dass alle Tests in einer beliebigen Reihenfolge durchgeführt werden können. Aus den FAQ:
Wieso ist es so? Nun, ich glaube, dass es eine Praxis ist, die Autoren nicht fördern wollen, die Reihenfolge der Tests abhängig zu machen. Tests sollten unabhängig sein, sie sollten nicht gekoppelt sein und Verstöße gegen diese Bestimmungen erschweren die Wartung, beeinträchtigen die Fähigkeit, Tests (offensichtlich) einzeln durchzuführen usw.
Wenn Sie jedoch wirklich in diese Richtung gehen möchten, sollten Sie TestNG in Betracht ziehen, da es das Ausführen von Testmethoden in beliebiger Reihenfolge unterstützt (und Dinge wie die Angabe dieser Methoden hängen von Gruppen von Methoden ab). Cedric Beust erklärt, wie dies in der Reihenfolge der Ausführung von Tests in testng zu tun ist .
quelle
Wenn Sie Ihre vorhandene Junit-Instanz entfernen und JUnit 4.11 oder höher im Erstellungspfad herunterladen , führt der folgende Code die Testmethoden in der Reihenfolge ihrer Namen aus, sortiert in aufsteigender Reihenfolge:
quelle
@Inherited
und daher für meineAbstractTestCase
Elternklasse unwirksam wird .Wenn die Bestellung wichtig ist, sollten Sie die Bestellung selbst aufgeben.
Insbesondere sollten Sie bei Bedarf einige oder alle möglichen zu testenden Auftragspermutationen auflisten.
Zum Beispiel,
Oder ein vollständiger Test aller Permutationen:
Hier
permute()
ist eine einfache Funktion, die alle möglichen Permuationen in eine Sammlung von Arrays iteriert.quelle
test2
läufttest1
wieder . Junit kann nochtest2
vorher laufentest1
. Dies ist wahrscheinlich nicht das, was Sie beabsichtigt haben, und keine gültige Antwort auf die Frage.Die Migration zu TestNG scheint der beste Weg zu sein, aber ich sehe hier keine klare Lösung für jUnit. Hier ist die am besten lesbare Lösung / Formatierung, die ich für jUnit gefunden habe:
Dies stellt sicher, dass Stage2-Methoden nach Stage1-Methoden und vor Stage3-Methoden aufgerufen werden.
quelle
0
Präfix hinzu, zBvoid stage01_prepareAndTest(){ }
Es ist eines der Hauptprobleme, mit denen ich bei der Arbeit an Junit konfrontiert war, und ich habe folgende Lösung gefunden, die für mich gut funktioniert:
Erstellen Sie auch eine Schnittstelle wie unten:
Angenommen, Sie haben Klasse A, in der Sie mehrere Testfälle wie die folgenden geschrieben haben:
Die Ausführung beginnt also mit der Methode "method ()". Vielen Dank!
quelle
@RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(OrderedRunner.class)
Mit JUnit können Testmethoden derzeit die Reihenfolge mithilfe von Klassenanmerkungen ausführen:
Standardmäßig werden Testmethoden in alphabetischer Reihenfolge ausgeführt. Um die Reihenfolge bestimmter Methoden festzulegen, können Sie sie wie folgt benennen:
Beispiele finden Sie hier .
quelle
Die (noch nicht veröffentlichte) Änderung https://github.com/junit-team/junit/pull/386 führt a ein
@SortMethodsWith
. https://github.com/junit-team/junit/pull/293 machte zumindest die Reihenfolge ohne diese vorhersehbar (in Java 7 kann es ziemlich zufällig sein).quelle
@FixMethodOrder
nicht@SortMethodsWith
in 4.11Sehen Sie sich einen JUnit-Bericht an. JUnit ist bereits nach Paketen organisiert. Jedes Paket hat (oder kann) TestSuite-Klassen, von denen jede wiederum mehrere Testfälle ausführt. Jeder TestCase kann mehrere Testmethoden des Formulars haben
public void test*()
, von denen jede tatsächlich eine Instanz der TestCase-Klasse wird, zu der sie gehören. Jede Testmethode (TestCase-Instanz) hat einen Namen und ein Bestanden / Nicht Bestanden-Kriterium.Was mein Management benötigt, ist das Konzept einzelner TestStep- Elemente, von denen jedes seine eigenen Bestanden / Nicht Bestanden- Kriterien angibt . Das Fehlschlagen eines Testschritts darf die Ausführung nachfolgender Testschritte nicht verhindern.
In der Vergangenheit haben Testentwickler in meiner Position TestCase-Klassen in Paketen organisiert, die den Teilen des zu testenden Produkts entsprechen, eine TestCase-Klasse für jeden Test erstellt und jede Testmethode zu einem separaten "Schritt" im Test gemacht. komplett mit eigenen Pass / Fail-Kriterien in der JUnit-Ausgabe. Jeder TestCase ist ein eigenständiger "Test", aber die einzelnen Methoden oder Testschritte innerhalb des TestCase müssen in einer bestimmten Reihenfolge ausgeführt werden.
Die TestCase-Methoden waren die Schritte des TestCase, und Testdesigner erhielten pro Testschritt ein separates Pass / Fail-Kriterium. Jetzt sind die Testschritte durcheinander und die Tests schlagen (natürlich) fehl.
Zum Beispiel:
Jede Testmethode bestätigt und meldet ihre eigenen Pass / Fail-Kriterien. Wenn Sie dies zum Zwecke der Bestellung in "eine große Testmethode" zusammenfassen, wird die Granularität der Pass / Fail-Kriterien für jeden "Schritt" im JUnit-Zusammenfassungsbericht verloren. ... und das ärgert meine Manager. Sie fordern derzeit eine andere Alternative.
Kann jemand erklären, wie eine JUnit mit verschlüsselter Testmethodenreihenfolge separate Pass / Fail-Kriterien für jeden sequentiellen Testschritt unterstützt, wie oben beispielhaft dargestellt und von meinem Management gefordert?
Unabhängig von der Dokumentation sehe ich dies als ernsthafte Regression im JUnit-Framework, die vielen Testentwicklern das Leben schwer macht.
quelle
JUnit 5 Update (und meiner Meinung nach)
Standardmäßig versuchen Unit-Test-Bibliotheken nicht, Tests in der Reihenfolge auszuführen, die in der Quelldatei vorkommt.
JUnit 5 als JUnit 4 funktionieren auf diese Weise. Warum ? Denn wenn die Reihenfolge wichtig ist, bedeutet dies, dass einige Tests zwischen ihnen gekoppelt sind und dies für Komponententests unerwünscht ist .
Die
@Nested
von JUnit 5 eingeführte Funktion folgt daher demselben Standardansatz.Bei Integrationstests kann jedoch die Reihenfolge der Testmethode von Bedeutung sein, da eine Testmethode den Status der Anwendung auf eine Weise ändern kann, die von einer anderen Testmethode erwartet wird. Wenn Sie beispielsweise einen Integrationstest für eine E-Shop-Kaufabwicklung schreiben, registriert die erste auszuführende Testmethode die Registrierung eines Kunden, die zweite das Hinzufügen von Artikeln zum Warenkorb und die letzte die Kaufabwicklung. Wenn der Testläufer diese Reihenfolge nicht einhält, ist das Testszenario fehlerhaft und schlägt fehl.
In JUnit 5 (ab Version 5.4) haben Sie dennoch die Möglichkeit, die Ausführungsreihenfolge festzulegen, indem Sie die Testklasse mit Anmerkungen versehen
@TestMethodOrder(OrderAnnotation.class)
und die Reihenfolge mit@Order(numericOrderValue)
für die Methoden angeben, für die die Reihenfolge von Bedeutung ist.Beispielsweise :
Ausgabe :
Die Angabe
@TestMethodOrder(OrderAnnotation.class)
scheint übrigens nicht erforderlich zu sein (zumindest in der von mir getesteten Version 5.4.0).Randnotiz
Zur Frage: Ist JUnit 5 die beste Wahl, um Integrationstests zu schreiben? Ich denke nicht, dass dies das erste zu berücksichtigende Tool sein sollte (Cucumber und Co bringen häufig spezifischere Werte und Funktionen für Integrationstests mit), aber in einigen Integrationstestfällen reicht das JUnit-Framework aus. Das ist also eine gute Nachricht, dass die Funktion vorhanden ist.
quelle
Ich bin mir nicht sicher, ob ich damit einverstanden bin. Wenn ich "Datei-Upload" und dann "Durch Datei-Upload eingefügte Daten" testen möchte, warum möchte ich dann nicht, dass diese unabhängig voneinander sind? Ich denke, es ist absolut vernünftig, sie separat ausführen zu können, anstatt beide in einem Goliath-Testfall zu haben.
quelle
Was Sie wollen, ist durchaus sinnvoll, wenn Testfälle als Suite ausgeführt werden.
Leider ist momentan keine Zeit, eine vollständige Lösung zu geben, aber schauen Sie sich die Klasse an:
Damit können Sie Testfälle (aus jeder Testklasse) in einer bestimmten Reihenfolge aufrufen.
Diese können verwendet werden, um Funktions-, Integrations- oder Systemtests zu erstellen.
Dadurch bleiben Ihre Komponententests unverändert (wie empfohlen), unabhängig davon, ob Sie sie so ausführen oder nicht, und Sie können die Tests dann als Teil eines Gesamtbilds wiederverwenden.
Wir verwenden / erben denselben Code für Einheiten-, Integrations- und Systemtests wieder, manchmal datengesteuert, manchmal festschreibungsgesteuert und manchmal als Suite ausgeführt.
quelle
Siehe meine Lösung hier: "Junit und Java 7."
In diesem Artikel beschreibe ich, wie Junit-Tests in der richtigen Reihenfolge ausgeführt werden - "genau wie in Ihrem Quellcode". Tests werden ausgeführt, damit Ihre Testmethoden in der Klassendatei angezeigt werden.
http://intellijava.blogspot.com/2012/05/junit-and-java-7.html
Aber wie Pascal Thivent sagte, ist dies keine gute Praxis.
quelle
Mit JUnit 5.4 können Sie die Reihenfolge festlegen:
Sie müssen nur Ihre Klasse mit Anmerkungen versehen
https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order
Ich benutze dies in meinem Projekt und es funktioniert sehr gut!
quelle
Ich habe ein paar Antworten gelesen und bin damit einverstanden, dass dies nicht die beste Vorgehensweise ist, aber der einfachste Weg, Ihre Tests zu bestellen - und die Art und Weise, wie JUnit Tests standardmäßig ausführt, ist der aufsteigende alphabetische Name.
Benennen Sie Ihre Tests einfach in der gewünschten alphabetischen Reihenfolge. Beachten Sie auch, dass der Testname mit dem Wort test beginnen muss. Achten Sie einfach auf Zahlen
test12 wird vor test2 ausgeführt
damit:
testA_MyFirstTest testC_ThirdTest testB_ATestThatRunsSecond
quelle
Bitte überprüfen Sie diese: https://github.com/TransparentMarket/junit . Der Test wird in der angegebenen Reihenfolge ausgeführt (definiert in der kompilierten Klassendatei). Außerdem verfügt es über eine AllTests-Suite, mit der Tests ausgeführt werden können, die zuerst vom Unterpaket definiert werden. Mit der AllTests-Implementierung kann die Lösung erweitert werden, indem auch nach Eigenschaften gefiltert wird (wir haben früher @ Fast-Annotationen verwendet, diese wurden jedoch noch nicht veröffentlicht).
quelle
Hier ist eine Erweiterung von JUnit, die das gewünschte Verhalten erzeugen kann: https://github.com/aafuks/aaf-junit
Ich weiß, dass dies gegen die Autoren der JUnit-Philosophie verstößt, aber wenn Sie JUnit in Umgebungen verwenden, in denen keine strengen Unit-Tests durchgeführt werden (wie in Java praktiziert), kann dies sehr hilfreich sein.
quelle
Ich bin hier gelandet und habe gedacht, dass meine Tests nicht in der richtigen Reihenfolge durchgeführt wurden, aber die Wahrheit ist, dass das Chaos in meinen asynchronen Jobs lag. Wenn Sie mit Parallelität arbeiten, müssen Sie auch Parallelitätsprüfungen zwischen Ihren Tests durchführen. In meinem Fall teilen sich Jobs und Tests ein Semaphor, sodass die nächsten Tests hängen bleiben, bis der ausgeführte Job die Sperre aufhebt.
Ich weiß, dass dies nicht vollständig mit dieser Frage zusammenhängt, könnte aber möglicherweise helfen, das richtige Problem zu finden
quelle
Sie können einen dieser Codes verwenden:
quelle