Maven Surefire 并行 ='both' 的工作方式与 'methods' 相同

标签 maven junit surefire

我有三个测试类:FirstTest、SecondTest 和 ThirdTest。 FirstTest 类如下所示:

public class FirstTest {

  @Test
  public void test() throws InterruptedException {
    System.out.println(this.getClass() + " " + new Date());
    Thread.sleep(10_000);
  }

  @Test
  public void test2() throws InterruptedException {
    System.out.println(this.getClass() + " " + new Date());
    Thread.sleep(10_000);
  }

  @Test
  public void test3() throws InterruptedException {
    System.out.println(this.getClass() + " " + new Date());
    Thread.sleep(10_000);
  }

  @Test
  public void test4() throws InterruptedException {
    System.out.println(this.getClass() + " " + new Date());
    Thread.sleep(15_000);
  }

}

SecondTest 类相同(10s+10s+10s+15s = 总共 45s),ThirdTest 包含 10s+10s+10s 测试方法。

我正在使用具有以下配置的 Maven Surefire 插件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.9</version>
    <configuration>
      <excludes>
        <exclude>${excludeTestPath}</exclude>
      </excludes>
      <parallel>both</parallel>
      <threadCount>20</threadCount>
    </configuration>
</plugin>

我无法理解并行属性的工作原理。我尝试设置“both”、“methods”和“classes”值,但得到了一些令人困惑的输出。请看一下并向我解释一下:

并行='类'

Concurrency config is parallel='classes', perCoreThreadCount=true, 
threadCount=20, useUnlimitedThreads=false
Running experiment.ThirdTest
class experiment.ThirdTest Mon Jun 10 12:00:38 CEST 2013
class experiment.ThirdTest Mon Jun 10 12:00:48 CEST 2013
class experiment.ThirdTest Mon Jun 10 12:00:58 CEST 2013
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 30.024 sec
Running experiment.SecondTest
class experiment.SecondTest Mon Jun 10 12:00:38 CEST 2013
class experiment.SecondTest Mon Jun 10 12:00:48 CEST 2013
class experiment.SecondTest Mon Jun 10 12:00:58 CEST 2013
class experiment.SecondTest Mon Jun 10 12:01:08 CEST 2013
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 45.054 sec
Running experiment.FirstTest
class experiment.FirstTest Mon Jun 10 12:00:38 CEST 2013
class experiment.FirstTest Mon Jun 10 12:00:48 CEST 2013
class experiment.FirstTest Mon Jun 10 12:00:58 CEST 2013
class experiment.FirstTest Mon Jun 10 12:01:08 CEST 2013
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 45.074 sec

Results :
Tests run: 11, Failures: 0, Errors: 0, Skipped: 0

[INFO] Total time: 52.319s
[INFO] Finished at: Mon Jun 10 12:01:48 CEST 2013
[INFO] Final Memory: 22M/354M

这是预期的结果,三个类并行执行,全部从 12:00:38 开始。构建应该需要 10s+10s+10s+15s,所以大约 45s。

并行='方法'

Concurrency config is parallel='methods', perCoreThreadCount=true,
threadCount=20, useUnlimitedThreads=false
Running experiment.FirstTest
class experiment.FirstTest Mon Jun 10 12:10:23 CEST 2013
class experiment.FirstTest Mon Jun 10 12:10:23 CEST 2013
class experiment.FirstTest Mon Jun 10 12:10:23 CEST 2013
class experiment.FirstTest Mon Jun 10 12:10:23 CEST 2013
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 45.142 sec
Running experiment.SecondTest
class experiment.SecondTest Mon Jun 10 12:10:38 CEST 2013
class experiment.SecondTest Mon Jun 10 12:10:38 CEST 2013
class experiment.SecondTest Mon Jun 10 12:10:38 CEST 2013
class experiment.SecondTest Mon Jun 10 12:10:38 CEST 2013
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 45.037 sec
Running experiment.ThirdTest
class experiment.ThirdTest Mon Jun 10 12:10:53 CEST 2013
class experiment.ThirdTest Mon Jun 10 12:10:53 CEST 2013
class experiment.ThirdTest Mon Jun 10 12:10:53 CEST 2013
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 30.009 sec

Results :
Tests run: 11, Failures: 0, Errors: 0, Skipped: 0

[INFO] Total time: 47.405s
[INFO] Finished at: Mon Jun 10 12:11:04 CEST 2013
[INFO] Final Memory: 22M/354M

这是预期的结果,所有方法都在单个类中并行执行。构建应该需要 15s+15s+10s,所以大约 45s。

并行='两者'

Concurrency config is parallel='both', perCoreThreadCount=true, 
threadCount=20, useUnlimitedThreads=false
Running experiment.FirstTest
class experiment.FirstTest Mon Jun 10 12:18:40 CEST 2013
class experiment.FirstTest Mon Jun 10 12:18:40 CEST 2013
class experiment.FirstTest Mon Jun 10 12:18:40 CEST 2013
class experiment.FirstTest Mon Jun 10 12:18:40 CEST 2013
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 45.18 sec
Running experiment.SecondTest
class experiment.SecondTest Mon Jun 10 12:18:55 CEST 2013
class experiment.SecondTest Mon Jun 10 12:18:55 CEST 2013
class experiment.SecondTest Mon Jun 10 12:18:55 CEST 2013
class experiment.SecondTest Mon Jun 10 12:18:55 CEST 2013
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 45.031 sec
Running experiment.ThirdTest
class experiment.ThirdTest Mon Jun 10 12:19:10 CEST 2013
class experiment.ThirdTest Mon Jun 10 12:19:10 CEST 2013
class experiment.ThirdTest Mon Jun 10 12:19:10 CEST 2013
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 30.025 sec

Results :
Tests run: 11, Failures: 0, Errors: 0, Skipped: 0

[INFO] Total time: 47.521s
[INFO] Finished at: Mon Jun 10 12:19:20 CEST 2013
[INFO] Final Memory: 22M/354M

现在,这个问题让我感到困惑。构建大约需要 45 秒,而应该需要大约 15 秒(最长的测试方法)。为什么三个类没有在 12:18:40 开始执行? parallel='both' 不是表示类和方法同时执行吗?

编辑: 我找到了blogpost提到了这个问题。

最佳答案

参见this comment来自SUREFIRE-814 (自 2012 年 1 月起):

"both" is largely untested for a long time and I have no reason to disbelieve that you're seeing this issue.

可以肯定的是,parallel=both 在此期间并没有受到太多关注。我确认该问题影响 Surefire 2.15,我计划发表评论并对票进行投票(一旦收到注册确认)。我建议更多人投票。

关于Maven Surefire 并行 ='both' 的工作方式与 'methods' 相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17021695/

相关文章:

maven - mvn -e 完整的堆栈跟踪?

java - 要求 JUnit 在其调用的方法中抛出异常

android - 运行 Android 测试 - 磁盘上不存在 APK 文件 "...-androidTest.apk"

maven - 虚拟 :dummy:jar:1. 0、surefire-junit4、maven 和 Nexus

java - 如何将未转义的 HTML-HREF 添加到 Surefire-report 以在 Jenkins 中显示链接

java - 为什么 Maven 版本会跳过我的子模块

maven - 使用 maven 构建多个非常相似的资源程序集

android - 使用 Android Studio 和 Gradle 进行单元测试?

java - Surefire 报告不显示测试结果

java - 根据依赖版本设置 Maven 属性