Exclude specific tests from being run in parallel in jUnit
@polaretto's answer suggests the jcip @NotThreadSafe
annotation, which works with the surefire plugin in a build, but does not work with command line mvn test
. @patson-luk's answer is on the right track, unfortunately by excluding the "bad test" in the default configuration, it remained excluded and was not run in the separate <execution>
.
I managed to get this working using the following configuration:
For JUnit 5, these are sufficient
In my src/test/resources/junit-platform.properties
file (or you can pass as command line parameters):
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent
At the top of my not-thread-safe class (instead of the jcip annotation):
import static org.junit.jupiter.api.parallel.ExecutionMode.SAME_THREAD;
@Execution(SAME_THREAD)
class SingleThreadedTest {
// ...
}
For JUnit 4, modify the accepted answer as follows:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<!-- Skip default, define executions separately below -->
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>single-thread-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<!-- Not thread safe, run separately -->
<includes>
<include>**/SingleThreadedTest.java</include>
</includes>
<forkCount>1</forkCount>
<reuseForks>false</reuseForks>
<threadCount>1</threadCount>
<skip>false</skip>
</configuration>
</execution>
<execution>
<id>multi-thread-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<excludes>
<exclude>**/SingleThreadedTest.java</exclude>
</excludes>
<forkCount>4</forkCount>
<reuseForks>true</reuseForks>
<parallel>all</parallel>
<useUnlimitedThreads>true</useUnlimitedThreads>
<skip>false</skip>
</configuration>
</execution>
</executions>
</plugin>
Exclude those 2 tests in the original test phrase and then create a new execution with those 2 classes running in single thread? :)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>path/to/your/class/badtestclass1.java</exclude>
<exclude>path/to/your/class/badtestclass2.java</exclude>
</excludes>
<parallel>classes</parallel>
</configuration>
<executions>
<execution>
<id>single-thread-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>path/to/your/class/badtestclass1.java</include>
<include>path/to/your/class/badtestclass2.java</include>
</includes>
<threadCount>1</threadCount>
</configuration>
</execution>
</executions>
</plugin>
You can annotate the classes you don't want parallelized with jcip @NotThreadSafe and leave the surefire configuration as it was in your starting example. This way, whenever surefire finds an annotated class it just executes it in a single thread. It's explained right here in the "Parallel Test Execution and Single Thread Execution" paragraph.