TestNG
TestNG.org
Apache 2.0 Lizenz
TestNG in Version 5.8 und das Eclipse-Plugin in Version 5.8.0.2 auf Eclipse 3.4.1
30.05.2012
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.
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.
Durch Unittests kann das korrekte Arbeiten von Methoden in Java überprüft werden, weiterhin können Komponenten und White-Box-Tests
geschrieben werden.
Als Plugin für Eclipse, IDEA und Maven, sowie als Standalone über Ant oder von Hand.
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.
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.
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.
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.
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.
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.
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.
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.
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
- Class: Ausführen einer einzelnen Testklasse, z.B. "TestNGTests".
- Groups: Auswahl beliebig vieler Testgruppen innerhalb der vorhandenen Testklassen, z.B. "Fibonacci WahrFalsch".
- Suite: Angabe einer XML-Datei, welche mehrere Testklassen als Suite zusammenfassen kann.
Über die "Browse..."-Buttons können die jeweiligen Einträge zudem komfortabel zusammengestellt werden:
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:
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.
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.
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.
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.
zu entscheiden welche Tests ausgeführt werden sollen.
Auf der TestNG.org Seite befindet sich ein Verzeichnis mit diversen Seiten zum Thema TestNG
http://testng.org/doc/misc.html
(Buch der TestNG Entwickler: http://testng.org/doc/book.html)
Zurück zur Werkzeugübersicht
Zurück zur CSI-Hauptseite