はじめに
Cucumber を使い始めるにはどうすればよいですか?
ゼロから始めるには、10 分チュートリアルをお試しください。
動作するプロジェクトから始めたい場合(またはチュートリアルがうまくいかない場合)は、cucumber-java-skeletonから始めることができます。このプロジェクトは、「すぐに使える」ように設計されています。
Gherkin、Cucumber、BDDの詳細については、これらのドキュメントをご覧ください。Cucumber と BDD に関するいくつかのブログ記事へのリンクもあります。
より詳細な情報はどこで入手できますか?
さらに詳しく知りたい場合は、次のいずれかをお試しください。
どこでヘルプを入手できますか?
質問がある場合は、コミュニティに連絡してください。
Cucumber のインストールと実行
Cucumber をインストールするにはどうすればよいですか?
Cucumber のインストール方法は、使用しているプログラミング言語によって異なります。
Cucumber のインストール方法については、インストールページをご覧ください。
どのバージョンの Cucumber を使用すればよいですか?
一般的に、プログラミング言語の最新リリースバージョンの Cucumber を使用することをお勧めします。各リリースでは、既知のバグが修正されたり、新しい機能が追加されたりします。
Cucumber の最新バージョンは、10 分チュートリアル、インストールページ、またはGitHubで見つけることができます。
Cucumber-JVM v2.x では、groupId
が info.cukes
から io.cucumber
に変更されていることに注意してください。 1.2.5 より新しいバージョンが見つからない場合は、依存関係の groupId を変更してください。
アップグレード
Cucumber は、リリース番号にSemVer仕様に従おうとしています。基本的に、これは次のことを意味します。
- リリースの右端(パッチ)番号のみが変更された場合は、心配する必要はありません。
- リリースの真ん中の番号(マイナー)が変更された場合は、心配する必要はありません。
- 左端(メジャー)番号が変更された場合は、問題が発生する可能性があります。
すべてのリリースの変更点については、変更ログファイルをご覧ください。
すべてのリリースの変更点については、変更ログファイルをご覧ください。
すべてのリリースの変更点については、変更ログファイルをご覧ください。
すべてのリリースの変更点については、変更ログファイルをご覧ください。
Cucumber を実行するにはどうすればよいですか?
Cucumber の実行方法については、Cucumber の実行をご覧ください。
CLI から Cucumber を実行するにはどうすればよいですか?
Cucumber CLI の実行方法については、コマンドラインからをご覧ください。
Cucumber を実行するための構成オプションは何ですか?
構成オプションについては、構成をご覧ください。
JUnit 5 を使用する場合は、cucumber-junit-platform-engine ドキュメントを参照してください。
JUnit 4 で Cucumber を実行する場合、JUnit 4 がテストを実行する方法についていくつかのオプションを指定できます。詳細については、JUnitのセクションを確認してください。使用可能な CucumberOptions の詳細については、コードを確認してください。
JUnit 5 を使用する場合は、cucumber-junit-platform-engine ドキュメントを参照してください。
JUnit 4 で Cucumber を実行する場合、JUnit 4 がテストを実行する方法についていくつかのオプションを指定できます。詳細については、JUnitのセクションを確認してください。使用可能な CucumberOptions の詳細については、コードを確認してください。
Cucumber はステップが未定義であると言っていますが、ステップ定義を実装しました!
ステップ定義を定義しているにもかかわらず、Cucumber がステップが未定義であると表示される場合、Cucumber がステップ定義を*見つける*ことができないことを意味します。ステップ定義へのパス (glue パス) が正しく指定されていることを確認する必要があります。
デフォルトでは、Cucumber-JVM はランナークラスのパッケージ (またはサブパッケージ) を検索します。 Cucumber-JVM にどのパッケージ (およびサブパッケージ) を検索するかを明示的に指示することもできます。
@CucumberOptions(glue = {"<package>", "<package>", "<etc>"})
public class RunCucumberTest{}
@CucumberOptions(glue = ["<package>", "<package>", "<etc>"])
class RunCucumberTest
デフォルトでは、Cucumber-JVM はランナークラスのパッケージ (またはサブパッケージ) を検索します。 Cucumber-JVM にどのパッケージ (およびサブパッケージ) を検索するかを明示的に指示することもできます。
@CucumberOptions(glue = {"<package>", "<package>", "<etc>"})
public class RunCucumberTest{}
@CucumberOptions(glue = ["<package>", "<package>", "<etc>"])
class RunCucumberTest
Cucumber 式と正規表現
Cucumber 式の詳細については、Cucumber 式のセクションを参照してください。正規表現 (regex) も引き続き使用できますが、同じステップ定義で Cucumber 式と正規表現を使用することはできません。
Cucumber 式は Cucumber-JVM バージョン 3.0.0 で追加されました。
正規表現を使用するステップ定義は `^` で始まり `$` で終わりますが、Cucumber 式を使用するステップ定義はそうではないことに注意してください。
正規表現を使用した例
@Given("^today is ([0-9]{4}-[0-9]{2}-[0-9]{2})$")
public void today_is(Date date) {
calculator = new DateCalculator(date);
}
Cucumber 式を使用した例
@When("I add {int} and {int}")
public void adding(int arg1, int arg2) {
calc.push(arg1);
calc.push(arg2);
calc.push("+");
}
Cucumber 式は Cucumber-JVM バージョン 3.0.0 で追加されました。
正規表現を使用するステップ定義は `^` で始まり `$` で終わりますが、Cucumber 式を使用するステップ定義はそうではないことに注意してください。
正規表現を使用した例
@Given("^today is ([0-9]{4}-[0-9]{2}-[0-9]{2})$")
public void today_is(Date date) {
calculator = new DateCalculator(date);
}
Cucumber 式を使用した例
@When("I add {int} and {int}")
public void adding(int arg1, int arg2) {
calc.push(arg1);
calc.push(arg2);
calc.push("+");
}
ラムダ式を使用してステップ定義を定義するにはどうすればよいですか?
ラムダ式は Java と Kotlin に固有です。
ラムダ式は Java と Kotlin に固有です。
ラムダ式を使用してステップ定義を定義するには、cucumber-java
依存関係の代わりに cucumber-java8
依存関係を使用してください。必要な依存関係はこちらにあります。
ラムダ式を使用してステップ定義を定義するには、cucumber-java
依存関係の代わりに cucumber-java8
依存関係を使用してください。必要な依存関係はこちらにあります。
使用方法の例については、こちらのコード例を参照してください。
使用方法の例については、こちらのコード例を参照してください。
他のステップまたはシナリオを呼び出すにはどうすればよいですか?
各シナリオは独立している必要があります。シナリオ同士が干渉することなく、任意の順序または並列で実行できる必要があります。
各シナリオは1つのことだけをテストする必要があります。そうすることで、失敗した場合、明確な理由で失敗します。これは、1つのシナリオを別のシナリオ内で再利用しないことを意味します。
シナリオで同じまたは類似のステップを使用する場合、またはシステムで類似のアクションを実行する場合は、それらの処理を行うためにヘルパーメソッドを抽出できます。
ヘルパーメソッドの使用方法
ヘルパーメソッドを使用すると、ステップでアクションを再利用し、類似の動作に対して複数のステップ定義を記述することを回避できます。アプリケーションへのログインなどのアクションのヘルパーメソッドを記述し、それをステップとして、または他のステップの一部として再利用します。これは、テストをクリーンで簡潔、かつ保守しやすい状態に保つのに役立ちます。
ヘルパーメソッドの使用の詳細については、ヘルパーメソッドとステップ定義のグループ化を参照してください。
シナリオはどの程度詳細にする必要がありますか?
シナリオには、システムの動作を記述するのに十分な情報のみを含める必要があります。アプリケーションの実装は変更される可能性があるため、記述しないでください。変更されるとテストが失敗する可能性があります。実際の動作から注意がそれるため、詳細が多すぎてはなりません。
例を挙げて説明しましょう。ユーザーに結果が通知されるプロセスがあるとします。現時点では、電子メールを送信することで実装されている可能性がありますが、将来的には変更される可能性があります(たとえば、テキストメッセージに変更されるなど)。ステップは次のように指定できます。
Then the user will be notified
このように、ユーザーへの通知方法の実装が変更された場合、ステップ自体とすべての基礎となるコードではなく、ステップ定義(またはそのステップ定義によって呼び出されるヘルパーメソッド)のみを変更する必要があります。
詳細については、より良いGherkinの記述または保守可能な自動受け入れテストの記述(pdf)を参照してください。
Excel / csvでテストケースを指定するにはどうすればよいですか?
Excelまたはcsvファイルを使用してテストケースを定義することはお勧めしません。Excelまたはcsvファイルの使用はアンチパターンと見なされます。
Cucumberの目標の1つは、実行可能な仕様を持つことです。これは、機能ファイルには、システムの予期される動作を文書化するのに適切なレベルの情報のみを含める必要があることを意味します。テストケースが別のファイルに保存されている場合、ドキュメントを読み取るにはどうすればよいでしょうか?
これは、機能ファイルに詳細が多すぎてはならないことも意味します。詳細が多すぎる場合は、ステップ定義またはヘルパーメソッドに移動することを検討してください。たとえば、多数の異なるフィールドに入力する必要があるフォームがある場合は、ビルダーパターンを使用できます。
Cucumberで条件付きでステップをスキップするにはどうすればよいですか?
各シナリオは1つのことをテストし、1つの特定の理由で失敗する必要があります。これは、ステップをスキップする理由がないことを意味します。
条件付きでステップをスキップしたい理由があると思われる場合は、アンチパターンが発生している可能性があります。たとえば、1つのシナリオで複数のことをテストしようとしているか、テスト環境またはテストデータの状態を制御できていない可能性があります。
ここで最善の策は、根本原因を修正することです。
失敗したステップの後にスキップされたステップを実行するようにCucumberを設定するにはどうすればよいですか?
Cucumberは、設計上、失敗したステップの後のすべてのステップをスキップします。ステップが失敗すると、テストは失敗し、次のステップを実行する理由はありません。追加のステップを実行する必要がある場合は、シナリオで一度に多すぎることをテストしている可能性があります。シナリオを小さなテストに分割することを検討してください。
(失敗した)ステップ後にスクリーンショットを撮る
シナリオが失敗したときにスクリーンショットを撮ると、何が問題だったのかを把握するのに役立つ場合があります。失敗時にスクリーンショットを撮るには、アフターフックを設定できます。
失敗したシナリオのWebDriverWebDriverWebDriverCapybaraでスクリーンショットを撮り、Cucumberのレポートに埋め込む方法の例については、ブラウザ自動化ページを参照してください。
WebDriverを使用してスクリーンショットを撮る方法の例を以下に示します。失敗したシナリオのスクリーンショットを撮り、Cucumberのレポートに埋め込む方法の例を以下に示します。
WebDriverを使用してスクリーンショットを撮る方法の例を以下に示します。失敗したシナリオのスクリーンショットを撮り、Cucumberのレポートに埋め込む方法の例を以下に示します。
WebDriverを使用してスクリーンショットを撮る方法の例を以下に示します。失敗したシナリオのスクリーンショットを撮り、Cucumberのレポートに埋め込む方法の例を以下に示します。
すべてのステップの後にスクリーンショットを撮ることはアンチパターンと見なされることに注意してください。シナリオのすべてのステップをスクリーンショットで確認しなくても、テストの自動化に頼ることができるはずです。自動化は安定しており、テストは明確な理由で失敗する必要があります。
コンソール出力に奇妙な文字が表示される
ステップの出力に[32m
のような奇妙な文字が追加されている場合、これはANSIカラーコードのエスケープの問題です。
これは、Javaを使用する場合に発生する可能性のある問題です。
これは、Javaを使用する場合に発生する可能性のある問題です。
この問題を防ぐために、オプションmonochrome
を`true`に設定できます。
Eclipseを使用している場合は、このプラグインを試してみてください。
この問題を防ぐために、オプションmonochrome
を`true`に設定できます。
Eclipseを使用している場合は、このプラグインを試してみてください。
ステップ間で状態を共有するにはどうすればよいですか?
ステップ間で状態を共有するには、ワールドオブジェクトを使用できます。
ステップ間で状態を共有するには、ワールドオブジェクトを使用できます。
JVMでCucumberを使用している場合は、依存性注入(DI)を使用してステップ間で状態を共有できます。
プロジェクトでCucumberがサポートする依存性フレームワークを既に使用している場合(および/またはそれらのいずれかに精通している場合)、そのフレームワークを使用するのがおそらく最も簡単です。そうでない場合、Picocontainerは使用できる最も軽量なフレームワークです。
JVMでCucumberを使用している場合は、依存性注入(DI)を使用してステップ間で状態を共有できます。
プロジェクトでCucumberがサポートする依存性フレームワークを既に使用している場合(および/またはそれらのいずれかに精通している場合)、そのフレームワークを使用するのがおそらく最も簡単です。そうでない場合、Picocontainerは使用できる最も軽量なフレームワークです。
アリティの不一致
アリティの不一致例外cucumber.runtime.CucumberException: Arity mismatch
cucumber.runtime.CucumberException: Arity mismatch
は、ステップがステップ定義に必要な正しい数の引数を指定していないことを示します。
ステップ定義の重複
DuplicateStepDefinitionExceptionは、同じステップを2回定義したことを示します。まず、Cucumberはステップのマッチング時に、特定のステップで使用されるキーワードを区別しません。これは、Given an order exists
とThen an order exists
の両方が「an order exists」に一致することを意味します。Cucumber式または正規表現を使用して引数を指定する場合、複数のステップが同じ式に一致する可能性があります。最終的に、これはステップ定義を定義するクラスを拡張できないことを意味します。拡張すると重複が発生するためです。
Cucumber-JVMはKotlinをサポートしていますか?
Cucumber-JVMを使用して、Kotlinでステップ定義を記述できます。cucumber-jvmのKotlinの例をご覧ください。現時点では、Kotlinでステップ定義を生成することはできません。その理由は、Kotlinバックエンドが実装されていないためです。これに取り組みたい場合は、リクエストがあります。CucumberのネイティブKotlin実装のリクエストもあります。
CucumberがIntelliJ IDEAでステップ定義を見つけられない
このインスタンスでは、IntelliJ IDEAで新しい実行構成を設定する必要があります。1. IntelliJ IDEAのメニューから**実行**>**構成の編集**をクリックします。2. 左上の**+**アイコンをクリックし、*cucumber*と入力します。**Cucumber Java**を選択します。3. JetBrainsの実行/デバッグ構成Cucumber Javaの手順に従って構成を作成します。
IntelliJ IDEAがステップ定義を含むパッケージを認識しない場合は、Glueフィールドにパッケージ名(例:*stepdefs*)を入力して手動で指定できます。
詳細については、JetBrainsドキュメントのCucumberテストの実行を参照してください。
スタックトレースに「public cucumber.runtime.java.JavaBackendのインスタンス化に失敗しました」または「NoSuchMethodException」が含まれるCucumber-JVMエラーを修正するにはどうすればよいですか?
すべてのCucumber依存関係でCucumberのバージョンが同じであることを確認し、必要な依存関係のみがあることを確認してください。これは、使用しているCucumberのバージョンに付随する推移的な依存関係を取得する必要があることを意味します。
mvn dependency:tree
を実行すると、推移的な依存関係を含むすべてのMaven依存関係を確認できます。
Cucumber(推移的な依存関係)への依存関係も含まれる他のライブラリを使用している場合は、pomファイル内でその推移的な依存関係を除外して、Cucumberのバージョンが1つだけ参照されるようにしてください。推移的な依存関係を除外する手順については、Mavenの依存関係の除外に関する手順を参照してください。