Cucumber-JVM 自 4.0.0 版 起允许跨多个线程进行并行执行。
在 Cucumber 项目中,有多种方式可以利用此内置功能。您可以使用以下方法:
对于每个选项,本教程将介绍项目设置、配置设置和执行命令。
Cucumber-JVM 自 4.0.0 版 起允许跨多个线程进行并行执行。
在 Cucumber 项目中,有多种方式可以利用此内置功能。您可以使用以下方法:
对于每个选项,本教程将介绍项目设置、配置设置和执行命令。
JUnit 5
可以使用 JUnit Platform 并行执行 Cucumber 场景。
有关详细信息,请参阅 cucumber-junit-platform-engine 文档。
可以使用 JUnit Platform 并行执行 Cucumber 场景。
有关详细信息,请参阅 cucumber-junit-platform-engine 文档。
JUnit 4
可以使用 JUnit 和 Maven 测试执行插件 并行执行 Cucumber。在 JUnit 中,特征文件是并行运行的,而不是场景,这意味着 同一线程将执行特征文件中所有的场景。您可以使用 Maven Surefire 或 Failsafe 插件来执行运行器。
使用 cucumber-archetype 在您最喜欢的 IDE 中创建一个 Maven 项目,或者通过将 Cucumber 依赖项添加到 POM 中(详见 此处),以及 Junit 依赖项(详见 此处)。
在
src/test/resources
路径中创建一个 parallel 文件夹(或任何其他名称),并将两个特征文件(scenarios.feature
和scenario-outlines.feature
)添加到其中。
Feature: Scenarios feature file
Scenario: Scenario Number One
Given Step from 'Scenario 1' in 'scenarios' feature file
Scenario: Scenario Number Two
Given Step from 'Scenario 2' in 'scenarios' feature file
Feature: Scenario Outlines feature file
Scenario Outline: <scen_out_row_num>
Given Step from '<scen_out_row_num>' in 'scenario-outlines' feature file
Examples:
| scen_out_row_num |
| Scenario Outline Row 1 |
| Scenario Outline Row 2 |
可以使用 JUnit 和 Maven 测试执行插件 并行执行 Cucumber。在 JUnit 中,特征文件是并行运行的,而不是场景,这意味着 同一线程将执行特征文件中所有的场景。您可以使用 Maven Surefire 或 Failsafe 插件来执行运行器。
使用 cucumber-archetype 在您最喜欢的 IDE 中创建一个 Maven 项目,或者通过将 Cucumber 依赖项添加到 POM 中(详见 此处),以及 Junit 依赖项(详见 此处)。
在
src/test/resources
路径中创建一个 parallel 文件夹(或任何其他名称),并将两个特征文件(scenarios.feature
和scenario-outlines.feature
)添加到其中。
Feature: Scenarios feature file
Scenario: Scenario Number One
Given Step from 'Scenario 1' in 'scenarios' feature file
Scenario: Scenario Number Two
Given Step from 'Scenario 2' in 'scenarios' feature file
Feature: Scenario Outlines feature file
Scenario Outline: <scen_out_row_num>
Given Step from '<scen_out_row_num>' in 'scenario-outlines' feature file
Examples:
| scen_out_row_num |
| Scenario Outline Row 1 |
| Scenario Outline Row 2 |
- 将 步骤定义类 添加到
src/test/java
文件夹中parallel
包(与上面文件夹的名称相同,以便运行器自动拾取)。
package parallel;
import io.cucumber.java.BeforeStep;
import io.cucumber.java.en.Given;
public class StepDefs {
@Given("Step from {string} in {string} feature file")
public void step(String scenario, String file) {
System.out.format("Thread ID - %2d - %s from %s feature file.\n",
Thread.currentThread().getId(), scenario,file);
}
}
- 将 步骤定义类 添加到
src/test/kotlin
文件夹中parallel
包(与上面文件夹的名称相同,以便运行器自动拾取)。
package parallel
import io.cucumber.java8.En
class StepDefs : En {
init {
Given("Step from {string} in {string} feature file") { scenario: String , file: String ->
println("Thread ID - ${Thread.currentThread().id} - $scenario from $file feature file")
}
}
}
- 在
src/test/java
文件夹中parallel
包(与步骤定义包的名称相同)中使用RunWith
注解添加一个 Cucumber 运行器。
- 在
src/test/kotlin
文件夹中parallel
包(与步骤定义包的名称相同)中使用RunWith
注解添加一个 Cucumber 运行器。
package parallel;
import io.cucumber.junit.Cucumber;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
public class RunCucumberTest {
}
package parallel
import io.cucumber.junit.Cucumber
import org.junit.runner.RunWith
@RunWith(Cucumber::class)
class RunCucumberTest
- 将 Surefire 插件配置 添加到
POM
中的build
部分。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<parallel>methods</parallel>
<useUnlimitedThreads>true</useUnlimitedThreads>
</configuration>
</plugin>
- 使用 Maven
install
或适当的命令来 执行POM
。这应该以并行线程模式运行。您应该看到类似于以下的结果。重要的是要注意,文件中所有的场景(scenarios.feature
)都是由 ID 为 14 的线程执行的。同样,文件中所有场景大纲的行(scenario-outlines.feature
)都是由 ID 为 13 的线程执行的。
Thread ID - 13 - Scenario Outline Row 1 from scenario-outlines feature file.
Thread ID - 13 - Scenario Outline Row 2 from scenario-outlines feature file.
Thread ID - 14 - Scenario 1 from scenarios feature file.
Thread ID - 14 - Scenario 2 from scenarios feature file.
- 要使用 Maven Failsafe 插件执行,请在
POM
中的build
部分中包含以下配置。将运行器类重命名为RunCucumberIT
。您可以在 此处 找到更多详细信息。
为了让 Failsafe 找到您的步骤定义,请确保它们位于 src/test/java 中。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.0</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<parallel>methods</parallel>
<useUnlimitedThreads>true</useUnlimitedThreads>
</configuration>
</execution>
</executions>
</plugin>
要将线程数设置为 特定数量,而不是 useUnlimitedThreads
,请使用以下设置。
<configuration>
<parallel>methods</parallel>
<threadCount>4</threadCount>
</configuration>
上面设置中的线程数为 每个核心 4 个线程。如果您希望在所有核心上使用 4 个线程,请将 perCoreThreadCount
设置为 false。
<configuration>
<parallel>methods</parallel>
<threadCount>4</threadCount>
<perCoreThreadCount>false</perCoreThreadCount>
</configuration>
对于 多个运行器,还可以将并行选项设置为 classesAndMethods
或 classes
,除了 methods
之外。
<configuration>
<parallel>classesAndMethods</parallel>
useUnlimitedThreads>true</useUnlimitedThreads>
</configuration>
- 将 Surefire 插件配置 添加到
POM
中的build
部分。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<parallel>methods</parallel>
<useUnlimitedThreads>true</useUnlimitedThreads>
</configuration>
</plugin>
- 使用 Maven
install
或适当的命令来 执行POM
。这应该以并行线程模式运行。您应该看到类似于以下的结果。重要的是要注意,文件中所有的场景(scenarios.feature
)都是由 ID 为 14 的线程执行的。同样,文件中所有场景大纲的行(scenario-outlines.feature
)都是由 ID 为 13 的线程执行的。
Thread ID - 13 - Scenario Outline Row 1 from scenario-outlines feature file.
Thread ID - 13 - Scenario Outline Row 2 from scenario-outlines feature file.
Thread ID - 14 - Scenario 1 from scenarios feature file.
Thread ID - 14 - Scenario 2 from scenarios feature file.
- 要使用 Maven Failsafe 插件执行,请在
POM
中的build
部分中包含以下配置。将运行器类重命名为RunCucumberIT
。您可以在 此处 找到更多详细信息。
为了让 Failsafe 找到您的步骤定义,请确保它们位于 src/test/java 中。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.0</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<parallel>methods</parallel>
<useUnlimitedThreads>true</useUnlimitedThreads>
</configuration>
</execution>
</executions>
</plugin>
要将线程数设置为 特定数量,而不是 useUnlimitedThreads
,请使用以下设置。
<configuration>
<parallel>methods</parallel>
<threadCount>4</threadCount>
</configuration>
上面设置中的线程数为 每个核心 4 个线程。如果您希望在所有核心上使用 4 个线程,请将 perCoreThreadCount
设置为 false。
<configuration>
<parallel>methods</parallel>
<threadCount>4</threadCount>
<perCoreThreadCount>false</perCoreThreadCount>
</configuration>
对于 多个运行器,还可以将并行选项设置为 classesAndMethods
或 classes
,除了 methods
之外。
<configuration>
<parallel>classesAndMethods</parallel>
useUnlimitedThreads>true</useUnlimitedThreads>
</configuration>
TestNG
可以使用 TestNG 和 Maven 测试执行插件 并行执行 Cucumber,方法是将 dataprovider 并行选项设置为 true。在 TestNG 中,场景和场景大纲中的行在多个线程中执行。可以使用 Maven Surefire 或 Failsafe 插件来执行运行器。
可以使用 TestNG 和 Maven 测试执行插件 并行执行 Cucumber,方法是将 dataprovider 并行选项设置为 true。在 TestNG 中,场景和场景大纲中的行在多个线程中执行。可以使用 Maven Surefire 或 Failsafe 插件来执行运行器。
- 通过 扩展
AbstractTestNGCucumberTests
类并 覆盖 scenarios 方法,在src/test/java
文件夹中parallel
包(与步骤定义包的名称相同)中添加一个 Cucumber 运行器。为 DataProvider 注解设置 并行选项值为 true。
package parallel;
import org.testng.annotations.DataProvider;
import io.cucumber.testng.AbstractTestNGCucumberTests;
public class RunCucumberTest extends AbstractTestNGCucumberTests{
@Override
@DataProvider(parallel = true)
public Object[][] scenarios() {
return super.scenarios();
}
}
- 通过 扩展
AbstractTestNGCucumberTests
类并 覆盖 scenarios 方法,在src/test/kotlin
文件夹中parallel
包(与步骤定义包的名称相同)中添加一个 Cucumber 运行器。为 DataProvider 注解设置 并行选项值为 true。
package parallel
import org.testng.annotations.DataProvider;
import io.cucumber.testng.AbstractTestNGCucumberTests;
class RunCucumberTest : AbstractTestNGCucumberTests() {
@DataProvider(parallel = true)
override fun scenarios(): Array<Array<(Any)>> {
return super.scenarios()
}
}
- 将 Maven Surefire 插件配置 添加到
POM
中的build
部分。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
</plugin>
- 使用 Maven
install
或适当的命令来 执行 POM。这应该以并行线程模式运行。您应该看到类似于以下的结果。场景和场景大纲的行在不同的线程中执行。
Thread ID - 15 - Scenario Outline Row 2 from scenario-outlines feature file.
Thread ID - 14 - Scenario Outline Row 1 from scenario-outlines feature file.
Thread ID - 16 - Scenario 1 from scenarios feature file.
Thread ID - 17 - Scenario 2 from scenarios feature file.
- 要使用 Maven Failsafe 插件执行,请按照 JUnit 部分的说明设置
POM
。从configuration
部分中删除parallel
和useUnlimitedThreads
设置。
并行模式下 dataprovider 的默认 线程数 为 10。要更改此值,需要在 POM
中 Surefire 或 Failsafe 插件的 configuration
部分添加 dataproviderthreadcount
属性。
<configuration>
<properties>
<property>
<name>dataproviderthreadcount</name>
<value>20</value>
</property>
</properties>
</configuration>
如果您有 多个运行器,请将并行配置设置为 classes
以缩短执行时间。此外,可以将 threadCount
设置为所需的值,或将 useUnlimitedThreads
设置为 true。
<configuration>
<parallel>classes</parallel>
<threadCount>4</threadCount>
</configuration>
- 将 Maven Surefire 插件配置 添加到
POM
中的build
部分。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
</plugin>
- 使用 Maven
install
或适当的命令来 执行 POM。这应该以并行线程模式运行。您应该看到类似于以下的结果。场景和场景大纲的行在不同的线程中执行。
Thread ID - 15 - Scenario Outline Row 2 from scenario-outlines feature file.
Thread ID - 14 - Scenario Outline Row 1 from scenario-outlines feature file.
Thread ID - 16 - Scenario 1 from scenarios feature file.
Thread ID - 17 - Scenario 2 from scenarios feature file.
- 要使用 Maven Failsafe 插件执行,请按照 JUnit 部分的说明设置
POM
。从configuration
部分中删除parallel
和useUnlimitedThreads
设置。
并行模式下 dataprovider 的默认 线程数 为 10。要更改此值,需要在 POM
中 Surefire 或 Failsafe 插件的 configuration
部分添加 dataproviderthreadcount
属性。
<configuration>
<properties>
<property>
<name>dataproviderthreadcount</name>
<value>20</value>
</property>
</properties>
</configuration>
如果您有 多个运行器,请将并行配置设置为 classes
以缩短执行时间。此外,可以将 threadCount
设置为所需的值,或将 useUnlimitedThreads
设置为 true。
<configuration>
<parallel>classes</parallel>
<threadCount>4</threadCount>
</configuration>
CLI
io.cucumber.core.cli
包中的 Main
类用于执行特征文件。您可以直接从命令行运行此类;在这种情况下,不需要创建任何运行器类。此类的使用选项在 此处 说明。--threads
选项需要设置为 大于 1 的值 才能以并行方式运行。当使用并行模式时,场景和场景大纲中的行将在多个线程中运行。
按照以下步骤从终端 执行命令。
添加两个特征文件(
scenarios.feature
和scenario-outlines.feature
)以及 步骤定义类,如 JUnit 部分所述。打开一个 终端窗口,并导航到项目的源文件夹,在本例中为 parallel。
io.cucumber.core.cli
包中的 Main
类用于执行特征文件。您可以直接从命令行运行此类;在这种情况下,不需要创建任何运行器类。此类的使用选项在 此处 说明。--threads
选项需要设置为 大于 1 的值 才能以并行方式运行。当使用并行模式时,场景和场景大纲中的行将在多个线程中运行。
按照以下步骤从终端 执行命令。
添加两个特征文件(
scenarios.feature
和scenario-outlines.feature
)以及 步骤定义类,如 JUnit 部分所述。打开一个 终端窗口,并导航到项目的源文件夹,在本例中为 parallel。
- 编译步骤定义类。使用 -cp 选项将 包含 Cucumber jar 文件的文件夹路径 添加到类路径中。
javac -cp .;<path to cucumber jar folder>/* ./parallel/StepDefs.java
- 编译步骤定义类。使用 -cp 选项将 每个下载的 Cucumber jar 文件的路径 添加到类路径中。
kotlinc -cp .;<path to each cucumber jar> -jvm-target 1.8 ./parallel/StepDefs.kt
- 使用以下命令执行。
- 使用以下命令执行。
java -cp .;<path to cucumber jar folder>/* io.cucumber.core.cli.Main --threads 4 -g parallel parallel
java -cp .;<path to cucumber jar folder>/*;<path to kotlin lib folder>/* io.cucumber.core.cli.Main --threads 4 -g parallel parallel
- 您应该获得类似于以下的控制台输出。
Thread ID - 11 - Scenario Outline Row 1 from scenario-outlines feature file.
Thread ID - 14 - Scenario 2 from scenarios feature file.
Thread ID - 12 - Scenario Outline Row 2 from scenario-outlines feature file.
Thread ID - 13 - Scenario 1 from scenarios feature file.
- 您应该获得类似于以下的控制台输出。
Thread ID - 11 - Scenario Outline Row 1 from scenario-outlines feature file.
Thread ID - 14 - Scenario 2 from scenarios feature file.
Thread ID - 12 - Scenario Outline Row 2 from scenario-outlines feature file.
Thread ID - 13 - Scenario 1 from scenarios feature file.
时间线格式化程序
要获得线程的 可视化表示,请使用 JUnit 或 TestNG 运行器上的 CucumberOptions
注解的 plugin
选项添加 时间线报告。
要获得线程的 可视化表示,请使用 JUnit 或 TestNG 运行器上的 CucumberOptions
注解的 plugin
选项添加 时间线报告。
@CucumberOptions(plugin= {"timeline:<report folder>"})
@CucumberOptions(plugin = ["timeline:<report folder>"])
对于 CLI,可以使用以下命令。
java -cp <classpath> io.cucumber.core.cli.Main -p timeline:<report folder> --threads <thread count> -g <steps package> <path to feature files>
以下是一个示例报告。
对于 CLI,可以使用以下命令。
java -cp <classpath> io.cucumber.core.cli.Main -p timeline:<report folder> --threads <thread count> -g <steps package> <path to feature files>
以下是一个示例报告。