JUnit vs TestNG [geschlossen]

125

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.

Sam Merrell
quelle
10
Änderungen von 08 bis jetzt ????
some_other_guy
Verwenden TestNGSie einfach , es hat alles, was Junit hat, und vieles mehr!
Eric Wang

Antworten:

67

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.

Mike Stone
quelle
14
JUnit kann die Gruppierung ausführen, über die Sie sprechen, indem Sie eine Testsuite definieren und dann die Tests in der gewünschten Gruppe zu dieser Suite hinzufügen. Sie können dann in Ihrem Ant-Skript ein Ziel einrichten, das nur diese Suite ausführt, und Ihre Quellcodeverwaltung so einrichten, dass dieses Ziel beim Einchecken ausgeführt wird.
Justin Standard
8
Der größte Vorteil von TestNG gegenüber JUnit ist die Möglichkeit, Testdaten für parametrisierte Tests dynamisch zu generieren. Jedes Testdatenelement ist ein anderer "Test", so dass es wirklich einfach ist, datengesteuerte Tests zu erstellen. Testng.org/doc/documentation-main.html#parameters
davetron5000
6
Parametrisierte Tests sind mit Theories, die in neuere Versionen von Junit integriert sind (aber derzeit experimentell sind), einfach durchzuführen.
Mnementh
9
TestNG-Gruppen können in JUnit 4.8 mit folgenden Kategorien durchgeführt werden: kentbeck.github.com/junit/doc/ReleaseNotes4.8.html .
Kaitsu
Einige Dinge, die nicht erwähnt wurden: Ich denke, der beste Vorteil von TestNG besteht darin, die gleichen Parameter zu übergeben, die Sie an jede Testmethode übergeben haben, auch an die Konfigurationsmethoden vor / nach dem Test: Dies ist eine große Hilfe beim Einrichten und Herunterfahren, meiner Meinung nach sehr leistungsfähig. Wenn Sie das nicht verstehen, denken Sie vielleicht, dass Sie es nicht brauchen. Außerdem gefällt mir, wie Sie Testsuiten im Code definieren können.
Djangofan
20

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)

Justin Standard
quelle
1
Unitils sieht nicht so aus, als ob es seit einiger Zeit aktualisiert wurde. Funktioniert es mit neueren Versionen von JUnit / TestNG?
Chinasaur
Nur für alle, die diese Antwort im Jahr 2011 gefunden haben, habe ich überprüft, und die neueste Unitils-Version (3.2) hat ein Veröffentlichungsdatum von: 2011-09-29. Es wird also aktiv gepflegt.
Oger Psalm33
18

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.)

Mark Derricutt
quelle
3
Ich verwende sowohl JUnit4 als auch TestNG. TestNG unterstützt die Integration von Federfedern im Frühjahr besser. Erleichtert das Testen der federbasierten Anwendung erheblich.
Hidralisk
18

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.

Abyx
quelle
IMHO ist die Killer-Funktion von TestNG die Möglichkeit, Kontextargumente über Vorher- und Nachher-Setup-Methoden zu übergeben. Sie können dort viele nette Zaubertricks machen, die Junit nicht kann. 95% der Menschen machen sich nicht die Mühe, TestNG so gut zu lernen, und wissen es nicht. Außerdem bietet TestNG eine übersichtliche Möglichkeit zum Threading über DataProvider, jedoch nur, wenn Sie dies nutzen. Außerdem kann testng.xml Beanshell enthalten.
Djangofan
17

Prost auf alle oben genannten. Einige andere Dinge, die ich persönlich in TestNG mehr mag, sind:

  1. Das @BeforeClassfor TestNG findet nach der Klassenerstellung statt, sodass Sie nicht nur statische Methoden Ihrer Klasse darin aufrufen können.

  2. 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 HtmlUnitTreiber aus dem einen oder anderen Grund kaputt gemacht .

Ja, wahrscheinlich müssen wir dieses Leben finden. ;)

Mezmo
quelle
endlich ein fleischiger Kommentar nach all dem ummm sie sind beide gleich ..und awwhing
user2412398
Ja, TestNG-Regeln: Ich lade Treiberinstanzen auch über Testargumente vom TestNG DataProvider. Hier ist, wie ich es gemacht habe: github.com/djangofan/yet-another-selenium-framework/blob/master/…
djangofan
10

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.

Ravinikam
quelle
7

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

assertEquals(operation.getStatus(), Operation.Status.Active);

Du kannst schreiben

assertThat(operation, isActive());

Dies gibt Ihnen die Möglichkeit, in Ihren Tests eine höhere Abstraktionsebene zu verwenden. Und das macht Ihre Tests robuster.

Denis Bazhenov
quelle
7

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.

In einfachen Worten, TestNG = JUnit + viel mehr. Warum also debattieren? Geh und schnapp dir TestNG :-)

Einen detaillierteren Vergleich finden Sie hier .

Sundararaj Govindasamy
quelle
5

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
Das Problem beim Einchecken von Änderungen, die Sie nicht beabsichtigt haben, ist tatsächlich, weil Sie überprüfen müssen, was Sie einchecken. Und wenn Sie einen großen Check-in haben, ist dies keine Entschuldigung, das ist ein weiteres Problem: Sie sollten viele kleinere Check-ins haben.
Hidralisk
5

Warum verwenden wir TestNG anstelle von JUnit?

  1. Die Deklaration von @BeforeClassund @AfterClassmethod muss in JUnit statisch sein, während TestNG in der Methodendeklaration flexibler ist und diese Einschränkungen nicht aufweist.

  2. 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.

  3. In TestNG können wir, da die @ DataProvider-Methode nicht statisch sein muss, mehrere Datenprovider-Methoden in derselben Testklasse verwenden.

  4. 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.

  5. 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.

  6. 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.

  7. TestNG @DataProvider kann auch XML zum Einspeisen von Daten, CSVs oder sogar einfachen Textdateien unterstützen.

  8. Mit TestNG können Sie Abhängigkeiten zwischen Tests deklarieren und überspringen, wenn der Abhängigkeitstest nicht bestanden wurde.

@Test (abhängigeOnMethoden = {"abhängigeSomething"})

Diese Funktionalität ist in JUnit nicht vorhanden

  1. Berichterstattung:

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:

  1. Ein schneller Vergleich zwischen JUnit und TestNG
  2. JUnit vs. TestNG: Welches Test-Framework sollten Sie wählen?

In diesem Tutorial wird nebeneinander ein guter Unterschied angegeben: TestNG Vs JUnit: Was ist der Unterschied?

SkyWalker
quelle
Sie haben die eindeutigste Funktion von TestNG, IHMO, nicht aufgelistet: die Möglichkeit, Kontextargumente an Vorher- und Nachher-Methoden zu übergeben, wodurch Sie etwas Magie ausführen können. Der DataProvider funktioniert beispielsweise so.
Djangofan
3

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.

Meistgesucht
quelle
3

Meine Meinung darüber, was TestNG wirklich viel leistungsfähiger macht:

1.  JUnit still requires the before/after class methods to be static, which limits
    what you can do prior to the running of tests, TestNG never has this issue.

2.  TestNG @Configuration methods can all take an optional argument to their 
    annotated methods in the form of a ITestResult, XmlTest, Method, or 
    ITestContext.  This allows you to pass things around that JUnit wouldn't 
    provide you.  JUnit only does this in listeners and it is limited in use.

3.  TestNG comes with some pre-made report generation classes that you can copy
     and edit and make into your own beautiful test output with very little 
     effort. Just copy the report class into your project and add a listener 
     to run it.  Also, ReportNG is available.

4.  TestNG has a handful of nice listeners that you can hook onto so you can do
     additional AOP style magic at certain phases during testing.
Djangofan
quelle