自從4.0.0 版本以來,Cucumber-JVM 允許跨多個執行緒進行平行執行。
在 Cucumber 專案中整合此內建功能有多種選項。你可以使用以下方式進行:
對於每個選項,本教學將探討專案設定、配置設定和執行命令。
自從4.0.0 版本以來,Cucumber-JVM 允許跨多個執行緒進行平行執行。
在 Cucumber 專案中整合此內建功能有多種選項。你可以使用以下方式進行:
對於每個選項,本教學將探討專案設定、配置設定和執行命令。
JUnit 5
可以使用 JUnit 平台平行執行 Cucumber 案例。
請參閱cucumber-junit-platform-engine 文件以獲取詳細資訊。
可以使用 JUnit 平台平行執行 Cucumber 案例。
請參閱cucumber-junit-platform-engine 文件以獲取詳細資訊。
JUnit 4
可以使用 JUnit 和 Maven 測試執行外掛程式平行執行 Cucumber。在 JUnit 中,功能檔案是以平行方式執行,而不是案例,這表示功能檔案中的所有案例將由同一執行緒執行。你可以使用 Maven Surefire 或 Failsafe 外掛程式來執行執行器。
使用cucumber-archetype或透過將 Cucumber 相依性新增至 POM,如此處所述,以及 JUnit 相依性,如此處所述,在你最喜歡的 IDE 中建立 Maven 專案。
在
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或透過將 Cucumber 相依性新增至 POM,如此處所述,以及 JUnit 相依性,如此處所述,在你最喜歡的 IDE 中建立 Maven 專案。
在
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 |
- 將 step 定義類別新增至
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);
}
}
- 將 step 定義類別新增至
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
資料夾中,使用RunWith
註解在parallel
套件中(與 step 定義套件同名)新增 Cucumber 執行器。
- 在
src/test/kotlin
資料夾中,使用RunWith
註解在parallel
套件中(與 step 定義套件同名)新增 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 找到您的 step 定義,請確保它們位於 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>
在多個執行器的情況下,除了 methods
之外,還可以將 parallel 選項設定為 classesAndMethods
或 classes
。
<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 找到您的 step 定義,請確保它們位於 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>
在多個執行器的情況下,除了 methods
之外,還可以將 parallel 選項設定為 classesAndMethods
或 classes
。
<configuration>
<parallel>classesAndMethods</parallel>
useUnlimitedThreads>true</useUnlimitedThreads>
</configuration>
TestNG
透過將 dataprovider parallel 選項設定為 true,可以使用 TestNG 和 Maven 測試執行外掛程式平行執行 Cucumber。在 TestNG 中,案例和案例大綱中的列會以多個執行緒執行。您可以使用 Maven Surefire 或 Failsafe 外掛程式來執行執行器。
透過將 dataprovider parallel 選項設定為 true,可以使用 TestNG 和 Maven 測試執行外掛程式平行執行 Cucumber。在 TestNG 中,案例和案例大綱中的列會以多個執行緒執行。您可以使用 Maven Surefire 或 Failsafe 外掛程式來執行執行器。
- 透過擴充
AbstractTestNGCucumberTests
類別並在src/test/java
資料夾中的parallel
套件中(與 step 定義套件同名)覆寫 scenarios 方法,新增 Cucumber 執行器。將 DataProvider 註解的 parallel 選項值設定為 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
類別並在src/test/kotlin
資料夾中的parallel
套件中(與 step 定義套件同名)覆寫 scenarios 方法,新增 Cucumber 執行器。將 DataProvider 註解的 parallel 選項值設定為 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
設定。
平行模式下資料提供程式的預設執行緒計數為 10。若要變更此值,需要將 dataproviderthreadcount
屬性新增至 POM
中 Surefire 或 Failsafe 外掛程式的 configuration
區段。
<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
設定。
平行模式下資料提供程式的預設執行緒計數為 10。若要變更此值,需要將 dataproviderthreadcount
屬性新增至 POM
中 Surefire 或 Failsafe 外掛程式的 configuration
區段。
<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
) 和 step 定義類別,如 JUnit 區段中所述。開啟終端機視窗並導覽至專案的來源資料夾,在本例中為 parallel。
io.cucumber.core.cli
套件中的 Main
類別用於執行功能檔案。你可以直接從命令列執行此類別;在這種情況下,不需要建立任何執行器類別。此類別的使用選項在此處提及。需要將 --threads
選項設定為大於 1 的值,才能以平行方式執行。當使用平行模式時,案例和案例大綱中的列將以多個執行緒執行。
請按照以下步驟,從終端機執行命令。
新增兩個功能檔案 (
scenarios.feature
和scenario-outlines.feature
) 和 step 定義類別,如 JUnit 區段中所述。開啟終端機視窗並導覽至專案的來源資料夾,在本例中為 parallel。
- 編譯 step 定義類別。使用 -cp 選項將包含 Cucumber jar 的資料夾的路徑新增至類別路徑。
javac -cp .;<path to cucumber jar folder>/* ./parallel/StepDefs.java
- 編譯 step 定義類別。使用 -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>
以下是範例報告。