JUnit 和 Surefire Parallel Tests - ForkCount & ThreadCount

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

因此,在我的Grid上,我有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 之间是否存在关系
  • 我需要做些什么来真正并行运行它吗?

谢谢。


答案 1

您必须提供显式的 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)。


答案 2

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

根据文档:

分叉计数

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

...

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

线程计数

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

据我所知,公平地说,就像每个分叉的子线程一样。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


推荐