Erschaffung JUnit Testsuite mit Beispiel: @RunWith @SuiteClasses
⚡ Intelligente Zusammenfassung
JUnit Test-Suites aggregieren Testfälle aus mehreren Klassen, sodass sie gemeinsam in einem einzigen Durchlauf ausgeführt werden. Dies wird durch die Annotationen @RunWith(Suite.class) und @SuiteClasses gesteuert und durch eine gewöhnliche Test-Runner-Klasse gestartet.

In JUnitEine Testsuite ermöglicht es uns, alle Testfälle aus mehreren Klassen an einem Ort und diese gemeinsam ausführen.
Um die Testsuite auszuführen, müssen Sie eine Klasse mit den unten genannten Annotationen versehen:
- @RunWith(Suite.class)
- @SuiteClasses(test1.class, test2.class…) oder @Suite.SuiteClasses({test1.class, test2.class…})
Mit den oben genannten Annotationen werden alle Testklassen der Suite nacheinander ausgeführt. Die Suite-Klasse selbst bleibt leer: Sie dient lediglich als Container für die Annotationen, und der Test-Runner liest diese Annotationen, um zu entscheiden, welche Klassen ausgeführt werden sollen.
Schritte zum Erstellen einer Testsuite und eines Testläufers
Die folgenden vier Schritte bauen die kleinste Suite auf, die tatsächlich ausgeführt werden kann: zwei gewöhnliche Testklassen, eine Suite-Klasse, die diese benennt, und ein Runner, der die Suite von einer main-Methode aus startet.
Schritt 1) Erstellen Sie eine einfache Testklasse (z. B. MyFirstClassTest) und fügen Sie eine mit folgender Annotation versehene Methode hinzu: @Prüfung.
Die erste Klasse enthält eine einzige leere Testmethode, was ausreicht, um zu beweisen, dass die Testsuite sie erkennt:
Schritt 2) Erstellen Sie eine weitere Testklasse (z. B. MySecondClassTest) und erstellen Sie eine mit @Test annotierte Methode.
Die zweite Klasse hat genau die gleiche Form, sodass die Suite zwei separate Klassen zur Aggregation enthält:
Schritt 3) Um eine TestSuite zu erstellen, müssen Sie zuerst die Klasse mit @RunWith(Suite.class) und @SuiteClasses(class1.class, class2.class…) annotieren.
Beachten Sie, dass die Suite-Klasse TestSuiteExample keine eigene Testmethode deklariert – die beiden Annotationen enthalten alle Informationen:
Schritt 4) Erstellen Sie eine Test-Runner-Klasse, um unsere Testsuite wie unten angegeben auszuführen:
Der Läufer ist ein einfacher Java Klasse mit einer Hauptmethode, die die Suite-Klasse übergibt an JUnitKerndurchmesser:
Code Erläuterung:
- Code Linie 8: Deklaration der main-Methode der Klasse Test, die unseren Test ausführen wird. JUnit Test.
- Code Linie 9: Ausführen von Testfällen mit JUnitCore.runClasses, das den Namen der Testklasse als Parameter entgegennimmt (Im obigen Beispiel verwenden Sie TestSuiteExample.class, wie in Schritt 3 gezeigt).
- Code Linie 11: Das Ergebnis wird mithilfe einer for-Schleife verarbeitet und das fehlgeschlagene Ergebnis ausgegeben.
- Code Linie 13: Ausdrucken des erfolgreichen Ergebnisses.
Ausgang: Hier ist die Ausgabe, die einen erfolgreichen Test ohne Fehler anzeigt. trace wie unten angegeben:
Der grüne Balken bestätigt den Zweck einer Suite: ein Startvorgang, eine Ergebnisansicht und die beiden Klassen werden unter dem Suite-Knoten und nicht in zwei separaten Durchläufen gemeldet.
JUnit Beispiel einer Testsuite
Betrachten wir ein komplexeres Beispiel, in dem die Klassen innerhalb der Suite tatsächlich behaupten etwas anstelle einer leeren Methode.
JunitTest.java
JunitTest.java ist eine einfache Klasse, die mit der Annotation versehen ist. @ RunWith und @Suite Annotationen. Sie können beliebig viele Klassen der Suite als Parameter auflisten, wie unten angegeben:
package guru99.junit; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({ SuiteTest1.class, SuiteTest2.class, }) public class JunitTest { // This class remains empty, it is used only as a holder for the above annotations }
SuiteTest1.java
SuiteTest1.java ist eine Testklasse mit Testmethoden, die eine Meldung ausgeben, wie unten angegeben. Sie verwenden diese Klasse als Suite-Element in der oben genannten Klasse. Sie basiert auf einer Hilfsklasse namens JUnitDie Meldung ist an anderer Stelle im selben Paket definiert und wird hier nicht wiedergegeben.
package guru99.junit; import static org.junit.Assert.assertEquals; import org.junit.Test; public class SuiteTest1 { public String message = "Saurabh"; JUnitMessage junitMessage = new JUnitMessage(message); @Test(expected = ArithmeticException.class) public void testJUnitMessage() { System.out.println("Junit Message is printing "); junitMessage.printMessage(); } @Test public void testJUnitHiMessage() { message = "Hi!" + message; System.out.println("Junit Hi Message is printing "); assertEquals(message, junitMessage.printHiMessage()); System.out.println("Suite Test 2 is successful " + message); } }
SuiteTest2.java
SuiteTest2.java ist eine weitere Testklasse, ähnlich wie SuiteTest1.javaSie verfügen über eine Testmethode, die eine Meldung wie unten angegeben ausgibt. Sie werden diese Klasse als Suite-Mitglied verwenden in JunitTest.java.
package guru99.junit; import org.junit.Assert; import org.junit.Test; public class SuiteTest2 { @Test public void createAndSetName() { String expected = "Y"; String actual = "Y"; Assert.assertEquals(expected, actual); System.out.println("Suite Test 1 is successful " + actual); } }
Ausgang
Nach der Ausführung JunitTest.java, das eine Suite enthält SuiteTest1.java und SuiteTest2.javaSie erhalten die unten stehende Ausgabe. Die Konsole gibt die von beiden Klassen erzeugten Meldungen aus:
Das JUnit Die Ansicht protokolliert denselben Durchlauf wie drei erfolgreiche Testmethoden, die unter der Suite-Klasse gruppiert sind:
Hinweis: Die Konsolenbezeichnungen in diesem Beispiel sind vertauscht – die von SuiteTest1 ausgegebene Zeichenkette lautet „Suite Test 2“ und die von SuiteTest2 ausgegebene „Suite Test 1“. Die ursprünglichen Listings werden unverändert wiedergegeben, sodass die Bezeichnungen so bleiben, wie sie vom Autor geschrieben wurden; lesen Sie den Klassennamen in der JUnit Beim Abgleich von Ausgabe und Quelle wird die Ansicht anstelle des gedruckten Etiketts verwendet.
Wie man eine Testsuite erstellt JUnit 5
JUnit Version 5 entfernt Runner vollständig, daher existiert @RunWith(Suite.class) nicht mehr in den org.junit.jupiter-Paketen. Die Suiten wurden verschoben. JUnit Plattform, die sie in einem separaten Artefakt namens ausliefert junit-platform-suite-engineFüge diese Abhängigkeit hinzu und annotiere dann eine Klasse mit @Suite und einer der Selektor-Annotationen.
import org.junit.platform.suite.api.SelectClasses; import org.junit.platform.suite.api.Suite; import org.junit.platform.suite.api.SuiteDisplayName; @Suite @SuiteDisplayName("Guru99 suite") @SelectClasses({ SuiteTest1.class, SuiteTest2.class }) public class JunitTest { // Empty holder, exactly as in JUnit 4 }
Die Selektor-Annotationen ersetzen die einzelne @SuiteClasses-Liste durch eine kleine Gruppe von Optionen:
| Anmerkung | Was es auswählt |
| @SelectClasses | Einzelne Testklassen, die nacheinander benannt werden, der direkte Ersatz für @SuiteClasses. |
| @SelectPackages | Jede Testklasse im genannten Paket und in allen seinen Unterpaketen. |
| @IncludeClassNamePatterns | Ein regulärer Ausdrucksfilter wird auf die Auswahl angewendet. |
| @SuiteDisplayName | Im Bericht wird anstelle des Klassennamens ein lesbarer Name angezeigt. |
Zwei weitere Unterschiede sind in der Praxis relevant. JUnit Die Suite-Klasse 5 kann die Methoden @BeforeSuite und @AfterSuite deklarieren, die einmalig für die gesamte Suite ausgeführt werden. JUnit Das obige Beispiel 4 wird weiterhin ausgeführt. JUnit Die Plattform nutzt die Vintage-Engine, sodass der Originalcode auf dieser Seite nicht neu geschrieben werden muss, um weiterhin zu funktionieren.
Vorteile und Grenzen von JUnit Testsuiten
Eine Suite ist eine Gruppeping Mechanismus, nicht ein Testrahmen Es hat seinen eigenen Charakter, und das prägt sowohl seine Stärken als auch seine Grenzen.
Vorteile
- Ein Startvorgang führt zusammengehörige Klassen gemeinsam aus, beispielsweise ein Rauchset oder ein Regression Das Set wird mit einem einzigen Befehl gestartet.
- Die Ergebnisansicht gruppiert alle Klassen unter einem Suite-Knoten, wodurch ein gemeinsamer Fehler leichter zu erkennen ist.
- Die Mitgliederliste ist im Quellcode enthalten und wird daher wie jede andere Quelldatei überprüft und versioniert.
- Dieselbe Suite-Klasse kann von einer IDE oder einem Runner wie beispielsweise gestartet werden. JUnitAus dem Core oder von einem Build-Tool.
Einschränkungen
- @SuiteClasses ist eine fest codierte Liste, daher wird eine neue Testklasse stillschweigend ausgelassen, bis jemand die Testsuite bearbeitet.
- Die Suite gibt keine Garantie für die Reihenfolge der Kurse über die Reihenfolge hinaus, in der sie aufgelistet sind.
- Es gibt keine gemeinsame Nutzung zwischen den einzelnen Klassen, daher ist eine Suite kein Ersatz für eine Spieleinrichtung oder eine Basisklasse.
- Build-Tools erkennen Testklassen bereits anhand der Namenskonvention, wodurch eine Testsuite in vielen Projekten überflüssig wird.
Häufige Fehler beim Erstellen eines JUnit Testsuite
Die meisten Probleme mit der Suite führen zu einer kurzen, nichtssagenden Fehlermeldung. Die Tabelle ordnet die häufigsten Fehlermeldungen ihren Ursachen und Lösungen zu.
| Nachricht oder Symptom | Verursachen | Fixieren |
| Initialisierungsfehler: Keine ausführbaren Methoden | Die Klasse wird wie eine normale Testklasse ausgeführt, enthält aber nur Annotationen. | Fügen Sie @RunWith(Suite.class) hinzu, damit der Suite-Runner anstelle des Standard-Runners die Kontrolle übernimmt. |
| Symbol nicht gefunden: Klasse Suite | Der Suite-Import fehlt. | Importieren Sie org.junit.runners.Suite zusammen mit org.junit.runner.RunWith. |
| Die Suite läuft, aber eine Unterrichtsstunde wird ausgelassen. | Die Klasse wurde nie zur @SuiteClasses-Liste hinzugefügt. | Fügen Sie die Klasse explizit hinzu oder verschieben Sie sie zu @SelectPackages in JUnit 5. |
| Der Klassenname wird vom Compiler nicht akzeptiert. | @Runwith oder @suiteClasses wurde mit falscher Groß-/Kleinschreibung eingegeben. | Java Bei Annotationen wird zwischen Groß- und Kleinschreibung unterschieden: @RunWith und @SuiteClasses müssen exakt so geschrieben werden. |
| Die Tests in der Suite-Klasse selbst werden nie ausgeführt. | Dem Suite-Holder wurde eine @Test-Methode hinzugefügt. | Lassen Sie den Holder leer und verschieben Sie die Testmethode in eine Memberklasse. |
Die Suite einmal schreiben und behaltenping Die Genauigkeit ist die eigentliche Arbeit. Wenn die Liste von den Klassen auf der Festplatte abweicht, meldet die Suite einen grünen Status, solange ein Teil davon nicht verloren geht. Gerätetest Das Set wird nie ausgeführt, eine der stillsten Fehlerarten in Softwaretest.







