排除在jUnit中并行运行的特定测试

BSJ*_*BSJ 10 java parallel-processing junit4 maven

我最近偶然发现了一种通过在java项目的pom.xml文件中指定以下内容来通过jUnit并行执行测试的简单方法:

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <configuration>
  <parallel>classes</parallel>
 </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

我发现有两个测试类(让我们称之为"badtestclass1"和"badtestclass2")由于编写测试的方式而不断受到并行执行的惩罚.理想情况下,我会重构那些测试类以表现得更好,但在此期间,我想知道是否有一种漂亮的方法来"排除"这些特定类并行执行.基本上,是否有一种方法可以并行执行其他所有操作,然后按顺序执行其他操作(或其他顺序,无关紧要).会有类似下面的工作吗?

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <configuration>
  <parallel>classes</parallel>
  <excludes>
   <excludesFile>badtestclass1</excludesFile>
   <excludesFile>badtestclass2</excludesFile>
  </excludes>
 </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

Dan*_*dis 23

@poletto 的答案建议使用 jcip@NotThreadSafe注释,它可以与构建中的 Surefire 插件一起使用,但不能与命令行一起使用mvn test。@patson-luk 的答案是正确的,不幸的是,通过排除默认配置中的“坏测试”,它仍然被排除在外,并且没有在单独的<execution>.

我设法使用以下配置使其工作:

对于 JUnit 5,这些就足够了

在我的src/test/resources/junit-platform.properties文件中(或者您可以作为命令行参数传递):

junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent
Run Code Online (Sandbox Code Playgroud)

在我的非线程安全类的顶部(而不是 jcip 注释):

junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent
Run Code Online (Sandbox Code Playgroud)

对于 JUnit 4,将接受的答案修改如下:

import static org.junit.jupiter.api.parallel.ExecutionMode.SAME_THREAD;

@Execution(SAME_THREAD)
class SingleThreadedTest {
   // ...
}
Run Code Online (Sandbox Code Playgroud)


pol*_*tto 10

您可以使用jcip @NotThreadSafe注释不希望并行化的类,并保留在启动示例中的surefire配置.这样,只要surefire找到带注释的类,它就会在单个线程中执行它.它解释的权利在这里的" 并行测试执行和单线程执行 "段落.


Pat*_*Luk 6

在原始测试短语中排除这 2 个测试,然后使用在单线程中运行的这 2 个类创建新的执行?:)

<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>
Run Code Online (Sandbox Code Playgroud)