为了管理/缩短构建时间,我想确定哪些单元测试花费的时间最多 - 在并行测试环境中使用 maven-surefire-plugin
。
我们正在使用 JUnit
(4.10)进行单元测试。我们用 maven
(2.2.1 - 我们使用的一些插件还不支持maven 3)作为我们的主要构建工具,而且 maven-surefire-plugin
(2.19)进行单元测试。
我们正在使用 maven-surefire-plugin
在 并行模式,其中各个方法并行运行并且单元测试类并行运行 - 这非常重要,因为它显着减少了构建单元的测试时间。该 maven-surefire-plugin
在。中配置 .pom
如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<configuration>
<argLine>-Xmx2G -XX:MaxPermSize=1G -XX:-UseSplitVerifier</argLine>
<failIfNoTests>false</failIfNoTests>
<parallel>classesAndMethods</parallel>
<useUnlimitedThreads>true</useUnlimitedThreads>
</configuration>
</plugin>
但是,其中一个含义是在控制台输出中,每个JUnit测试类所用的时间是该类中所有方法的总时间。
例如,如果一个测试类有10个单元测试方法,每个测试方法需要1秒才能运行,那么测试类需要大约1秒才能运行(每个方法并行运行),但输出结果如下:
运行com.package.QuickParallelTest测试运行:10,失败:0,错误: 0,跳过:0,经过的时间:10.0秒 - 在com.package.QuickParallelTest中
这使得很难在控制台输出与另一个测试类中区分10个单元测试方法,其中9个几乎立即运行,1个运行几乎需要10秒。在这种情况下,测试类需要大约10秒才能运行(因为一种慢速测试方法),但是 maven-surefire-plugin
控制台输出实际上是相同的:
运行com.package.SlowParallelTest测试运行:10,失败:0,错误: 0,跳过:0,经过的时间:10.0秒 - 在com.package.SlowParallelTest中
理想情况下,我希望花时间来指示测试类运行多长时间(并行),而不是单独运行方法所花费的总时间(就像单线程一样)。
所以,我的问题是:
- 是否存在我缺少的maven-surefire-plugin设置,以便打印摘要显示每个类所花费的时间而不是聚合方法?
- 这是一个已知的“错误”(或“功能”)
maven-surefire-plugin
? (我已经查过了 SureFire JIRA,但找不到这样的东西。) - 是否有另一种方法可以确定哪些测试需要很长时间,因此是优化的主要方法。
编辑:
我试过玩一些额外的配置设置。奇怪的是,将以下内容添加到配置中 .pom
似乎将控制台输出中经过的时间更改为运行测试类所花费的时间 - 但是,这(在我看来)这是违反直觉的,因为这些设置是 默认设置:
<configuration>
...
<forkCount>1</forkCount>
<reuseForks>true</reuseForks>
</configuration>