在并行模式下使用 maven-surefire-plugin 时如何识别缓慢的单元测试?
How to identify slow unit tests when using maven-surefire-plugin in parallel mode?
为了管理/减少我们的构建时间,我想确定哪些单元测试花费的时间最多 - 在使用 maven-surefire-plugin
.
的并行测试环境中
我们正在使用 JUnit
(4.10) 进行单元测试。我们使用 maven
(2.2.1 - 我们使用的一些插件尚不支持 Maven 3)作为我们的主要构建工具,以及 maven-surefire-plugin
(2.19) 到 运行 单元测试。
我们在 parallel mode 中使用 maven-surefire-plugin
,其中各个方法都是 运行 并行,单元测试 class 是 运行并行 - 这非常重要,因为它显着减少了构建单元测试时间。 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 测试所用的时间 class 是 class 中所有方法的总时间。
例如,如果一个测试 class 有 10 个单元测试方法,每个方法花费 1 秒到 运行,那么测试 class 将花费大约 1 秒到 运行(每个方法都是 运行 并行),但输出类似于:
Running com.package.QuickParallelTest Tests run: 10, Failures: 0, Errors:
0, Skipped: 0, Time elapsed: 10.0 sec - in com.package.QuickParallelTest
这使得很难在控制台输出中区分另一个测试 class 的 10 个单元测试方法,其中 9 个 运行 几乎是即时的,而 1 个几乎需要 10 秒才能 运行.在这种情况下,测试 class 将花费大约 10 秒到 运行 (因为一个缓慢的测试方法),但 maven-surefire-plugin
控制台输出实际上是相同的:
Running com.package.SlowParallelTest Tests run: 10, Failures: 0, Errors:
0, Skipped: 0, Time elapsed: 10.0 sec - in com.package.SlowParallelTest
理想情况下,我希望经过的时间表明测试 class 花费了多长时间 运行 (并行),而不是单独 运行 方法花费的总时间(就像单线程一样)。
那么,我的问题 is/are:
- 是否有我缺少的 maven-surefire-plugin 设置,以便打印摘要显示每个 class 所花费的时间而不是方法的总和?
- 这是
maven-surefire-plugin
中已知的"bug"(或"feature")吗? (我检查了 SureFire JIRA,但找不到这样的东西。)
- 有没有其他方法可以让我确定哪些测试需要很长时间,因此是优化的首要条件。
编辑:
我试过一些额外的配置设置。奇怪的是,将以下内容添加到 .pom
中的配置似乎将控制台输出中经过的时间更改为 运行 测试 class 所花费的时间 - 然而,这是(在我看来)违反直觉,因为这些设置是 default settings:
<configuration>
...
<forkCount>1</forkCount>
<reuseForks>true</reuseForks>
</configuration>
将 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>
使用默认报告格式输出 (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
此选项可能会为您提供有关测试和执行时间的更多详细信息。
为了管理/减少我们的构建时间,我想确定哪些单元测试花费的时间最多 - 在使用 maven-surefire-plugin
.
我们正在使用 JUnit
(4.10) 进行单元测试。我们使用 maven
(2.2.1 - 我们使用的一些插件尚不支持 Maven 3)作为我们的主要构建工具,以及 maven-surefire-plugin
(2.19) 到 运行 单元测试。
我们在 parallel mode 中使用 maven-surefire-plugin
,其中各个方法都是 运行 并行,单元测试 class 是 运行并行 - 这非常重要,因为它显着减少了构建单元测试时间。 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 测试所用的时间 class 是 class 中所有方法的总时间。
例如,如果一个测试 class 有 10 个单元测试方法,每个方法花费 1 秒到 运行,那么测试 class 将花费大约 1 秒到 运行(每个方法都是 运行 并行),但输出类似于:
Running com.package.QuickParallelTest Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10.0 sec - in com.package.QuickParallelTest
这使得很难在控制台输出中区分另一个测试 class 的 10 个单元测试方法,其中 9 个 运行 几乎是即时的,而 1 个几乎需要 10 秒才能 运行.在这种情况下,测试 class 将花费大约 10 秒到 运行 (因为一个缓慢的测试方法),但 maven-surefire-plugin
控制台输出实际上是相同的:
Running com.package.SlowParallelTest Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10.0 sec - in com.package.SlowParallelTest
理想情况下,我希望经过的时间表明测试 class 花费了多长时间 运行 (并行),而不是单独 运行 方法花费的总时间(就像单线程一样)。
那么,我的问题 is/are:
- 是否有我缺少的 maven-surefire-plugin 设置,以便打印摘要显示每个 class 所花费的时间而不是方法的总和?
- 这是
maven-surefire-plugin
中已知的"bug"(或"feature")吗? (我检查了 SureFire JIRA,但找不到这样的东西。) - 有没有其他方法可以让我确定哪些测试需要很长时间,因此是优化的首要条件。
编辑:
我试过一些额外的配置设置。奇怪的是,将以下内容添加到 .pom
中的配置似乎将控制台输出中经过的时间更改为 运行 测试 class 所花费的时间 - 然而,这是(在我看来)违反直觉,因为这些设置是 default settings:
<configuration>
...
<forkCount>1</forkCount>
<reuseForks>true</reuseForks>
</configuration>
将 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>
使用默认报告格式输出 (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
此选项可能会为您提供有关测试和执行时间的更多详细信息。