JUnit 4 vs TestNG - Update 2013 - 2014 [geschlossen]

88

JUnit 4 und TestNG waren früher vergleichbar. Was sind die Vor- und Nachteile der beiden Test-Frameworks?

ctekk
quelle
Wenn Sie sich den Funktionsvergleich ansehen , gibt es einen guten Artikel von mkyong über jUnit 4 Vs testNG. Wenn Sie sich auf den Nutzungsvergleich beziehen möchten. Es gibt einen schönen Artikel von Kapil Hope, der hilft!
Anshu
71
Ich finde Fragen wie diese auf SO äußerst hilfreich ... Ich wollte mich bei Ihnen dafür bedanken, dass Sie das Risiko eingegangen sind, sie zu stellen, und gratuliere, dass Sie sie nicht geschlossen haben!
user1445967
Weg gegen die Gleichen Ihres Publikums: D
ctekk
2
Nach so vielen Jahren diese Frage wieder sehen. Das Lustige ist - ich rieche Verschwörung! Meine Frage konzentrierte sich vollständig auf verschiedene Funktionen, dann gab es eine "Community" -Bearbeitung, die meine Frage in "Vor- und Nachteile" umwandelte, und dann wurde die Frage aufgrund einer meinungsbasierten Meinung geschlossen. Lmao.
Ctekk

Antworten:

29

Ich habe heute TestNG und JUnit4 verglichen, und der Hauptvorteil, den ich mit meiner begrenzten Erfahrung in Test-Frameworks hervorheben kann, ist, dass TestNG eine elegantere Art hat, parametrisierte Tests mit dem Datenprovider-Konzept zu handhaben.

Soweit ich mit JUnit4 feststellen kann, müssen Sie für jeden Parametersatz, mit dem Sie testen möchten (mit dem ausgeführt wird @RunWith(Parameterized.class)) , eine separate Testklasse erstellen . Mit TestNG können Sie mehrere Datenanbieter in einer einzigen Testklasse haben, sodass Sie alle Ihre Tests für eine einzelne Klasse auch in einer einzigen Testklasse aufbewahren können.

Bisher ist dies das einzige, was ich als Vorteil von TestNG gegenüber JUnit4 hervorheben kann.

Intellij IDEA bietet sofort Unterstützung für TestNG und JUnit. Eclipse unterstützt jedoch nur JUnit ab Werk und benötigt ein TestNG-Plugin, damit es funktioniert.

Ein ärgerlicheres Problem, auf das ich bei TestNG gestoßen bin, ist jedoch, dass Ihre Testklassen erweitert werden müssen, PowerMockTestCasewenn Sie PowerMock verwenden, um Abhängigkeiten in Ihren Tests zu verspotten. Anscheinend gibt es Möglichkeiten, die Objektfactory zu konfigurieren, über die Ihr Testframework Bescheid wissen muss, wenn Sie PowerMock über eine spezielle Methode oder über die testng.xmlSuite-Definition verwenden. Diese scheinen jedoch derzeit fehlerhaft zu sein. Ich mag es nicht, wenn Testklassen Test-Framework-Klassen erweitern, es scheint hackisch.

Wenn Sie PowerMock nicht verwenden, ist dies natürlich kein Problem, aber insgesamt habe ich den Eindruck, dass JUnit4 besser unterstützt wird.

JeroenHoek
quelle
5
Nicht, dass es alternative Implementierungen parametrisierter Tests gibt, zum Beispiel code.google.com/p/junitparams. Und wenn Sie keine davon mögen, können Sie Ihre eigenen schreiben - das gefällt mir an der Erweiterbarkeit von JUnit. ;)
Esko Luontola
17

Aufgrund meiner Erfahrung mit beiden Frameworks verfügt testng über einige nützliche Funktionen, deren Implementierung das JUnit-Team seit mehreren Jahren abgelehnt hat. Aus diesem Grund ziehe ich es JUnit vor. Das Konvertieren in testng ist einfach, da es im Grunde so ziemlich alles in JUnit unterstützt (es gibt sogar ein Konverter-Plugin für Eclipse). Das Konvertieren zurück in JUnit ist aufgrund dieser fehlenden Funktionen nicht so toll.

  • In testng sind @BeforeClassMethoden nicht statisch und werden ausgeführt, bevor die Tests in dieser Klasse ausgeführt werden, und nicht, wenn die Testklasse geladen wird (das JUnit-Verhalten). Ich hatte einmal ein JUnit-Projekt, bei dem alle Datenbanktests (ein paar Dutzend) die Datenbank gleich zu Beginn initialisierten, was ein ziemlich idiotisches Verhalten war. In und in der JUnit-Community gab es viele Debatten dafür und dagegen. Das Wesentliche dabei war, dass jede Testmethode eine eigene Testvorrichtung haben sollte und daher keine nicht statische Methode im beforeAll-Stil vorhanden sein sollte, da Sie so eine Instanzvariable einmalig festlegen und sie dann in all Ihren Tests verwenden können. Gültig, aber für Integrationstests sehr ärgerlich. TestNG gibt Benutzern hier die Wahl. Junit tut dies nicht, was ärgerlich ist.

  • Testng-Datenanbieter sind etwas flexibler als das JUnit-Äquivalent. Sie können pro Test angeben, welche Datenprovider-Methode die Eingabe bereitstellen soll, anstatt einen einheitlichen Ansatz für die gesamte Klasse wie in JUnit zu verwenden. So können Sie positive und negative Falldatenanbieter für Ihre Tests in einer Klasse haben. Sehr schön zu haben.

  • Sie können eine Klasse mit @Testin testng markieren, was bedeutet: Jede öffentliche Methode ist ein Test. In Junit müssen Sie @Testjede Methode kopieren / einfügen .

Ein Ärger bei beiden ist die Art und Weise, wie Hamcrest mit JUnit gebündelt wird und wie JUnit mit testng gebündelt wird. Es gibt alternative Gläser in Maven, die dieses Problem nicht haben.

Meine große Sorge bei beiden Frameworks ist, dass sich beide offenbar nicht mehr weiterentwickelt haben. Veröffentlichungen werden immer seltener und weisen immer weniger bemerkenswerte Merkmale auf. Die gesamte BDD-Bewegung scheint zum Beispiel wenig Einfluss auf beide Rahmen gehabt zu haben. Außerdem hätte JUnit einfach das meiste von dem übernehmen können, was ich oben aufgeführt habe. Es gibt keinen guten technischen Grund, warum JUnit keines dieser Dinge implementieren kann. Die Leute hinter JUnit entscheiden sich einfach dafür, diese Dinge nicht umzusetzen. Beiden Projekten scheint auch eine Vision für zukünftige Richtungen zu fehlen, und sie scheinen glücklich zu sein, in den letzten Jahren nur geringfügige Änderungen vorgenommen zu haben.

Jilles van Gurp
quelle
9

Ich suchte nach guten Gründen, um TestNG auf JUnit umzustellen, und fand diese Folien von Tomek Kaczanowski sehr gut, um diese Frage zu beantworten. Tomek ist Autor des Buches " Practical Unit Testing ", das von Entwicklern und Testern sehr geschätzt zu werden scheint.

MajiK
quelle
1

Wenn Sie an einem Java / Scala-Projekt arbeiten und Gradle das Build-Tool Ihrer Wahl ist, denken Sie daran, dass das ScalaTestFramework nur JUnitRunnerIhre Scala-Tests ausführen muss. Mit anderen Worten, Sie haben die Wahl:

  • Java JUnit-Tests + Scala-Tests werden mit JUnitRunner ausgeführt => Bessere Gradle-Integration
  • Java testNG-Tests + Scala-Tests werden mit Scala Runner ausgeführt => Schlechte Gradle-Integration, da Scala Test Runner aus Gradles Sicht eine einzelne Massenaufgabe ist.
Ivan Balashov
quelle
0

Sie können Mockito als Verspottungsrahmen verwenden. Es lässt sich gut in TestNG integrieren. Sie müssen keine Klasse erweitern, um Mockito mit TestNG zu verwenden. Sie testen Code auf diese Weise weniger gekoppelt, und wenn Sie aus irgendeinem Grund andere Verspottungs-Frameworks verwenden müssen, ist dies einfach.

El Do.
quelle
7
Diese Antwort ist für die Frage einfach völlig irrelevant ....
Adrian Shum
11
@AdrianShum Ich denke, Konrad hat versucht, JeroenHoek über die Integration von PowerMock in TestNG zu kommentieren, da er anscheinend nicht über das Privileg "Kommentar" verfügt. Ich
gehe
1
Diese Antwort versteht falsch, was PowerMock ist. Es ist kein Ersatz für Mockito, sondern eine Ergänzung, die es Mockito ermöglicht, bestimmte Dinge zu verspotten, die Mockito allein nicht kann (statische Methoden, Abschlussklassen).
Stickfigure
0

In einer Nussschale..

Wenn sich Ihr Geltungsbereich auf detaillierte Komponententests ohne dazwischen liegende Abhängigkeiten beschränkt, kann JUnit verwendet werden.

Wenn für Ihren Bereich Funktionstests erforderlich sind, für die möglicherweise Abhängigkeiten und die gemeinsame Nutzung von Daten (Parametern) zwischen Tests erforderlich sind, wählen Sie TestNG aus. Außerdem kann TestNG Unit-Tests ähnlich wie JUnit durchführen. Sie können also eine Reihe von Komponententests und eine Reihe von Funktionstests durchführen.

Nabster
quelle