Was ist TestNG?
TestNG ist ein Java-Test-Framework mit Annotationen, Gruppen, Data Providern und Parallelläufen. So funktioniert es, Vergleich mit JUnit 5, Fehler.
Was ist TestNG?
TestNG ist ein quelloffenes Java-Test-Framework, inspiriert von JUnit und NUnit. Tests und Setup-Code werden mit Annotationen markiert; dazu kommen Gruppen, Data Provider, Testabhängigkeiten und parallele Ausführung. Es deckt Unit-, Funktions-, End-to-End- und Integrationstests ab und ist deshalb in Selenium-UI-Suiten weit verbreitet. Der Name steht für Test Next Generation.
So funktioniert TestNG
Ein Test ist eine mit @Test annotierte Methode in einer normalen Java-Klasse. Setup und Teardown laufen über Konfigurationsannotationen auf verschiedenen Ebenen: @BeforeSuite, @BeforeTest, @BeforeClass und @BeforeMethod, jeweils mit einem @After...-Gegenstück. Gestartet werden die Tests aus der IDE, über Maven oder Gradle oder über eine testng.xml, die festlegt, welche Klassen, Pakete oder Gruppen laufen.
import org.testng.annotations.*;
import static org.testng.Assert.*;
public class CalculatorTest {
private Calculator calc;
@BeforeMethod
public void setUp() { calc = new Calculator(); }
@Test(groups = {"smoke"})
public void addsTwoNumbers() {
assertEquals(calc.add(2, 3), 5);
}
@Test(dataProvider = "divisions")
public void divides(int a, int b, int expected) {
assertEquals(calc.divide(a, b), expected);
}
@DataProvider
public Object[][] divisions() {
return new Object[][] { {10, 2, 5}, {20, 4, 5}, {100, 10, 10} };
}
}Jedes @BeforeMethod läuft vor jedem Test, und der Data Provider übergibt drei Eingabesätze an divides, sodass der Report aus einer Methode drei Testergebnisse zeigt.
Wichtige TestNG-Funktionen
- Gruppen: Mit
@Test(groups = {"smoke"})markieren Sie einen Test und wählen die Gruppen in dertestng.xmlaus, zum Beispiel Smoke-Tests bei jedem Commit und alles nachts. - Abhängigkeiten:
dependsOnMethodsführt einen Test nach den genannten Methoden aus. Schlägt eine davon fehl, gilt der abhängige Test als SKIP statt FAIL, außer Sie setzenalwaysRun=true. - Data Provider:
@DataProviderführt eine Testmethode mit vielen Eingaben aus. Mitparallel = trueam Provider laufen diese Aufrufe parallel. Ein durchgängiges Beispiel finden Sie unter DataProvider in TestNG verwenden. - Retry-Analyzer: Implementieren Sie
IRetryAnalyzerund binden Sie ihn mit@Test(retryAnalyzer = ...)ein, um fehlgeschlagene Tests zu wiederholen. - Listener: Sie reagieren auf Teststart, Erfolg und Fehler, etwa um bei einem fehlgeschlagenen UI-Test einen Screenshot zu speichern.
- JUnit-Kompatibilität: TestNG kann JUnit-3- und JUnit-4-Tests ausführen, was bei einer schrittweisen Migration hilft.
TestNG-Tests parallel ausführen
Parallelität wird an der Suite in der testng.xml eingestellt. Das Attribut parallel bestimmt, welche Einheit einen eigenen Thread bekommt, und thread-count legt fest, wie viele Threads zur Verfügung stehen:
methods: Jede Testmethode läuft in einem eigenen Thread.tests: Jeder<test>-Block bekommt einen Thread, seine Methoden teilen ihn sich.classes: Jede Klasse bekommt einen Thread.instances: Methoden derselben Instanz teilen sich einen Thread, verschiedene Instanzen können nebeneinander laufen.
<suite name="Regression" parallel="methods" thread-count="4">
<test name="Smoke">
<groups><run><include name="smoke"/></run></groups>
<packages><package name="com.example.tests"/></packages>
</test>
</suite>Parallele Data Provider nutzen einen eigenen Pool, gesetzt über data-provider-thread-count (Standard: 10). Parallele Läufe helfen nur, wenn die Tests voneinander unabhängig sind. Bei Selenium gehört pro Thread genau ein WebDriver, zum Beispiel in einem ThreadLocal.
TestNG und JUnit 5 im Vergleich
Beide sind ausgereift und arbeiten mit Maven, Gradle, Selenium und REST Assured zusammen. Die Unterschiede liegen darin, was eingebaut ist:
- Suiten und Gruppen: TestNG liefert
testng.xmlundgroupsmit. JUnit 5 nutzt@Tagund Filter des Build-Tools. - Abhängigkeiten zwischen Tests: TestNG unterstützt sie. JUnit 5 verzichtet bewusst darauf und lenkt so zu unabhängigen Tests.
- Parametrisierte Tests:
@DataProviderin TestNG,@ParameterizedTestin JUnit 5. - Parallele Ausführung: in TestNG Teil der Suite-Konfiguration. JUnit 5 kann ebenfalls parallel laufen, per Konfiguration aktiviert.
Für neue Unit-Tests funktioniert beides; richten Sie sich nach dem Tooling Ihres Teams. Beide in einem Projekt zu mischen ist möglich, sorgt aber für Verwirrung.
Häufige TestNG-Fehler
- Gemeinsamer Zustand zwischen Tests. Ein Test, der allein besteht und in der Suite scheitert, verlässt sich meist auf ein statisches Feld, das ein anderer Test verändert hat.
- Ein WebDriver für alle Threads. Das funktioniert seriell und bricht an dem Tag, an dem Sie
paralleleinschalten. - Lange
dependsOnMethods-Ketten. Ein Fehler überspringt alles Nachfolgende und verdeckt die eigentliche Ursache. - Feste Wartezeiten.
Thread.sleep(5000)bremst die Suite und bleibt trotzdem instabil. Warten Sie stattdessen auf eine explizite Bedingung. - Unbegrenzte Wiederholungen. Wer einen instabilen Test wiederholt, bis er besteht, versteckt echte Fehler. Begrenzen Sie Wiederholungen auf ein bis zwei und untersuchen Sie jeden Test, der sie braucht.
- Eine
testng.xml, die jeden Test einzeln aufführt. Verweisen Sie auf Pakete und Gruppen und lassen Sie TestNG die Klassen finden.
TestNG, Regressionstests und Performance
TestNG beantwortet die Frage "Verhält sich das noch korrekt?", also die Aufgabe von Regressionstests. Wie sich das System unter vielen gleichzeitigen Nutzern verhält, sagt es nicht. Dafür braucht es Lasttests, und für Java-Systeme ist das übliche Werkzeug JMeter. LoadFocus führt vorhandene JMeter-Skripte unverändert aus 25 Cloud-Regionen aus, und API-Monitoring prüft im Betrieb Statuscodes, Antwortinhalte und Latenz nach Zeitplan. TestNG-Tests, Lasttests und Monitore decken unterschiedliche Fehlerarten ab, keines ersetzt die anderen.
Häufige Fragen: TestNG
Sollte ich für ein neues Projekt TestNG oder JUnit 5 verwenden?
Beides ist eine solide Wahl. TestNG bringt Suite-Dateien, Gruppen, Abhängigkeiten und Parallel-Einstellungen von Haus aus mit, was zu großen Selenium-Suiten passt. JUnit 5 eignet sich gut für reine Unit-Tests. Nehmen Sie, was Ihr Team und Ihr Build ohnehin nutzen.
Wird TestNG noch gepflegt?
Ja, TestNG 7.x wird weiter veröffentlicht. Ab Version 7.6.0 ist JDK 11 oder neuer nötig, 7.5 und älter laufen auf JDK 8. Die aktuelle Version finden Sie auf der TestNG-Website oder bei Maven Central.
Wie führe ich TestNG-Tests parallel aus?
Setzen Sie parallel und thread-count an der Suite in der testng.xml, zum Beispiel <suite parallel="methods" thread-count="4">. Gültige Werte sind methods, tests, classes und instances. Stellen Sie vorher sicher, dass die Tests keinen veränderlichen Zustand teilen.
Kann TestNG JUnit-Tests ausführen?
Es kann JUnit-3- und JUnit-4-Tests ausführen, wenn der Test in der testng.xml mit junit="true" markiert ist. JUnit-5-Tests (Jupiter) brauchen stattdessen die JUnit Platform.
Warum wurde mein TestNG-Test übersprungen statt als fehlgeschlagen gewertet?
Ein Test mit dependsOnMethods wird übersprungen, wenn eine Methode, von der er abhängt, fehlschlägt. Beheben Sie zuerst die fehlschlagende Abhängigkeit, oder setzen Sie alwaysRun=true, falls der Test in jedem Fall laufen soll.
Verwandte Begriffe
Verwandte LoadFocus-Tools
Setze dieses Konzept mit LoadFocus in die Praxis um, derselben Plattform, die alles antreibt, was du gerade gelesen hast.