Name

TestNG

Homepage

TestNG.org

Lizenz

Apache 2.0 Lizenz

Untersuchte Version

TestNG in Version 5.8 und das Eclipse-Plugin in Version 5.8.0.2 auf Eclipse 3.4.1

Letzter Untersuchungszeitpunkt

30.05.2012

Kurzbeschreibung

TestNG ist ein Frameset zum Erstellen von Unittests. Damit ist es ein direkter Konkurrent zu dem etablierten JUnit. In dieser Funktion soll es dem Nutzer möglichst einfach erlauben, seine Software mit extra dafür geschriebenen Methoden auf Korrektheit zu überprüfen.

Fazit

TestNG kann die Tests von JUnit größtenteils mit kleinen Modifikationen im Paketnamen ausführen. Eine echte Bereicherung ist die angenehm kurze Notation, mit der sich Exceptions fangen und überprüfen lassen. Im Gegensatz zu JUnit 3 und vergleichbar zu JUnit 4 werden bei TestNG viele Einstellungen und Anweisungen zu den Tests über die @-Notation vor Methoden übergeben. Zu beachten ist aber, dass sich das Werkzeug mit seiner Dokumentation eindeutig an Leute richtet, die schon Erfahrung im Arbeiten mit Unittests haben. Anfänger suchen sich besser eine JUnit-Einführung aus dem Internet.

Einsatzgebiete

Durch Unittests kann das korrekte Arbeiten von Methoden in Java überprüft werden, weiterhin können Komponenten und White-Box-Tests geschrieben werden.

Einsatzumgebungen

Als Plugin für Eclipse, IDEA und Maven, sowie als Standalone über Ant oder von Hand.

Installation

Die Installation des Eclipse-PlugIns ist direkt über den Eclipse-eigenen PlugIn-Manager möglich. Hierzu muss, wie auf der Projektseite angegeben im "Software-Updates"-Bereich von Eclipse mit "Add Site" die Quelle http://beust.com/eclipse/ hinzugefügt werden. Dabei wird die benötigte Jar-Datei allerdings nicht mitinstalliert. Diese muss von Hand heruntergeladen und als External-Jar dem Projekt hinzugefügt werden. Von der Homepage ist auch der Quellcode unter der Apache 2.0 Lizenz verfügbar. Die neuste (Unstable-) Version ist auf einer extra Seite verfügbar, die bei Google-Code gehostet wird. Hier ist auch das SVN Repository zu finden. Das Ganze ist äußerst unübersichtlich.

Dokumentation

Die Dokumentation ist nur in Englisch verfügbar und teilt sich auf in eine Kurzeinführung, eine eher knappe Dokumentation und eine aus JavaDoc erstellte API-Dokumentation. Es ist ebenfalls möglich, ein (englischsprachiges) Buch zu kaufen, das von den drei TestNG Entwicklern geschrieben wurde. Die Kurzeinführung beschränkt sich darauf, zu zeigen, wie man seine JUnit-Tests nach TestNG portiert. Weitere Informationen zur Installation oder Ähnlichem sucht man hier vergebens.
Die eigentliche Dokumentation beschreibt zwar den Umgang mit TestNG recht umfassend, erwähnt aber keinerlei Grundlagen zum Thema Unit-Tests. Um hier weiterzukommen, ist es unabdingbar, schon einmal (J)Unit-Tests durchgeführt oder eine andere Informationsquelle zur Hand zu haben. Die Anwendungsbeispiele sind nicht wirklich gut gewählt, oft zeigen sie zwar einen Teilaspekt, verschweigen aber einen anderen. Die API-Dokumentation verrät nur wenig über die implementierten Methoden. Oftmals beschränkt sich die Beschreibung darauf, die Methodennamen umzustellen und Satzzeichen einzufügen.
Das Buch lag zur Überprüfung nicht vor und floss daher nicht in die Bewertung mit ein.

Wartung der Projektseite

Die eigentliche Projektseite ist knapp und übersichtlich gehalten, einzig der Downloadlink ist ein wenig unauffällig platziert. Die Seite wird augenscheinlich fortlaufend aktualisiert, ebenso wie das Projekt selbst. Schlecht gelöst ist das Hosting der Entwicklerversionen. Diese befinden sich auf unübersichtlichen Google-Code Seiten, die sich auch nicht in das Look&Feel der restlichen Seite einfügen.

Nutzergruppen und Support

Zu dem Projekt finden sich zwei GoogleGroups, eine für Entwickler, eine für User. Die User-Gruppe ist nur über eine Anmeldung mit Email-Adresse zu erreichen. Für Nichtangemeldete ist es demnach nicht möglich, nach einer Lösung zu suchen. Die Email-Adressen mancher Entwickler sind angegeben, aber nicht von allen.

Intuitive Nutzbarkeit

Das Eclipse-PlugIn ist sehr einfach zu nutzen. Es muss nur eine neue Start-Konfiguration vom Typ TestNG für das Projekt angelegt werden. Danach kann man noch darüber Einschränkungen festlegen, welche Tests ausgeführt werden sollen (alle Tests aus einer Klasse, eine bestimmte Gruppe von Tests oder Tests, welche in einer XML Datei spezifiziert wurden). Das Erstellen dieser Tests ist schon weit weniger intuitiv. Wer schon mit JUnit gearbeitet hat, wird sich hier sehr schnell zurecht finden, wer noch nichts dergleichen getan hat, fühlt sich recht schnell alleine gelassen.

Automatisierung

Für die Erstellung von Tests gibt es keine Automatisierungen. Das Ausführen wird durch das Anlegen von Test Suites stark beschleunigt. Hier werden alle Tests oder auch nur die Klassen, welche die Tests enthalten, eingefügt. Anschließend muss beim Ausführen nur noch die XML Datei , die die Suite-Beschreibungen enthält, abgearbeitet werden.
ANT
Die Automatisierung des Frameworks TestNG lässt sich durch einen externen Task in Ant ausführen. Der externe Task muss nicht selber entwickelt werden, sondern wird von dem TestNG Hersteller geliefert. Dazu muss der Task wie folgt in dem build.xml File definiert werden. < taskdef resource="testngtasks" classpath="${lib}/testng-5.14.1.jar"/> Der CLASSPATH zeigt dabei auf das Verzeichnis in dem sich das Jar-Archiv befindet. Bei dem Jar-Archiv handelt es sich um das gleiche Archiv, das zum Testen der Klassen in Eclipse mit eingebunden werden muss.
Der TestNG-Task wird ähnlich zu den Tasks für JUnit angelegt. Das umgebende Element heißt in diesem Fall < testng>. Dazu werden unterschiedliche Konfigurationsmöglichkeiten angeboten, sodass eine bestimmte Gruppe von Tests, einzelne Tests oder ganze Suiten ausgeführt werden können. Weiterhin besteht, wie bei JUnit die Möglichkeit bei einem fehlerhaften Test den Build-Prozess zu unterbrechen. Die Auswertung der Ergebnisse wird in einem frei wählbaren Ordner in Form von HTML-Seiten gespeichert. Zudem bietet TestNG auch die Möglichkeit bestimmte Laufzeitbeschränkungen für die Tests zu definieren, wie auch die Anzahl der Threads die bei der Testdurchführung verwendet werden sollen. Zu beachten ist allerdings, dass die XML-Dateien beim Kompilieren der Sourcen mit in das Build-Verzeichnis kopiert werden. Dies ist allerdings mit einem einfachen Kopierbefehl in Ant möglich.
Eine Beispielautomatisierung ist hier zu finden.
Maven
Die Automatisierung von TestNG Testfällen mit Hilfe von Maven ist möglich. Maven bietet von zu Haus aus schon eine Unterstützung von TestNG an. Dazu werden bestehende Maven-Plugins in die Konfigurationsdatei pom.xml eingebunden. Die Reports der Ausführungen werden unter dem Target-Ordner im Verzeichnis surefire-reports gespeichert und können somit zu einem späteren Zeitpunkt analysiert werden. Die Ausführung von einzelnen Tests, wie auch die Ausführung von ganzen Suiten wird mittels TestNG festgelegt und kann somit auch mit Hilfe von Maven ausgeführt werden. Eine genaue Steuerung wird dadurch ermöglicht.
Ein einfaches Automatisierungsbeispiel ist hier zu finden.
Vergleich Ant und Maven
Im Vergleich sind beide Unterstützungen leicht in das jeweilige build-Werkzeug zu integrieren. Die Dokumentation der Tasks bzw. Plugins sind verständlich und aktuell. Zudem bietet der Hersteller für Ant einen eigenentwickelten Task und für Maven das jeweilige Plugin an.

Einführendes Beispiel

Folgende drei Programme sollen getestet werden, indem die verschiedenen Rückgabewerte und Exceptions mit Hilfe von TestNG aufgefangen und geprüft werden: Fakultaet Fibonacci WahrFalsch

Die in der Java-Datei TestNGTests.java vorliegenden Tests sollen nun an o.g. Programmen durchgeführt werden. Diese werden auch in einer XML-Datei als "Test-Suite" zusammengefasst um ein einfaches, übersichtliches Ausführen aller Tests zu gewährleisten.

(Das gesamte Eclipse-Projekt kann hier heruntergeladen werden)

Die Art des Testdurchlaufs wird über den Eclipse-eigenen Run-Konfigurationsmanager bestimmt.
Hier können drei verschiedene Testlaufarten ausgewählt werden
Über die "Browse..."-Buttons können die jeweiligen Einträge zudem komfortabel zusammengestellt werden:

Picture1

Nach Fertigstellung der gewünschten Konfiguration, kann der Test über das "Ausführen"- bzw. "Run"-Button gestartet werden.
Ist dieser Test abgearbeitet, bekommt man folgende Kurzauswertung zu sehen:

Picture2


Auf der Konsole erscheint zusätzlich folgender Statusbericht, welcher ebenfalls Auskunft über den Erfolg des Testlaufs gibt:

[Parser] Running:
  /home/alind001/workspace/TestNG_Project/temp-testng-customsuite.xml

Beide Wahr
a oder b Wahr
a oder b Wahr
PASSED: NichtBeideWahr
PASSED: TestFibr
PASSED: TestFak5i
PASSED: NichtsWahro
PASSED: BeideWahr
PASSED: NichtsWahr
PASSED: NichtBeideWahro
PASSED: BeideWahro
PASSED: TestFak5r
PASSED: TestFibi

===============================================
    testng.tests.TestNGTests
    Tests run: 10, Failures: 0, Skips: 0
===============================================


===============================================
TestNG_Project
Total tests run: 10, Failures: 0, Skips: 0
===============================================

Zusätzlich versteckt sich hinter dem "Welt-Symbol" in der TestNG-Ansicht noch ein ausführlicher Testbericht in HTML:

[test-output.tar.gz]

TestSuite

Mit einer TestSuite können einzelne Testklassen zusammengefasst werden. Einzelne Tests können gemeinsam durchgeführt werden und andere nicht. Dadurch ist es möglich, das Testen besser zu strukturieren. Zusammengehörige Testfälle können gruppiert werden und durch einen Klick ausgeführt werden.

Einführendes Beispiel

In dem vorliegendem Beispiel werden die einzelnen Methoden (Plus, Minus, Mal, Verdopple) der Klasse Taschenrechner getestet. Durch das Zusammenfassen der Plus und Minus- Tests in eine eigene TestSuite(namens: testeAlles), können diese gleichzeitig mit einem Knopfdruck auf “Run” ausgeführt werden. Dazu wird eine XML-Datei erstellt, die Informationen über alle Klassen enthält, die getestet werden sollen. Diese Datei wird anschließend ausgeführt. Somit könnte ein Programm das beispielsweise unter Linux und Windows laufen soll, eine XML Datei enthalten die nur die jeweiligen Tests für Linux enthält und eine andere XML Datei die nur die Windows Tests enthält.

Projekt zum Download:

Taschenrechner.zip

Die Klasse Taschenrechner.java beinhaltet die Methoden die getestet werden sollen. (plus, minus, mal und verdopple)
public class Taschenrechner {


	public static void main(String[] args){
	}
	
	public static int plus(int zahl1,int zahl2){
		return zahl1+zahl2;
	}
	
	public static int minus(int zahl1,int zahl2){
		return zahl1-zahl2;
	}
	
	public static int mal(int zahl1,int zahl2){
		return zahl1*zahl2;
	}
	
	public static int verdopple(int zahl1){
		return zahl1*2;
	}
}
Jede Methode vom Taschenrechner bekommt eine TestNG-Testklasse.
Der Unterschied zu JUnit ist der, dass hierbei die nötigen Annotationen von TestNG importiert werden. Dies kann zumindest mit Eclipse mit einem Rechtsklick auf in der Testklasse unter QuickFix und dann mit Convert to TestNG(Annotations) automatisch von erzeugt werden.

convert to



import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.AssertJUnit;
public class PlusTest { @BeforeMethod public void setUp() { } @Test public void testPlus1() { Taschenrechner t = new Taschenrechner(); AssertJUnit.assertTrue(t.plus(2,5)==7); } @Test public void testPlus2() { Taschenrechner t = new Taschenrechner(); AssertJUnit.assertTrue(t.plus(0,5)==5); } @Test public void testPlus3() { Taschenrechner t = new Taschenrechner(); AssertJUnit.assertTrue(t.plus(2,3)==5); } }
Diese Klasse beinhaltet einige Tests die die Methode Plus auf Korrektheit überprüfen. Die Test-Klassen für die anderen Methoden werden auch angelegt:

• MinusTest
• MalTest
• VerdoppelTest

Alle Tests einzeln auszuführen ist etwas aufwändig und unübersichtlich.
An diesem Punkt kommt die TestSuite von TestNG zum Einsatz.
Dazu wird lediglich eine XML-Datei in das Projekt eingefügt die folgendes enthält.
xmlcode

Inhaltlich steht in der XML File lediglich wie die Test Suite heißt und welche Testklassen
benutzt werden sollen. Um den Test auszuführen, startet man die XML-Datei unter Eclipse und erhält
folgendes Ergebnis wenn alle Tests korrekt durchlaufen werden.

testdurchlaufen

Gruppieren

Eine weitere Möglichkeit die Tests zu strukturieren ist,
wenn man in den jeweiligen Tests Gruppen erstellt.
Also beispielsweise in der Klasse PlusTest die Gruppenzuweisung (groups={"testePlus"}) anfügen.
Damit wird in diesem Test festgehalten, das er von nun an zu der Gruppe testePlus gehört.

	@Test 	public void testPlus1() {
		Taschenrechner t = new Taschenrechner();
		AssertJUnit.assertTrue(t.plus(2,5)==7);
	}

 
	@Test(groups={"testePlus"})
	public void testPlus1() {
		Taschenrechner t = new Taschenrechner();
		AssertJUnit.assertTrue(t.plus(2,5)==7);
	}
Hat man jede Methode mit der jeweiligen Gruppenzugehörigkeit bearbeitet so ergibt
sich unter den Run-Konfigurationen und bei Groups unter Browse die Möglichkeit sich
zu entscheiden, welche Tests ausgeführt werden sollen.

gruppen

zu entscheiden welche Tests ausgeführt werden sollen.

Detaillierte Beschreibung

Auf der TestNG.org Seite befindet sich ein Verzeichnis mit diversen Seiten zum Thema TestNG
http://testng.org/doc/misc.html

Literatur

(Buch der TestNG Entwickler: http://testng.org/doc/book.html)

Zurück zur Werkzeugübersicht
Zurück zur CSI-Hauptseite