高度なGherkinテクニック
Eggplant Functionalでは、機能を定義するために必要な基本的なGherkinキーワードに加えて、Gherkinテストをより完全に制御するためのいくつかの追加キーワードを利用できます。これ らの高度なGherkinトピックには、以下のものが含まれており、それぞれ詳細に説明されています。
Eggplant FunctionalでGherkin機能を作成する基本情報については、「Gherkinでテストを作成する」を参照してください。
背景
背景要素を使用して、機能内のすべてのシナリオで一貫したGivenステップを定義することができます。背景は機能の最初のシナリオの前に配置され、任意の数のGivenステートメントを含めることができます。また、Givenの代わりにAndやButキーワードのエイリアスを使用することもできます。
背景定義の例は以下のようになります:
Background: app in focus
Given that the Calculator app is running
And that the app is in focus
背景要素を含む機能を実行すると、背景で概説されたGivenステップは、各シナリオが実行されるたびに実行されるため、各シナリオ内にステップを含める必要はありません。
シナリオの概要
同じアクションを変数値で複数回実行したいテストケースがある場合、ハードコーディングされた値で標準シナリオを繰り返す代わりに、シナリオの概要を使用することができます。シナリオアウトライン要素では、ステップ内の値をパラメータ化でき、それに続くExamplesというセクションのデータテーブルから値を読み取md
シナリオの概要内で含めるステップは、機能の定義で概説されている通常のシナリオと同じです。Given、When、Then(必要に応じてAnd/Butのエイリアスを含む)。変数は、<var1>
という形式で角括弧で囲んだ文字列です。任意のステップで変数を含めることができます。
機能内のシナリオの概要は、次のようになります。
Scenario Outline: Calculatorアプリでの乗算機能をチェック
Given Calculatorアプリが実行されていてフォーカスされている
And 計算機に現在の値がない
When 計算機アプリで<Number1>を<Number2>で乗算する
Then アプリは正しい<Answer>を表示する
変数を含む各ステップについて、関連するSenseTalkハンドラーには、データテーブルから変数値を受け取るためのparams
ステートメントが必要です。ステップに複数の変数が含まれている場合(上記のWhenステートメントのように)、params
ステートメントにはそれぞれの変数名が必要です。
例:
to handle I_multiply_VAR_by_VAR_in_the_calculator_app
params Number1, Number2
シナリオの概要の直後に、Examplesセクションを追加します。これは、変数に代入する値を含むデータテーブルです。データテーブルの最初の行はヘッダ行です。ヘッダ行の各項目は、変数の名前と完全に一致しなければなりません。ヘッダに続く行にはデータが入ります。行内の項目は、縦棒またはパイプ文字(|)で区切ります。
前のシナリオアウトラインの例のセクションは、次のようになるかもしれません。
Examples:
| Number1 | Number2 | Answer |
| 5 | 9 | 45 |
| 5 | 10 | 50 |
| 5 | 11 | 55 |
| 5 | 12 | 60 |
この形式に従って、必要なだけの列と行を持つデータテーブルを作成できます。
シナリオアウトラインを実行すると、データテーブルが反復処理されます。つまり、テーブル内のデータの各行に対して、変数データを含むかどうかに関係なく、すべてのステップが1回実行されます。たとえば、データの行が10行ある場合(ヘッダーの後)、シナリオアウトラインは10回完全に実行されます。
ステップのデータテーブル
ステップ定義内の特定の変数を割り当てずに、テーブルから個々のステップにデータを渡したい場合があります。そのような場合は、ステップに直接データテーブルを追加して、関連するハンドラが呼び出されたときにテーブルからすべてのデータが渡されるようにできます。
データテーブルの形式は、Examplesセクションの場合と同じで、Examplesのタイトルを省略します。ステップテキスト内で変数は使用しませんが、データテーブルにはヘッダー行が含まれます。
When I enter text in the page search field
| searchterm |
| Yellowstone |
| Grand Canyon |
| Disneyland |
| Acadia |
この形式に従って、必要なだけの列と行を持つデータテーブルを作成できます。
ステップのデータテーブルでは、データが一度にハンドラに送信されるため、シナリオやステップは反復処理されません。関連するスクリプトに記述したSenseTalkハンドラがデータの反復処理を行う必要があります。
データテーブルは、SenseTalkのプロパティリストのリストとして受け取られます。つまり、リストには、データの各行に対応する1つのアイテムがあります。リスト内の各アイテムは、キー(またはキー)がヘッダーに対応し、値がその行の渡された値であるプロパティ リストです。
リストとプロパティリストの詳細については、ListsとProperty Listsを参照してください。
Gherkinタグ
Gherkinタグ機能を使用すると、割り当てたキーワードまたはタグに基づいてGherkinテストセクションをフィルタリングできます。シナリオ、シナリオアウトライン、およびグローバルにフィーチャにタグを割り当てることができます。タグに基づいて、テストの実行時に要素を含めるか除外するかを選択できます。
タグは、@で始まる任意の文字列にすることができます(ただし、タグ名にスペース文字は無効です)。要素にタグを追加するには、要素の名前の上の行に挿入します。たとえば、シナリオにタグを適用するには、Scenario
行の上の行に追加します。
@regression
Scenario: Add two numbers on the Calculator app
要素には、必要なだけのタグを追加できます。追加のタグはスペースで区切ります。
@regression @important @sanity
Scenario: Add two numbers on the Calculator app
タグロジック
テストを実行するときに、複数のタグでフィルタリングしたい場合があります。そのため、ロジックの仕組みを理解することが重要です。
- カンマでタグを結合してORを示します(どちらか一方または他方の条件が満たされる必要があります)。
- スペースでタグを結合してANDを示します(両方の条件が満たされる必要があります)。
- ANDとORの両方の条件が存在する場合、まずORが評価されます。
ここで説明されているタグロジックのカンマとスペースは、コマンドラインコマンドの一部またはSenseTalkコマンドとして実行環境でタグを入力する方法を説明しています。これは、機能自体でタグを入力する方法とは異なります。同じ要素上の複数のタグは常にスペースで区切られます。
例:
@a,@b //実行するには、要素に@aまたは@bのいずれかが含まれている必要があります。
例:
@a @b //実行するには、要素に@aと@bの両方が含まれている必要があります。
例:
@a,@b @c //実行するには、要素に@aまたは@bのいずれかと、@cを含める必要があります。
@c @a,@b //OR条件が最初に評価されるため、この式は上の式と同じ結果になります。
実行時にタグで要素をフィルタリングする
タグでフィルタリングする方法は、使用しているテスト実行方法によって異なります。Eggplant FunctionalからGherkinテストを実行する方法については、Running Gherkin Testsを参照してください。
特定のタグがある機能要素を含めるには、機能呼び出しでパラメータとしてタグ名(@記号でタグであることを示す)をリストします。タグ名(@tagname)をリストすると、そのタグが含まれます。要素を除外するには、チルダ記号(~@tagName)で始まるタグをリストします。
Eggplant Functional内でGherkinテストを実行している場合は、エディタの上部にあるTagフィールドにタグを追加してからRun Scriptボタンを押すことができます。
アクティブな機能に追加されたタグは、Tagフィールドのドロップダウンリストに表示されます。複数のタグを追加するには、手動でフィールドに入力する必要があります。複数のタグは、Tag Logicで説明されているロジックに従います。カンマでORを示し、空白でANDを示します。
RunFeature
コママンドを使用して、SenseTalkスクリプトからGherkinテストをトリガーする場合、タグをコマンドのパラメータとして含めることができます。カンマとスペースを使用してTag Logicに従い、引用符のペアの中に複数のタグを配置できます。まだ@TagName形式を使用する必要があります。別の引用符でタグを含めると、AND条件が強制されます。
例:
RunFeature "FeatureTest1", "@important,@regression" // FeatureTest1を実行しますが、@importantタグまたは@regressionタグのいずれかが付けられた要素のみを実行します。
例:
RunFeature "FeatureTest1", "@important ~@regression" // FeatureTest1を実行しますが、@記号で示されるタグを含め、チルダ"~"の使用で示されるタグを除外する要素のみを含めます。この場合、@important要素が含まれ、@regressionタグが付けられた要素が除外されます。
最後に、コマンドラインからGherkinテストを実行する場合、runscript
コマンドにタグをパラメータとして含めることができます。単一の-param
ステートメント内に複数のタグを含めることができ、引用符で囲まれています。その場合、要素はTag Logicで説明されているロジックに従います。カンマでORを示し、空白でANDを示します。別の-param
ステートメントを使用してAND条件を強制することができます。
次のコマンドは、CalcTestingフィーチャの@sanityタグが付いた要素を実行します。
runscript CalcTesting.feature -param "@sanity"
ロジック条件とタグの配置をうまく活用することで、実行する要素を正確に制御できます。次の例では、実行する要素には@billingタグと、@overタグまたは@rcvdタグのどちらかが必要です。
runscript AccountingApp.feature -param "@over,@rcvd" -param "@billing"
@記号インジケータなしでタグが送信されると、同じ引用符で囲まれた文字列内の他のタグも無視されます。たとえば、以下のいずれかの例では、Appleタグに@記号がないため、Appleタグと@Orangeタグの両方が無視されます。
RunFeature someFeature, "Apple @Orange" // SenseTalkはこれを有効な構文として認識しますが、Appleタグが無効であるため、すべてのタグが無視され、指定されたタグなしでsomeFeatureが実行されます。