无法理解 Maven Surefire 插件的并行参数
Trouble understanding Maven Surefire plugin's parallel parameters
引用自maven.apache.org:
... the parallel parameter. The possible values depend on the test
provider used. For JUnit 4.7 and onwards, this may be methods,
classes, both, suites, suitesAndClasses, suitesAndMethods,
classesAndMethods or all
我只想并行执行 Cucumber 功能文件。这些参数——main、methods、类 等——在这种情况下是什么意思?这是我的 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 上的指南使用了这个配置。我不知道 为什么 他们选择这样配置。他们为什么不选择 'classes' 或 'classesAndMethods' 等其他选项?
这个问题问得好!我是在 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 还添加了对实现自定义 运行ners 的支持。 Cucumber 使用此实现自定义 运行ner。对于 JUnit,这看起来像这样:
@RunWith(Cucumber.class)
RunCucumberTest.class
|- Feature1
| |- scenario1()
|- Feature2
| |- scenario1()
| |- scenario2()
要并行执行功能,JUnit 必须在执行程序 (Cucumber.class
) 上使用 setScheduler(scheduler)
方法。为此,Surefire 必须指示 JUnit 使用并行调度程序。我们这样做的方法是告诉 Surefire 使用 methods
选项。
现在这是一个相当高层次的解释,您可以通过查看源代码进一步放大:
- https://github.com/cucumber/cucumber-jvm/blob/master/junit/src/main/java/io/cucumber/junit/Cucumber.java
- https://github.com/apache/maven-surefire/blob/master/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
- https://github.com/junit-team/junit4/blob/master/src/main/java/org/junit/runner/JUnitCore.java
- https://github.com/junit-team/junit4/blob/master/src/main/java/org/junit/runners/ParentRunner.java
引用自maven.apache.org:
... the parallel parameter. The possible values depend on the test provider used. For JUnit 4.7 and onwards, this may be methods, classes, both, suites, suitesAndClasses, suitesAndMethods, classesAndMethods or all
我只想并行执行 Cucumber 功能文件。这些参数——main、methods、类 等——在这种情况下是什么意思?这是我的 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 上的指南使用了这个配置。我不知道 为什么 他们选择这样配置。他们为什么不选择 'classes' 或 'classesAndMethods' 等其他选项?
这个问题问得好!我是在 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 还添加了对实现自定义 运行ners 的支持。 Cucumber 使用此实现自定义 运行ner。对于 JUnit,这看起来像这样:
@RunWith(Cucumber.class)
RunCucumberTest.class
|- Feature1
| |- scenario1()
|- Feature2
| |- scenario1()
| |- scenario2()
要并行执行功能,JUnit 必须在执行程序 (Cucumber.class
) 上使用 setScheduler(scheduler)
方法。为此,Surefire 必须指示 JUnit 使用并行调度程序。我们这样做的方法是告诉 Surefire 使用 methods
选项。
现在这是一个相当高层次的解释,您可以通过查看源代码进一步放大:
- https://github.com/cucumber/cucumber-jvm/blob/master/junit/src/main/java/io/cucumber/junit/Cucumber.java
- https://github.com/apache/maven-surefire/blob/master/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
- https://github.com/junit-team/junit4/blob/master/src/main/java/org/junit/runner/JUnitCore.java
- https://github.com/junit-team/junit4/blob/master/src/main/java/org/junit/runners/ParentRunner.java