Cucumber-JVM は、バージョン 4.0.0 以降、複数のスレッドで並列実行を可能にします。
Cucumber プロジェクトにこの組み込み機能を取り込むには、いくつかのオプションがあります。以下の方法で使用できます
これらのオプションごとに、このチュートリアルでは、プロジェクトのセットアップ、構成設定、および実行コマンドについて説明します。
Cucumber-JVM は、バージョン 4.0.0 以降、複数のスレッドで並列実行を可能にします。
Cucumber プロジェクトにこの組み込み機能を取り込むには、いくつかのオプションがあります。以下の方法で使用できます
これらのオプションごとに、このチュートリアルでは、プロジェクトのセットアップ、構成設定、および実行コマンドについて説明します。
JUnit 5
Cucumber シナリオは、JUnit プラットフォームを使用して並列で実行できます。
詳細については、cucumber-junit-platform-engine ドキュメントを参照してください。
Cucumber シナリオは、JUnit プラットフォームを使用して並列で実行できます。
詳細については、cucumber-junit-platform-engine ドキュメントを参照してください。
JUnit 4
Cucumber は、JUnit および Maven テスト実行プラグインを使用して並列で実行できます。 JUnit では、シナリオではなくフィーチャーファイルが並列で実行されます。つまり、フィーチャーファイル内のすべてのシナリオが同じスレッドで実行されます。ランナーを実行するには、Maven Surefire プラグインまたは Failsafe プラグインのいずれかを使用できます。
cucumber-archetype を使用するか、こちらに詳細が記載されているように POM に Cucumber 依存関係を追加して、お気に入りの IDE で Maven プロジェクトを作成します。および こちらの Junit 依存関係を追加します。
src/test/resources
パスに parallel フォルダー (またはその他の名前) を作成し、その中に 2 つのフィーチャーファイル (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 |
Cucumber は、JUnit および Maven テスト実行プラグインを使用して並列で実行できます。 JUnit では、シナリオではなくフィーチャーファイルが並列で実行されます。つまり、フィーチャーファイル内のすべてのシナリオが同じスレッドで実行されます。ランナーを実行するには、Maven Surefire プラグインまたは Failsafe プラグインのいずれかを使用できます。
cucumber-archetype を使用するか、こちらに詳細が記載されているように POM に Cucumber 依存関係を追加して、お気に入りの IDE で Maven プロジェクトを作成します。および こちらの Junit 依存関係を追加します。
src/test/resources
パスに parallel フォルダー (またはその他の名前) を作成し、その中に 2 つのフィーチャーファイル (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>
複数のランナーの場合、methods
に加えて、並列オプションを 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 がステップ定義を見つけられるように、それらが 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
に加えて、並列オプションを classesAndMethods
または classes
に設定することもできます。
<configuration>
<parallel>classesAndMethods</parallel>
useUnlimitedThreads>true</useUnlimitedThreads>
</configuration>
TestNG
Cucumber は、dataprovider の並列オプションを true に設定することにより、TestNG および Maven テスト実行プラグインを使用して並列で実行できます。 TestNG では、シナリオとシナリオアウトラインの行が複数のスレッドで実行されます。ランナーを実行するには、Maven Surefire プラグインまたは Failsafe プラグインのいずれかを使用できます。
Cucumber は、dataprovider の並列オプションを true に設定することにより、TestNG および Maven テスト実行プラグインを使用して並列で実行できます。 TestNG では、シナリオとシナリオアウトラインの行が複数のスレッドで実行されます。ランナーを実行するには、Maven Surefire プラグインまたは Failsafe プラグインのいずれかを使用できます。
AbstractTestNGCucumberTests
クラスを拡張し、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
クラスを拡張し、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 です。これを変更するには、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
設定を削除します。
並列モードでの dataprovider のデフォルトのスレッド数は 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 より大きい値に設定する必要があります。並列モードを使用すると、シナリオとシナリオアウトラインの行が複数のスレッドで実行されます。
ターミナルからコマンドを実行するには、次の手順に従います。
JUnit セクションで説明したように、2 つのフィーチャーファイル (
scenarios.feature
およびscenario-outlines.feature
) と ステップ定義クラスを追加します。ターミナルウィンドウを開き、プロジェクトのソースフォルダー (この場合は parallel) に移動します。
io.cucumber.core.cli
パッケージの Main
クラスは、フィーチャーファイルを実行するために使用されます。このクラスはコマンドラインから直接実行できます。その場合、ランナークラスを作成する必要はありません。このクラスの使用オプションは、こちらに記載されています。並列で実行するには、--threads
オプションを 1 より大きい値に設定する必要があります。並列モードを使用すると、シナリオとシナリオアウトラインの行が複数のスレッドで実行されます。
ターミナルからコマンドを実行するには、次の手順に従います。
JUnit セクションで説明したように、2 つのフィーチャーファイル (
scenarios.feature
およびscenario-outlines.feature
) と ステップ定義クラスを追加します。ターミナルウィンドウを開き、プロジェクトのソースフォルダー (この場合は 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>
以下はレポートのサンプルです。