【问题标题】:Maven Surefire: Unable to fork parallel test executionMaven Surefire:无法分叉并行测试执行
【发布时间】:2011-04-05 17:34:27
【问题描述】:

使用 Maven surefire,我无法分叉并行测试执行。也就是说,我的每个测试用例都需要在单独的 JVM 中运行,因此需要分叉。此外,我希望我的测试用例并行运行。第一部分工作没有问题:我能够在自己的 JVM 中运行每个测试用例。然而,第二部分对我来说仍然是一个挑战。我还没有设法让测试用例的并行执行工作。这是我的插件声明的样子:

    <plugin>
          <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.5</version>
      <configuration>
           <parallel>methods</parallel>
           <forkMode>always</forkMode>
                <argLine>-Xms512m -Xmx512m</argLine>
       </configuration>
</plugin>

我已经尝试过方法和类,但没有看到任何并行化。 如依赖声明所示,我的 JUnit 版本是 4.7:

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.7</version>
        <scope>compile</scope>
    </dependency>            

任何帮助都会非常有用。

格雷戈瓦。

【问题讨论】:

    标签: maven-2 fork surefire parallel-testing


    【解决方案1】:

    我认为在使用parallel模式时应该使用threadCount参数:

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <forkMode>always</forkMode>
          <argLine>-Xms512m -Xmx512m</argLine>
          <parallel>methods</parallel>
          <threadCount>4</threadCount>
        </configuration>
      </plugin>
    

    【讨论】:

      【解决方案2】:

      确保您收到类似这样的日志消息

      [INFO] Concurrency config is {perCoreThreadCount=false, threadCount=1, parallel=classes, configurableParallelComputerPresent=true}
      

      就在这个标题之前:

      -------------------------------------------------------
       T E S T S
      -------------------------------------------------------
      

      此消息表明并行的surefire junit 提供程序处于活动状态。

      如果不存在,surefire 可能会选择与您想象的不同版本的 junit。低于 4.7 的任何东西都不起作用。运行 mvn dependency:tree 以检查存在哪些版本。

      您还应该升级到 surefire 2.6,因为一些与并行运行相关的小错误已得到修复。出于同样的原因,您应该使用最新的 junit。

      【讨论】:

      • 您不希望 perCoreThreadCount 为真吗?否则,threadCount 为 1,意味着您仅与一个线程并行运行,即串行?
      • 不,您希望线程分布在每个可用内核上,而不是一个内核上的所有线程。不幸的是,他们将默认设置为 perCoreThreadCount=true,在一个内核上执行所有线程。
      【解决方案3】:

      你确定它不起作用吗?如果您的测试不包含许多测试方法,您可能不会获得太多的加速。使用 forkMode=always,您能做的最好的事情就是并行运行一个类中的所有测试方法。

      【讨论】:

        【解决方案4】:

        Surefire 的并行模式非常有问题。例如,请参阅http://jira.codehaus.org/browse/SUREFIRE-747http://jira.codehaus.org/browse/SUREFIRE-730

        迄今为止,我还没有设法让单个测试并行运行(更不用说分叉了)。

        【讨论】:

          【解决方案5】:

          尝试将您的 forkMode 从始终更改为“从不”。它没有在他们的文档中说明这一点,但是此时您不能使用 fork plus parallel(我们在挖掘了 surefire 代码后发现了这一点。)

          您知道,由于许多测试/支持库(easymock、powermock 等)使并行测试的能力无效,您可能会遇到非线程安全的测试。

          【讨论】:

            【解决方案6】:

            我遇到了同样的问题,因为我使用的是 surefire 2.7 版,升级到 2.12 后它使用以下配置:

            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.12</version>
              <configuration>
                <parallel>classes</parallel>
                <forkMode>perthread</forkMode>
                <threadCount>4</threadCount>
              </configuration>
            </plugin>
            

            它产生了 4 个线程,每个线程运行它自己的 jvm。

            【讨论】:

            【解决方案7】:

            并行设置不是只有 TestNG 的属性吗?根据这个: http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#parallel

            【讨论】:

              【解决方案8】:

              surefire 2.16 修复了有关 JUnit 测试的并行执行问题。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-05-16
                • 1970-01-01
                • 2019-06-26
                • 1970-01-01
                • 1970-01-01
                • 2016-04-26
                相关资源
                最近更新 更多