Bei der Arbeit verwenden wir derzeit noch JUnit 3, um unsere Tests durchzuführen. Wir haben überlegt, auf JUnit 4 umzusteigen, um neue Tests zu schreiben, aber ich habe TestNG schon eine Weile im Auge behalten. Welche Erfahrungen haben Sie alle mit JUnit 4 oder TestNG gemacht und welche scheinen bei sehr vielen Tests besser zu funktionieren? Flexibilität beim Schreiben von Tests ist uns ebenfalls wichtig, da unsere Funktionstests einen weiten Aspekt abdecken und auf verschiedene Arten geschrieben werden müssen, um Ergebnisse zu erzielen.
Alte Tests werden nicht neu geschrieben, da sie ihre Arbeit gut machen. Was ich jedoch in neuen Tests sehen möchte, ist Flexibilität in der Art und Weise, wie der Test geschrieben werden kann, natürliche Behauptungen, Gruppierung und einfach zu verteilende Testausführungen.
TestNG
Sie einfach , es hat alles, was Junit hat, und vieles mehr!Antworten:
Ich habe beide verwendet, aber ich muss Justin Standard zustimmen, dass Sie nicht wirklich in Betracht ziehen sollten, Ihre vorhandenen Tests in ein neues Format umzuschreiben. Unabhängig von der Entscheidung ist es ziemlich trivial, beide auszuführen. TestNG ist bestrebt, viel konfigurierbarer als JUnit zu sein, aber am Ende funktionieren beide gleich gut.
TestNG verfügt über eine übersichtliche Funktion, mit der Sie Tests als bestimmte Gruppe markieren und dann problemlos alle Tests einer bestimmten Gruppe ausführen oder Tests einer bestimmten Gruppe ausschließen können. So können Sie Tests markieren, die langsam wie in der Gruppe "langsam" ausgeführt werden, und sie dann ignorieren, wenn Sie schnelle Ergebnisse erzielen möchten. Ein Vorschlag aus der Dokumentation ist, eine Teilmenge als "Check-in" -Tests zu markieren, die ausgeführt werden sollten, wenn Sie neue Dateien einchecken. Ich habe eine solche Funktion in JUnit noch nie gesehen, aber wenn Sie sie nicht haben, tun Sie es nicht. Ich vermisse es WIRKLICH.
Trotz all seiner Behauptungen von hoher Konfiguration bin ich vor ein paar Wochen auf einen Eckfall gestoßen, in dem ich nicht tun konnte, was ich tun wollte ... Ich wünschte, ich könnte mich daran erinnern, was es ist, aber ich wollte es ansprechen Sie wissen also, dass es nicht perfekt ist.
Der größte Vorteil von TestNG sind Anmerkungen ... die JUnit in Version 4 sowieso hinzugefügt hat.
quelle
Zuerst würde ich sagen, schreiben Sie nicht alle Ihre Tests neu, nur um der neuesten Mode zu entsprechen. Junit3 funktioniert einwandfrei und die Einführung von Anmerkungen in 4 bringt Ihnen (meiner Meinung nach) nicht viel. Es ist viel wichtiger, dass ihr Tests schreibt , und es klingt so, als ob ihr es tut.
Verwenden Sie alles, was Ihnen am natürlichsten erscheint und Ihnen hilft, Ihre Arbeit zu erledigen.
Ich kann TestNG b / c nicht kommentieren. Ich habe es nicht verwendet. Aber ich würde Unitils empfehlen , einen großartigen Wrapper für JUnit / TestNG / DBUnit / EasyMock, unabhängig davon, welchen Weg Sie einschlagen . (Es unterstützt alle oben genannten Aromen)
quelle
Zu den größten Ziehungskarten von TestNG gehören für mich die Support-Testgruppen und vor allem die Abhängigkeiten von Testgruppen (wenn ein Test als von einer Gruppe abhängig markiert wird, werden die Tests einfach übersprungen, wenn die abhängige Gruppe ausfällt).
Zu den anderen großen Auslosungskarten von TestNG gehören für mich Testparameter, Datenanbieter, Annotationstransformatoren und vor allem die lebendige und reaktionsschnelle Benutzergemeinschaft.
Obwohl man an der Oberfläche möglicherweise nicht der Meinung ist, dass nicht alle oben genannten TestNG-Funktionen benötigt werden, werden Sie sich fragen, wie Sie mit JUnit umgegangen sind, sobald Sie die Flexibilität Ihrer Tests verstanden haben.
(Haftungsausschluss - Ich habe JUnit 4.x überhaupt nicht verwendet, kann daher keine Fortschritte oder neuen Funktionen kommentieren.)
quelle
Vor ungefähr einem Jahr hatten wir das gleiche Problem. Ich habe einige Zeit darüber nachgedacht, welcher Zug besser ist, und schließlich haben wir festgestellt, dass TestNG keine "Killer-Features" hat. Es ist schön und hat einige Funktionen, die JUnit 4 nicht hat, aber wir brauchen sie nicht.
Wir wollten nicht, dass sich die Leute beim Schreiben von Tests beim Schreiben von TestNG unwohl fühlen, weil wir wollten, dass sie weiterhin viele Tests schreiben.
Außerdem ist JUnit so ziemlich der De-facto-Standard in der Java-Welt. Es gibt kein anständiges Tool, das es nicht von der Stange unterstützt. Sie können im Internet viel Hilfe finden und im vergangenen Jahr wurden viele neue Funktionen hinzugefügt, die zeigen, dass es lebt.
Wir haben uns entschieden, bei JUnit zu bleiben und haben nie zurückgeschaut.
quelle
Prost auf alle oben genannten. Einige andere Dinge, die ich persönlich in TestNG mehr mag, sind:
Das
@BeforeClass
for TestNG findet nach der Klassenerstellung statt, sodass Sie nicht nur statische Methoden Ihrer Klasse darin aufrufen können.Parallele und parametrisierte Tests, vielleicht habe ich einfach nicht genug von einem Leben ... aber ich bekomme nur einen Kick, wenn ich einen Satz Selenium-Tests schreibe und einen Treibernamen als Parameter akzeptiere. Definieren Sie dann 3 parallele Testgruppen, jeweils eine für die IE-, FF- und Chrome-Treiber, und beobachten Sie das Rennen! Ich habe ursprünglich 4 gemacht, aber viel zu viele der Seiten, an denen ich gearbeitet habe, haben den
HtmlUnit
Treiber aus dem einen oder anderen Grund kaputt gemacht .Ja, wahrscheinlich müssen wir dieses Leben finden. ;)
quelle
Ich wollte den teilen, dem ich heute begegnet bin. Ich fand, dass der eingebaute parametrisierte Runner in Junit4 im Vergleich zu TestNG ziemlich grob ist (ich weiß, dass jedes Framework seine Stärken hat, aber immer noch). Die Junit4-Annotation @parameters ist auf einen Parametersatz beschränkt. Ich habe dieses Problem beim Testen des gültigen und ungültigen Verhaltens auf Funktionalität in derselben Testklasse festgestellt. Es wird also die erste öffentliche, statisch annotierte Methode verwendet, die gefunden wird, sie kann jedoch in beliebiger Reihenfolge gefunden werden. Dies führt dazu, dass wir unnötig verschiedene Klassen schreiben. TestNG bietet jedoch eine saubere Möglichkeit, für jede Methode verschiedene Arten von Datenanbietern bereitzustellen. So können wir dieselbe Codeeinheit auf gültige und ungültige Weise in derselben Testklasse testen und die gültigen / ungültigen Daten separat eingeben. Ich werde mit TestNG gehen.
quelle
Ein weiterer Vorteil von TestNG ist die Unterstützung paralleler Tests. In unserer Zeit der Multicores ist es wichtig, denke ich.
Ich habe auch beide Frameworks verwendet. Aber ich benutze Hamcrest für Behauptungen. Mit Hamcrest können Sie ganz einfach Ihre eigene Assert-Methode schreiben. Also statt
Du kannst schreiben
Dies gibt Ihnen die Möglichkeit, in Ihren Tests eine höhere Abstraktionsebene zu verwenden. Und das macht Ihre Tests robuster.
quelle
JUnit 4 Vs TestNG - Vergleich von mkyong.com (aktualisiert 2013).
Fazit: Ich schlage vor , TestNG als Kern Unit - Test - Framework für Java - Projekt zu verwenden, da TestNG ist mehr Fortschritt in der parametrierbaren Tests, Abhängigkeit Prüfung und Suite Prüfung (Gruppierungskonzept).
TestNG ist für funktionale Tests auf hoher Ebene und komplexe Integrationstests gedacht. Seine Flexibilität ist besonders bei großen Testsuiten nützlich.
Zusätzlich, deckt TestNG auch die gesamte Kernfunktionalität von JUnit4 ab . Es ist einfach kein Grund mehr für mich, JUnit zu verwenden.
Einen detaillierteren Vergleich finden Sie hier .
quelle
Ein paar Ergänzungen zu Mike Stones Antwort:
1) Ich verwende die Gruppen von TestNG am häufigsten, wenn ich eine einzelne Testmethode in einer Testsuite ausführen möchte. Ich füge diesen Test einfach der Gruppe "phil" hinzu und führe diese Gruppe dann aus. Wenn ich JUnit 3 verwendete, kommentierte ich die Einträge für alle Methoden außer der, die ich in der "Suite" -Methode ausführen wollte, aus, vergaß dann aber normalerweise, sie vor dem Einchecken zu kommentieren. Mit den Gruppen habe ich dieses Problem nicht mehr.
2) Abhängig von der Komplexität der Tests kann die Migration von Tests von JUnit3 nach TestNG mit sed etwas automatisch durchgeführt und eine Basisklasse erstellt werden, um TestCase zu ersetzen, die statisch alle TestNG-Assert-Methoden importiert.
Ich habe hier und hier Informationen zu meiner Migration von JUnit zu TestNG .
quelle
Warum verwenden wir TestNG anstelle von JUnit?
Die Deklaration von
@BeforeClass
und@AfterClass
method muss in JUnit statisch sein, während TestNG in der Methodendeklaration flexibler ist und diese Einschränkungen nicht aufweist.In TestNG können wir Tests auf zwei Arten parametrisieren . Annotation @Parameter oder @DataProvider.
i) @Parameter für einfache Fälle, in denen eine Schlüsselwertzuordnung erforderlich ist (Daten werden über eine XML-Datei bereitgestellt).
ii) @DataProvider für komplexe Fälle. Mit einem zweidimensionalen Array können Daten bereitgestellt werden.
In TestNG können wir, da die @ DataProvider-Methode nicht statisch sein muss, mehrere Datenprovider-Methoden in derselben Testklasse verwenden.
Abhängigkeitstest: Wenn in TestNG der erste Test fehlschlägt, werden alle nachfolgenden abhängigen Tests übersprungen und nicht als fehlgeschlagen markiert. Aber JUnit hat es als fehlgeschlagen markiert.
Gruppierung: Einzelne Tests können zu mehreren Gruppen gehören und dann in verschiedenen Kontexten ausgeführt werden (z. B. langsame oder schnelle Tests). Eine ähnliche Funktion gibt es in JUnit-Kategorien, es fehlen jedoch die Annotationen @BeforeGroups / @AfterGroups TestNG, mit denen der Test initialisiert / abgerissen werden kann.
Parallelität: Wenn Sie denselben Test parallel auf mehreren Threads ausführen möchten, bietet TestNG eine einfach zu verwendende Anmerkung, während JUnit keine einfache Möglichkeit bietet, dies sofort zu tun.
TestNG @DataProvider kann auch XML zum Einspeisen von Daten, CSVs oder sogar einfachen Textdateien unterstützen.
Mit TestNG können Sie Abhängigkeiten zwischen Tests deklarieren und überspringen, wenn der Abhängigkeitstest nicht bestanden wurde.
Diese Funktionalität ist in JUnit nicht vorhanden
TestNG-Berichte werden standardmäßig in einem Testausgabeordner generiert, der HTML-Berichte mit allen Testdaten enthält, die bestanden / fehlgeschlagen / übersprungen wurden, wie lange sie ausgeführt wurden, welche Eingabe verwendet wurde und die vollständigen Testprotokolle. Darüber hinaus wird alles in eine XML-Datei exportiert, mit der Sie Ihre eigene Berichtsvorlage erstellen können.
Auf der JUnit-Seite sind alle diese Daten auch über XML verfügbar, es gibt jedoch keinen sofort einsatzbereiten Bericht, und Sie müssen sich auf Plugins verlassen.
Ressourcenlink:
In diesem Tutorial wird nebeneinander ein guter Unterschied angegeben: TestNG Vs JUnit: Was ist der Unterschied?
quelle
Ihre Frage scheint mir zweifach gefaltet zu sein. Zum einen möchten Sie zwei Test-Frameworks vergleichen, zum anderen möchten Sie Tests einfach implementieren, natürliche Behauptungen aufstellen usw.
Ok, erstens hat JUnit TestNG in Bezug auf die Funktionalität aufgeholt, sie haben die Lücke etwas mit v4 geschlossen, aber meiner Meinung nach nicht gut genug. Dinge wie Anmerkungen und Datenanbieter sind in TestNG noch viel besser. Sie sind auch flexibler in Bezug auf die Testausführung, da TestNG Testabhängigkeit, Gruppierung und Reihenfolge aufweist.
JUnit erfordert weiterhin, dass bestimmte Vorher / Nachher-Methoden statisch sind, was die Möglichkeiten vor dem Ausführen von Tests einschränkt. TestNG hat dieses Problem nie.
TBH, meistens bedeuten die Unterschiede zwischen den beiden Frameworks nicht viel, es sei denn, Sie konzentrieren sich auf Integrations- / Automatisierungstests. Aus meiner Erfahrung heraus wurde JUnit von Grund auf für Unit-Tests entwickelt und wird nun in Richtung höherer Testebenen getrieben, was IMO zum falschen Werkzeug für diesen Job macht. TestNG eignet sich gut für Unit-Tests und funktioniert aufgrund seiner robusten Datenbereitstellung und hervorragenden Testausführungsfähigkeiten noch besser auf der Ebene der Integrations- / Automatisierungstests.
Nun, was ich glaube, ist eine separate Frage, wie man gut strukturierte, lesbare und wartbare Tests schreibt. Das meiste davon wissen Sie sicher, aber Dinge wie Factory Pattern , Command Pattern und PageObjects (wenn Ihre Testwebsites wichtig sind) sind sehr wichtig. Es ist sehr wichtig, eine Abstraktionsebene zwischen dem, was Sie testen (SUT) und dem, was der eigentliche Test ist ist (Behauptungen der Geschäftslogik). Um viel schönere Aussagen zu machen, können Sie Hamcrest verwenden . Verwenden Sie Javas Vererbung / Schnittstellen, um Wiederholungen zu reduzieren und Gemeinsamkeiten zu erzwingen.
Fast vergessen, verwenden Sie auch das Test Data Builder-Muster . Dies ist in Verbindung mit der Annotation des Datenanbieters von TestNG sehr nützlich.
quelle
Meine Meinung darüber, was TestNG wirklich viel leistungsfähiger macht:
quelle