Exclude specific tests from being run in parallel in jUnit

后端 未结 3 1133
不思量自难忘°
不思量自难忘° 2020-12-31 07:45

I recently stumbled upon a simple way to parallelize the execute of tests via jUnit by specifying the following in a java project\'s pom.xml file:



        
相关标签:
3条回答
  • 2020-12-31 07:56

    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.

    0 讨论(0)
  • 2020-12-31 07:56

    I'm a little late to the party here, and tried both of the previous answers, which work in some cases but don't provide a complete solution. Possibly relevant, I'm working with JUnit 5.

    @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/main/resources/junit-platform.properties file:

    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>
    
    0 讨论(0)
  • 2020-12-31 08:07

    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>
    
    0 讨论(0)
提交回复
热议问题