在并行模式下使用maven-surefire-plugin时如何识别慢速单元测试?

时间:2016-01-07 11:53:01

标签: java maven junit maven-3 maven-surefire-plugin

为了管理/缩短构建时间,我想确定哪些单元测试花费的时间最多 - 在使用maven-surefire-plugin的并行测试环境中。

我们正在使用JUnit(4.10)进行单元测试。我们使用maven(2.2.1 - 我们使用的一些插件尚不支持maven 3)作为我们的主要构建工具,使用maven-surefire-plugin(2.19)来运行单元测试。

我们在parallel mode中使用maven-surefire-plugin,其中各个方法并行运行,单元测试类并行运行 - 这非常重要,因为它显着减少了构建单元测试时间。 maven-surefire-plugin的{​​{1}}配置如下:

.pom

但是,其中一个含义是在控制台输出中,每个JUnit测试类所用的时间是该类中所有方法的总时间。

例如,如果测试类有10个单元测试方法,每个测试方法需要1秒才能运行,那么测试类需要大约1秒才能运行(每个方法并行运行),但输出结果是类似的东西:

  

运行com.package.QuickParallelTest测试运行:10,失败:0,错误:   0,跳过:0,经过的时间:10.0秒 - 在com.package.QuickParallelTest

这使得很难在控制台输出与另一个测试类中区分10个单元测试方法,其中9个几乎立即运行,1个运行大约需要10秒。在这种情况下,测试类需要大约10秒才能运行(因为一个慢速测试方法),但 <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> 控制台输出实际上是相同的:

  

运行com.package.SlowParallelTest测试运行:10,失败:0,错误:   0,跳过:0,经过的时间:10.0秒 - 在com.package.SlowParallelTest

理想情况下,我希望花时间来指示测试类运行多长时间(并行),而不是单独运行方法所花费的总时间(就像单线程一样)。

所以,我的问题是:

  1. 是否存在我缺少的maven-surefire-plugin设置,以便打印摘要显示每个类的时间而不是方法的聚合时间?
  2. 这是maven-surefire-plugin中已知的“错误”(或“功能”)吗? (我已经检查了SureFire JIRA,但找不到这样的东西。)
  3. 我是否有另一种方法可以确定哪些测试需要很长时间,因此是优化的主要原因。
  4. 编辑:

    我尝试过使用其他一些配置设置。奇怪的是,将以下内容添加到maven-surefire-plugin中的配置似乎会将控制台输出中经过的时间更改为运行测试类所花费的时间 - 但是,这(在我看来)这是违反直觉的,因为这些设置是default settings

    .pom

1 个答案:

答案 0 :(得分:13)

reportFormat条目添加到Maven Surefire插件配置并将其值设置为plain(而不是默认brief)将为您提供每个方法的已用时间。

<build>
    <plugins>
        <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>
                <reportFormat>plain</reportFormat>
            </configuration>
        </plugin>
    </plugins>
</build>

使用默认reportFormat(brief)输出:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.sample.mocking.InternalServiceTestCase
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.241 sec - in com.sample.mocking.InternalServiceTestCase

plain值输出:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.sample.mocking.InternalServiceTestCase
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.187 sec - in com.sample.mocking.InternalServiceTestCase
test(com.sample.mocking.InternalServiceTestCase)  Time elapsed: 0.005 sec
mockTest(com.sample.mocking.InternalServiceTestCase)  Time elapsed: 0.17 sec
mockTestFailureTollerance(com.sample.mocking.InternalServiceTestCase)  Time elapsed: 0.007 sec
mockProcessfile(com.sample.mocking.InternalServiceTestCase)  Time elapsed: 0.003 sec

此选项可能会为您提供有关测试和执行时间的更多详细信息。