# TestNG

TestNG ist ein Framework zum Testen von Java-Programmen, das besonders für automatisierte Unit-Tests einzelner Units (Klassen oder Methoden) geeignet ist. Es baut auf bekannten Konzepten aus JUnit und NUnit auf, ergänzt diese aber durch neue Funktionalitäten.

## Neue Funktionalitäten

TestNG enthält einige Funktionalitäten, die bei den meisten anderen Vertretern von xUnit-Frameworks nicht vorhanden sind:
Mit TestNG lassen sich bestimmte Teile einer Applikation hinsichtlich Nebenläufigkeit testen, indem man deren Tests in parallelen Threads ablaufen lässt. Dafür ist es mit TestNG einerseits möglich, die Tests bestimmter Testsuiten mit beliebig vielen Threads gleichzeitig laufen zu lassen. Unterschiedliche Vorgangsweisen können dafür je Testsuite bestimmt werden: alle Testmethoden in einem eigenen Thread, alle gleich getaggten Testmethoden in einem eigenen Thread, alle Testmethoden der gleichen Testklasse in einem eigenen Thread und alle Testmethoden der gleichen Instanz der Testklasse in einem eigenen Thread. Andererseits ist es je Testmethode möglich zu bestimmen, dass sie mehrmals und von verschiedenen Threads aufgerufen werden soll.
TestNG ermöglicht eine flexible Gruppierung der Tests und Testmethoden mittels XML-Konfiguration oder Annotationen. Damit können beispielsweise Tests für unterschiedliche Teststufen (wie z. B. Modultests, Integrationstests, Akzeptanztests) oder auch Testumgebungen ausgewählt werden. Gruppen können auch mittels Regulären Ausdrücken gewählt, zu anderen Gruppen wieder zusammengefasst oder auch exkludiert werden.
Testmethoden können in TestNG mittels Parameter gesteuert werden. Dies ist sowohl mittels XML-Konfiguration als auch mittels Annotationen möglich. Die Parameter können direkt übergeben oder mittels sogenannter DataProvider zur Laufzeit erzeugt werden. Damit ist es möglich, zum Ausführungszeitpunkt der Tests auf die Laufzeitumgebungen der Tests Rücksicht zu nehmen. Die DataProvider können für eine Testmethode auch unterschiedliche Daten liefern, diese führen dann zu mehreren Testläufen einer Testmethode mit unterschiedlichen Daten. Somit ist es mit TestNG möglich, datengetriebene Testläufe durchzuführen. Damit kann einfach die Datenabdeckung der Tests erhöht werden. Die Annotation @Factory bietet weitere Möglichkeiten, um zur Laufzeit mehrere unterschiedliche Instanzen eines Tests laufen zu lassen.
TestNG generiert Testreports im HTML- und XML-Format. Ab der Version 4.6 besitzt TestNG auch eine Programmierschnittstelle für Reporting. Damit können weitere Report-Generatoren wie beispielsweise ReportNG oder TestNG-XSLT, verwendet werden.

## Verwendung

Eine Testklasse kann unter TestNG wie folgt aussehen:
Dabei gibt es einige hilfreiche Annotationen, wie beispielsweise @BeforeSuite | @AfterSuite | @DataProvider
Eine Testsuite kann über ein XML-Dokument zusammengestellt werden

## Toolunterstützung

TestNG wird von einer Reihe von Entwicklungswerkzeugen entweder direkt oder mittels Plugins unterstützt. Alle wichtigen Java Entwicklungsumgebungen, Eclipse, IntelliJ IDEA und NetBeans IDE unterstützen TestNG. Weiters wird es auch von allen wichtigen JavaBuild-Management-Tools, Apache Maven, Apache Ant und Gradle unterstützt. Systeme zur kontinuierlichen Integration wie Hudson und Jenkins unterstützen ebenfalls TestNG und können Testergebnisse über die Zeit darstellen. Viele Werkzeuge zur Messung der Testabdeckung wie beispielsweise Cobertura unterstützen ebenfalls TestNG.