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

2022-09-02 01:12:01

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

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <configuration>
  <parallel>classes</parallel>
 </configuration>
</plugin>

我发现有2个测试类(让我们称它们为“badtestclass1”和“badtestclass2”),由于其中的测试的编写方式,它们不断受到这种并行执行的惩罚。理想情况下,我会重构这些测试类以使其表现得更好,但在此期间,我想知道是否有一种漂亮的方法来“排除”这些特定类并行执行。基本上,有没有办法并行执行其他所有内容,然后按顺序执行这2个(或其他顺序,无关紧要)。像下面这样的东西会起作用吗?

<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>

答案 1

您可以注释不希望使用 jcip @NotThreadSafe并行化的类,并使 surefire 配置保持起始示例中的样子。这样,每当 surefire 找到带注释的类时,它就会在单个线程中执行它。在“并行测试执行和单线程执行段落中对此进行了解释。


答案 2

@polaretto的答案建议使用jcip注释,该注释与构建中的surefire插件一起使用,但不适用于命令行 。@patson-luk的答案是正确的,不幸的是,通过在默认配置中排除“不良测试”,它仍然被排除在外,并且没有在单独的中运行。@NotThreadSafemvn test<execution>

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

对于 JUnit 5,这些就足够了

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

junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent

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

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

@Execution(SAME_THREAD)
class SingleThreadedTest {
   // ...
}

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

<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>

推荐