单独运行JUnit test * methods *

时间:2017-08-30 22:28:06

标签: java maven junit maven-surefire-plugin

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

已弃用的选项

<forkMode>pertest</forkMode>

和当前的

<forkCount>1</forkCount>
<reuseForks>false</reuseForks>

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

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

2 个答案:

答案 0 :(得分:0)

Maven Surefire插件支持此配置:

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

对于JUnit版本&gt; = 4.7

例如:

reuseForks=true

更多详情here

根据您的评论

编辑1

  

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

使用forkCountparallel=methods&gt;时1,测试类逐个移交给分叉进程。因此,在forkCount个并发进程中执行threadCount个类时,每个进程都使用skuid: (\d+) 个数字线程来并行执行一个类的方法。

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

FWIW,为每个测试方法生成一个JVM听起来好像很贵。您是否正在处理一个问题,即测试方法在JVM中有不必要的副作用(可能是他们设置了系统属性或更改静态)并且这些副作用无法隔离?如果是这样的话,也许比实施一个定制且可能很昂贵的测试跑步者更需要通过测试来消除这些副作用?

答案 1 :(得分:0)

我发现this project声称可以做到这一点,尽管在我尝试时似乎没有用(也许已过时)。无论如何,我认为这只能用于基本的@Test注释方法,而不能使用@RunWith(Parameterized.class)等。