【问题标题】:How to identify slow unit tests when using maven-surefire-plugin in parallel mode?在并行模式下使用 maven-surefire-plugin 时如何识别缓慢的单元测试?
【发布时间】:2016-04-11 19:17:51
【问题描述】:

为了管理/减少我们的构建时间,我想确定哪些单元测试花费的时间最多 - 在并行测试环境中使用 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.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 中

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

所以,我的问题是:

  1. 我是否缺少 maven-surefire-plugin 设置,以便打印摘要显示每个类所用的时间,而不是方法的汇总?
  2. 这是maven-surefire-plugin 中已知的“错误”(或“功能”)吗? (我检查了SureFire JIRA,但找不到类似的东西。)
  3. 我是否有其他方法可以确定哪些测试需要很长时间,因此是优化的首要条件。

编辑:

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

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

【问题讨论】:

  • 就像对未来读者的评论——在生产环境中,包括配置设置 false,这意味着没有性能数据打印到控制台,可以缩短构建时间——然后,您可以在分析构建性能时注释掉该设置。
  • 替代@amaidment 的评论,可以使用 true 跳过将日志打印到标准输出,但将它们保存为文本文件(稍后检索)。这具有将每个测试的输出放在单独的文件中的额外优势,否则在并行执行中会混乱。

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


【解决方案1】:

在 Maven Surefire 插件配置中添加 reportFormat 条目并将其值设置为 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>

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

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

【讨论】:

  • 谢谢 - 这很有帮助。我已经看到了该设置,但由于文档(如您链接到的那样)声明它“仅适用于输出文件的输出格式”,因此对它进行了折扣。使用此设置有助于识别单元测试瓶颈。但是,它不是万能药,因为 surefire 插件似乎在每个方法被发送执行时启动时钟,而不是在它开始执行时启动。 (我可能错了,但这是我对所看到的经过时间的数据的解释。)
猜你喜欢
  • 2019-09-27
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 2019-03-07
相关资源
最近更新 更多