难以理解Maven Surefire插件的并行参数

时间:2020-06-01 19:43:58

标签: maven cucumber maven-surefire-plugin

引用maven.apache.org

...并行参数。可能的值取决于测试 提供者使用。对于JUnit 4.7及更高版本,这可能是方法, 类,套件,suitsAndClasses,suitsAndMethods, classesAndMethods或全部

我只想并行执行Cucumber功能文件。这些参数(主要,方法,类等)在这种情况下意味着什么?这是我的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>

我只是将'methods'放在了并行标记中,因为Cucumber的Parallel Execution page上的指南使用了这种配置。我不知道为什么他们选择以这种方式配置它。他们为什么不选择其他选项,例如“类”或“ classesAndMethods”?

1 个答案:

答案 0 :(得分:1)

这是一个非常好的问题!我是Cucumber中支持并行执行的实现者之一,实际上花了我相当长的时间才能解决所有问题。

JUnit,Surefire和Cucumber一起发展了。因此,最初以狭窄的关注点引入了某些概念,后来将其概括化,但未重命名。结果,您遇到了这些相当奇怪的不匹配。

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

Example1Test.class
 |- method1()
 |- method2()
 |- method3()
Example2Test.class
 |- method1()
 |- method2()
 |- method3()

由于JUnit最初没有并行执行,因此由surefire处理。 Surefire将启动JUnit的多个实例,并在它们之间划分应该测试的类。

JUnit通过将setScheduler(RunnerScheduler scheduler)添加到测试执行程序来增加了对方法级别的并行执行的支持。一旦出现这种情况,surefire必须区分使用自己的并行执行方法,使用Junits并行执行方法还是两者。因此,不同的选项及其名称。

有时,JUnit还添加了对实现自定义运行器的支持。黄瓜使用此工具实现自定义运行器。对于JUnit,它看起来像这样:

@RunWith(Cucumber.class)
RunCucumberTest.class
|- Feature1
|  |- scenario1()
|- Feature2
|  |- scenario1()
|  |- scenario2()

要并行执行功能,JUnit必须在执行程序(setScheduler(scheduler))上使用Cucumber.class方法。为此,必须由Surefire指示JUnit使用并行调度程序。我们这样做的方法是告诉Surefire使用methods选项。

现在,这是一个相当高级的解释,您可以通过查看源代码来进一步放大: