无法理解Maven Surefire插件';s平行参数

无法理解Maven Surefire插件';s平行参数,maven,cucumber,maven-surefire-plugin,Maven,Cucumber,Maven Surefire Plugin,引述自: 。。。并行参数。可能的值取决于测试 提供程序已使用。对于JUnit4.7及更高版本,这可能是, 类,两者,套件,套件和类,套件和方法, 类和方法或全部 我只想并行执行Cucumber特性文件。在这种情况下,这些参数——main、方法、类等——意味着什么?下面是我的pom.xml文件的摘录: <build> <plugins> <plugin> <groupId>org.apache.mave

引述自:

。。。并行参数。可能的值取决于测试 提供程序已使用。对于JUnit4.7及更高版本,这可能是, 类,两者,套件,套件和类,套件和方法, 类和方法或全部

我只想并行执行Cucumber特性文件。在这种情况下,这些参数——main、方法、类等——意味着什么?下面是我的pom.xml文件的摘录:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M4</version>
            <configuration>
                **<parallel>methods</parallel>**
                <useUnlimitedThreads>true</useUnlimitedThreads>
            </configuration>
        </plugin>
    </plugins>
</build>

org.apache.maven.plugins

使用此配置。我不知道他们为什么选择这样配置它。为什么他们没有选择其他选项,比如“类”或“类和方法”?

这是一个非常好的问题!我是Cucumber中支持并行执行的实现者之一,实际上我花了相当长的时间才完成这一切

JUnit、Surefire和Cumber一起进化而来。因此,某些概念最初是以狭隘的焦点引入的,后来被推广,但没有重新命名。因此,您会遇到这些相当奇怪的不匹配

因此JUnit将测试表示为一个简单的树:

Example1Test.class
 |- method1()
 |- method2()
 |- method3()
Example2Test.class
 |- method1()
 |- method2()
 |- method3()
因为JUnit最初没有并行执行,所以这是由surefire处理的。Surefire将启动JUnit的多个实例,并在它们之间划分应该测试的类

JUnit通过向测试执行器添加
setScheduler(RunnerScheduler)
来增加对方法级并行执行的支持。一旦出现这种情况,surefire必须区分使用自己的并行执行方法、junits并行执行方法或两者。因此,有不同的选项和名称

在某个时候,JUnit还添加了对实现自定义运行程序的支持。Cucumber使用它实现了一个自定义运行器。对JUnit来说,这是这样的:

@RunWith(Cucumber.class)
RunCucumberTest.class
|- Feature1
|  |- scenario1()
|- Feature2
|  |- scenario1()
|  |- scenario2()
要并行执行功能,JUnit必须在执行器(
Cucumber.class
)上使用
setScheduler(scheduler)
方法。为此,必须由Surefire指示JUnit使用并行调度程序。我们这样做的方式是告诉Surefire使用
方法
选项

现在,这是一个相当高级的解释,您可以通过查看源代码放大更多内容:


您可以单独与JUnit并行执行测试,还是还需要Surefire?使用JUnit 4,这是可能的,但很复杂。对于JUnit5,它更简单。您必须使用Cucumbers JUnit平台引擎:然后您可以使用JUnit控制台启动器来运行测试。