Einführung in Unit Tests mit TestNG unter Eclipse
Unit Tests sind vielen Entwicklern ein Begriff und in der Java Welt verbindet man diesen Begriff fast automatisch mit dem Testframework JUnit. Dabei steht als genereller Gedanke hinter Unit Tests einzelne kleine Teilbereiche (Units, Methoden, Funktionen) atomar und unabhängig von einer Umgebung und Abhängigkeiten zu testen. Man geht davon aus, dass wenn die einzelnen kleinen Teile eines Systems in Ihrerer Aufgabe funktionieren und diese korrekt tun das große Ganze auch Bestand hat. Dabei gelten nur die Zustände: Erfolg oder Fehler.
In diesem und folgenden Artikeln soll es um den JUnit Konkurrenten TestNG gehen. Das Testframework TestNG ist laut seinem Entwickler Cédric Beust aus der JUnit Frustration entstanden und das NG in TestNG bezieht sich auf Next Generation.
Wer diese Frustration nachlesen möchte kann dies hier und hier tun.
Nicht nur wegen dieser Aussage soll TestNG ein wenig näher begutachtet werden. Wer z.B. mit JBoss Seam arbeitet wird sehr schnell merken, dass Seam von Haus aus eine TestNG Unterstützung mitbringt. Auch andere Frameworks setzen auf TestNG. Aber auch ohne diese Frameworks bietet TestNG eine sehr gute Alternative zu dem schon genannten JUnit.
Das Ziel dieses ersten TestNG Artikels ist einfache TestNG Unit-Tests zu erstellen und aus Eclipse heraus ausführen zu können. In folgenden Artikeln wird es mehr in die Möglichkeiten von TestNG und in die Konfiguration von Tests und Testsuites gehen.
Um TestNG zu verwenden muss die aktuelle Version heruntergeladen werden. Zur Zeit ist die aktuellste Version 5.8 und kann hier direkt heruntergeladen werden.
Es besteht auch eine Eclipse Unterstützung für TestNG, die über eine Update Seite installiert werden kann. Dazu unter Eclipse 3.4 (Ganymede) über “Help->Software Updates…->Available Software Tab->Add Site…” klicken, die TestNG Update Site URL http://beust.com/eclipse angeben und mit “OK” bestätigen. Anschließend das neu hinzugefügte Element aufklappen, das Plugin TestNG selektieren und den Button “Install” drücken.
Bei der Installation den Anweisungen folgen. Es kam bei mir ab und an vor, dass bei der Bestätigung für die zu installierende Software nur ein leeres Fenster auftrat – da einfach mit “OK” weiter klicken.
Nach dem Neustart von Eclipse steht eine TestNG View zur Verfügung und kann geöffnet werden.
Um TestNG aus Eclipse heraus verwenden zu können müss die TestNG Bibliothek noch im Classpath referenziert werden. TestNG liefert zwei jars aus: eine für Java 1.4 (testng-5.8-jdk14.jar) und eine für Java 5 (testng-5.8-jdk15.jar). Beide liegen im heruntergeladenen TestNG.zip im Root Verzeichnis oder alternativ im TestNG Eclipse Plugin Ordner (eclipse\plugins\org.testng.eclipse_5.8.0.2\lib). In meinem Fall kopiere ich mir das testng-5.8-jdk15.jar in meinen im Projekt erstellten lib Ordner und gebe dieses im Projekt Classpath an (Rechte Maustaste auf den Projekt Ordner->Properties->Java Build Path).
Als Beispielprojekt bzw. Beispiel Source Code der getestet werden soll habe ich ein Java Projekt mit zwei Source Ordnern erstellt. Ich persönlich mag es lieber, wenn die Testklassen in einem getrennten Source Ordner liegen. So besteht bei mir der Source Ordner: src und test sowie ein normaler Ordner für die benötigten Java Bibliotheken lib. Unterhalb der zwei Source Ordern erstelle ich zweimal das gleiche Package. Anschließend in dem Ordner src die Klasse de.javathreads.util.Calc und in den Ordner test die Klasse de.javathreads.util.CalcTest. Nach getaner Arbeit sieht die Projektstruktur wie folgt aus:
Nun schauen wir uns den Source Code der zwei Klassen etwas genauer an. Die Klasse de.javathreads.util.Calc beinhaltete die einfachen Methoden add() und divide():
package de.javathreads.util; public class Calc { public int add(int first, int second) { return fist + second; } public double divide(int first, int second) { if (second == 0) { throw new ArithmeticException(); } return first / second; } }
Um mit TestNG eine Methode zu definieren die den eigentlichen Unit-Test enthält wird diese mit der Annotation org.testng.annotations.Test versehen. Um abzuprüfen ob das Ergebnis dem erwarteten Ergebnis entspricht arbeitet TestNG mit Java Assertions und dem Schlüsselwort assert. Das sieht dann in meiner CalcTest Klasse, welche die Methode Calc.divide() testen soll, wie folgt aus:
package de.javathreads.util; import org.testng.annotations.Test; public class CalcTest { /** * Test für simples dividieren. */ @Test public void divideSimple() { Calc c = new Calc(); double sum = c.divide(4, 2); assert (sum == 2); } /** * Test für Division durch 0. */ @Test public void divideByZero() { Calc c = new Calc(); try { c.divide(4, 0); } catch (ArithmeticException ex) { assert (true); return; } assert (false); } }
Bei einer Prüfung mit dem Schlüsselwort assert muss der Ausdruck immer true ergeben. Mehr zu Java Assertions kann auch in dem javathreads Artikel “Reservierte Schlüsselwörter in Java – Assertions” sowie im Java Blog Buch gefunden werden.
Durch das TestNG Eclipse Plugin ist ein Unit Test sehr einfach durch das Context-Menü direkt aus dem Package Explorer heraus zu starten. Dazu mit der rechten Maustaste direkt auf die Klasse klicken welche die mit @Test annotierten Methoden enthält und anschließend unterhalb des Menüpunkts “Run As” den Punkt “TestNG Test” anklicken:
Es ist auch möglich auf ein Package zu klicken und somit alle darin liegenden Testklassen zu starten.
Nach einem oder mehreren durchlaufenen Unit-Tests wird das Ergebnis in der TestNG View farblich hervorgehoben. Dabei wird farblich gezeigt ob generell alle Test positiv waren (grün) oder mindestens einer fehlgeschlagen ist (rot). Im folgenden ein Screenshot für den Fall das alle Tests positiv waren:
Ist mindestens ein Test fehlgeschlagen wird der Balken schön rot und man die fehlgeschlagene Methode erkennt man durch das rote Kreuz. Selektiert man diesen Test erhält man im rechten Fenster die Exception zu dem Fehler. Bei TestNG sind das immer java.lang.AssertionError, wie man im folgenden Screenshot sehen kann:
Mit einem Doppelklick auf die Methode gelangt man direkt in den Java Editor an die gewünschte Stelle der Testklasse. Es wäre nun auch möglich den Test im Debug Modus zu starten. Dazu anstatt “Run As” einfach den Test mit “Debug As” starten. Dabei natürlich nicht vergessen einen Breakpoint zu setzen ;).
In der Console können noch die Logausgaben und auch das Gesamtergebnis begutachtet werden. Treten Exceptions in der zu testenden Klasse auf sind diese auch in der Konsole sichtbar. Im folgenden die Konsolenausgabe des Positiven Tests:
D:\Projekte\Ganymede\02_src\01_trunk\JavaTestNGProject\temp-testng-customsuite.xml
PASSED: divideSimple
PASSED: divideByZero
===============================================
de.javathreads.util.CalcTest
Tests run: 2, Failures: 0, Skips: 0
===============================================
Als letzte Information zu dieser kleinen Einführung noch der Hinweis, dass TestNG immer mit XML Konfigurationsdateien arbeitet. Der Vorteil wenn das TestNG Eclipse Plugin verwendet wird liegt darin, dass dieses Plugin die XML Datei generiert. Aktualisiert man im Package View das Projekt (Projekt selektieren und F5 drücken) erscheint die Datei temp-testng-customsuite.xml:
Schaut man in diese Konfigurationsdatei rein sieht man wie der einfachste Fall eines TestNG Tests vie XML konfiguriert werden kann. Die Testklasse wird direkt angegeben:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="JavaTestNGProject">
<test verbose="2" name="de.javathreads.util.CalcTest" annotations="JDK">
<classes>
<class name="de.javathreads.util.CalcTest"/>
</classes>
</test>
</suite>
Man kann natürlich auch eine solche XML Konfigurationsdatei manuell erstellen und via Eclipse Kontextmenü als TestNG Test ausführen. Dazu legt man sie einfach mit im Test-Source Verzeichnis ab.
In diesem Artikel wurde gezeigt wie man TestNG in Eclipse einbindet und das Eclipse Plugin verwenden kann. Zudem wurde ein sehr einfacher Test geschrieben und ausgeführt. Grundsätzlich ist man nun also in der Lage Tests zu schreiben und diese auch auszuführen, was den ein oder anderen schon deutlich weiter bringen dürfte ;).
Im nächsten Artikel über TestNG wird mehr auf die Möglichkeiten mit TestNG eingegangen. Welche Annotationen gibt es und wie kann man sie einsetzen bzw. wo liegen die Vorteile.
Wenn du Fragen oder Anregungen zum Post hast, dann hinterlasse doch ein Kommentar oder wenn du weiterhin Artikel von Javathreads lesen möchtest, dann abonniere den RSS Feed und sehe direkt in deinem Feed Reader die nächsten Artikel.















Hi Markus,
danke für deinen Artikel, ich finde es sehr schön erklärt.