JUnit 4 und TestNG waren früher vergleichbar. Was sind die Vor- und Nachteile der beiden Test-Frameworks?
JUnit 4 und TestNG waren früher vergleichbar. Was sind die Vor- und Nachteile der beiden Test-Frameworks?
Antworten:
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, PowerMockTestCase
wenn 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.xml
Suite-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.
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 @BeforeClass
Methoden 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 @Test
in testng markieren, was bedeutet: Jede öffentliche Methode ist ein Test. In Junit müssen Sie @Test
jede 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.
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.
Wenn Sie an einem Java / Scala-Projekt arbeiten und Gradle das Build-Tool Ihrer Wahl ist, denken Sie daran, dass das ScalaTest
Framework nur JUnitRunner
Ihre Scala-Tests ausführen muss. Mit anderen Worten, Sie haben die Wahl:
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.
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.