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

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

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

我们使用的是并行模式,其中各个方法并行运行,单元测试类并行运行 - 这非常重要,因为它显着减少了构建单元测试时间。的配置如下:maven-surefire-pluginmaven-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

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

理想情况下,我希望经过的时间能够指示测试类运行所花费的时间(并行),而不是单独运行方法(如单线程)所花费的总时间。

所以,我的问题是::

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

编辑:

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

    <configuration>
      ...
      <forkCount>1</forkCount>
      <reuseForks>true</reuseForks>
    </configuration>

答案 1

reportFormat 条目添加到 Maven Surefire 插件配置中,并将其值设置为(而不是默认值 ),将为您提供每种方法的运行时间。plainbrief

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

使用默认报告的输出格式 ():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

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


答案 2

推荐