单独运行JUnit test*methods*

jos*_*pos 7 java junit maven maven-surefire-plugin

maven-surefire-plugin能够独立运行所有JUnit测试方法吗?即,是否能够为每个测试方法而不是每个测试类分叉JVM?

已弃用的选项

<forkMode>pertest</forkMode>
Run Code Online (Sandbox Code Playgroud)

和当前

<forkCount>1</forkCount>
<reuseForks>false</reuseForks>
Run Code Online (Sandbox Code Playgroud)

似乎只为每个测试类分叉.

PS:测试方法应该是独立的,因此没有人需要在新的JVM上运行每一个(而不是说它会非常昂贵).但我想知道是否有这样的选择.

gly*_*ing 1

Maven Surefire 插件支持此配置:

<parallel>methods</parallel>
Run Code Online (Sandbox Code Playgroud)

对于 JUnit 版本 >= 4.7

例如:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20</version>
    <configuration>
      <parallel>methods</parallel>
      <threadCount>10</threadCount>
    </configuration>
  </plugin>
Run Code Online (Sandbox Code Playgroud)

更多详细信息请参见此处

根据您的评论编辑 1 :

我想在新的 JVM 上运行每个测试方法,而不是在同一 JVM 上的另一个线程上运行

当使用reuseForks=trueand a forkCount> 1时,测试类会一一交给fork进程。因此,当parallel=methods类在并发进程中执行时forkCount,每个进程都使用threadCount多个线程并行执行一个类的方法。

因此,看起来 Surefire 不支持您的用例。

FWIW,为每个测试方法生成一个 JVM 听起来可能会很昂贵。您是否可能正在处理这样一个问题:测试方法在 JVM 中产生不需要的副作用(可能它们设置系统属性或更改静态数据),并且这些副作用无法隔离?如果是这样,也许重新测试以消除这些副作用可能比实施定制且可能昂贵的测试运行程序更可取?