Die Parallelisierung von Tests reduziert die Testlaufzeit und steigert die Effizienz. Das Maven Surefire Plugin bietet leistungsfähige Optionen zur parallelen Testausführung mit JUnit und TestNG.
Das Plugin wird in der pom.xml konfiguriert:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M7</version>
<configuration>
<parallel>methods</parallel>
<threadCount>4</threadCount>
</configuration>
</plugin>
</plugins>
</build>Erläuterung: -
parallel: Gibt an, welche Tests parallel
laufen: - methods → Testmethoden parallel ausführen. -
classes → Testklassen parallel ausführen. -
both → Methoden und Klassen parallel ausführen. -
threadCount: Anzahl der parallelen
Threads.
parallel-Werte)| Wert | Beschreibung |
|---|---|
none |
Standard (keine Parallelisierung). |
methods |
Führt Methoden innerhalb einer Klasse parallel aus. |
classes |
Führt Testklassen parallel aus. |
both |
Führt sowohl Klassen als auch Methoden parallel aus. |
suites |
Führt TestNG-Suiten parallel aus. |
all |
Führt alles parallel aus (Klassen, Methoden, Suiten). |
Beispiel für parallele Testklassen:
<configuration>
<parallel>classes</parallel>
<threadCount>4</threadCount>
</configuration>Beispiel für parallele Methoden innerhalb einer Klasse:
<configuration>
<parallel>methods</parallel>
<threadCount>4</threadCount>
</configuration>Statt einer festen Zahl kann die Anzahl der Threads dynamisch berechnet werden:
<configuration>
<parallel>methods</parallel>
<threadCount>${surefire.threads}</threadCount>
</configuration>Linux/macOS:
mvn test -Dsurefire.threads=$(nproc)Windows:
mvn test -Dsurefire.threads=%NUMBER_OF_PROCESSORS%Tests können gezielt über die Kommandozeile ausgeführt werden:
mvn test -Dsurefire.parallel=methods -Dsurefire.threadCount=4Um fehlschlagende Tests zu wiederholen:
<configuration>
<rerunFailingTestsCount>2</rerunFailingTestsCount>
</configuration>JUnit 5 erlaubt eine eigene Parallelisierungsstrategie über die Datei
junit-platform.properties:
junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.mode.default=concurrent
junit.jupiter.execution.parallel.mode.classes.default=concurrent
junit.jupiter.execution.parallel.config.strategy=fixed
junit.jupiter.execution.parallel.config.fixed.parallelism=4
Diese Konfiguration funktioniert auch ohne Maven Surefire.
Thread-sichere Implementierungen verwenden: Gemeinsame Ressourcen vermeiden oder korrekt synchronisieren.
Testdaten isolieren: Sicherstellen, dass parallele Tests sich nicht gegenseitig beeinflussen.
Reine Unit-Tests parallelisieren: Integrationstests haben oft Abhängigkeiten (z. B. Datenbank), die parallel zu Fehlern führen können.
reuseForks=false setzen, falls
parallele Tests sich gegenseitig beeinflussen:
<configuration>
<reuseForks>false</reuseForks>
</configuration>Detaillierte Beispiele und Hintergrundinformationen: - Baeldung: Running JUnit Tests in Parallel with Maven