JUnit和Surefire并行测试 - ForkCount& THREADCOUNT

时间:2015-10-07 08:59:41

标签: java selenium junit parallel-processing surefire

我使用Surefire插件在Selenium Grid上运行Selenium测试来执行测试。 就我的测试分类而言,我有几个类,其中一些有1个测试,还有一个以上的测试。

所以在我的网格上我有30个chrome web驱动程序,我想并行执行所有类中的所有测试。

我已经使用我设置的parallel参数阅读了如何执行此操作:

            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.17</version>
                <configuration>
                    <includes>
                        <include>${testSuite}</include>
                    </includes>
                    <parallel>all</parallel>
                    <useSystemClassLoader>false</useSystemClassLoader>
                    <perCoreThreadCount>false</perCoreThreadCount>
                    <threadCount>20</threadCount>
                    <browser>${browser_type}</browser>
                </configuration>
            </plugin>

然而,这似乎并没有填补我所有的Chrome网络驱动程序。

如果我然后使用forkCount,例如:

<forkCount>20</forkCount>
<reuseForks>true</reuseForks>

然后,当测试执行首次启动时,所有Web驱动程序都会被填充,但它会快速开始丢弃并一次执行一个。

所以我的问题:

  • forkCount和threadCount之间是否存在关系
  • 我还需要做些什么来真正让它并行运行吗?

感谢。

2 个答案:

答案 0 :(得分:4)

您必须提供显式的junit测试提供程序:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>2.18.1</version>
        </dependency>
    </dependencies>
    <configuration>
        <parallel>all</parallel>
        <useUnlimitedThreads>true</useUnlimitedThreads>
        <useSystemClassLoader>false</useSystemClassLoader>
        <includes>
            <include>${testSuite}</include>
        </includes>
        <systemPropertyVariables>
            <browser>${browser_type}</browser>
        </systemPropertyVariables>
     </configuration>
</plugin>

你应该使用JUnit 4.7+,因为旧版本不能正确地进行并行测试。

如果您的测试不影响JVM运行时(通常情况并非如此),您也可以省略与fork相关的参数。

或者将测试迁移到TestNG - 它是更优雅的框架,它更好地用于并行测试,然后是JUnit(imo)。

答案 1 :(得分:2)

有很多配置可以并行运行测试。

根据文件:

forkCount

  

参数forkCount定义Surefire将同时生成以执行测试的最大JVM进程数。它支持与maven-core中的-T相同的语法:如果使用C终止该值,则该值将与系统中可用CPU核心的数量相乘。例如,四核系统上的forkCount=2.5C将导致最多十个并发执行测试的JVM进程。

     

...

     

默认设置为forkCount=1 / reuseForks=true,这意味着Surefire会创建一个新的JVM进程来执行一个maven模块中的所有测试。

<强> THREADCOUNT

  

当使用大于1的reuseForks=trueforkCount值时,测试类将逐个移交给分叉进程。因此,parallel=classes不会改变任何东西。但是,您可以使用parallel=methods:在forkCount并发进程中执行类,然后每个进程可以使用threadCount个线程并行执行一个类的方法。

根据我的理解,threadCount就像是每个分叉的子线程。

您可以调整这些参数以提高测试性能,例如您可以:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.17</version>
    <configuration>
         <includes>
              <include>${testSuite}</include>
         </includes>
         <parallel>all</parallel>
         <useSystemClassLoader>false</useSystemClassLoader>
         <perCoreThreadCount>false</perCoreThreadCount>
         <forkCount>2.0C</forkCount>
         <reuseForks>true</reuseForks>
         <threadCount>20</threadCount>
         <browser>${browser_type}</browser>
    </configuration>
</plugin>

您可以在其网站上找到更多详细信息:

https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html