メインコンテンツまでスキップ

高度な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つのアイテムがあります。リスト内の各アイテムは、キー(またはキー)がヘッダーに対応し、値がその行の渡された値であるプロパティリストです。

リストとプロパティリストの詳細については、ListsProperty 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

#logic

テストを実行するときに、複数のタグでフィルタリングしたい場合があります。そのため、ロジックの仕組みを理解することが重要です。

  • カンマでタグを結合して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ボタンを押すことができます。

Insert tags for Gherkin test runs from the editor in eggPlant Functional

アクティブな機能に追加されたタグは、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が実行されます。

コマンドラインで実行する際にパラメータとしてタグを渡す場合も同様です。以下の例では、「over」と「@rcvd」の両方のタグが無視されます。というのも、「over」に@記号がないからです。

runscript AccountingApp.feature -param "over,@rcvd" -param "@billing"

タグの継承

タグは親要素から継承されます。つまり、別の要素に含まれるすべての要素は、その要素に適用されたタグを継承します。たとえば、フィーチャにタグを追加すると、そのフィーチャ内のすべてのシナリオとシナリオアウトラインもそのタグを持っているとみなされます。

この継承プロパティを念頭に置いて、タグを効果的にフィルタリングできるようにすることが重要です。

イベントフック

Gherkinテストには、イベントの前または後に特定のアクションを自動的に実行するhooksを定義できます。フックはフィーチャ、シナリオ、およびステップに関連付けることができます。

フックは、関連するSenseTalkスクリプトのハンドラとして作成されます。Gherkinフィーチャ自体内では特に参照されません。適切な名前のハンドラがSenseTalkスクリプトにある場合、必要に応じて実行されます。たとえば、各シナリオの実行前にフックを実行するには、次のようなハンドラを含めます。

to handle hook_before_scenario
params ScenarioInfo
<enter your custom code here>
end hook_before_scenario

Gherkinステップに関連付けられた他のハンドラと同様に、ハンドラ内で必要なアクションを定義できます。フックに重要なのは名前です。この場合、hook_before_scenarioは各シナリオの前に実行するハンドラの名前でなければなりません。

フックハンドラの利用可能な名前は次のとおりです。

  • hook_before_scenario
  • hook_after_scenario
  • hook_before_feature
  • hook_after_feature
  • hook_before_step
  • hook_after_step

各フックは、paramsステートメント内のパラメータを受け取ります。これは、2つのプロパティを持つプロパティリストです。フィーチャとシナリオの場合、プロパティリストにはフィーチャまたはシナリオ名と、説明がある場合は説明が含まれます。ステップの場合、プロパティリストにはステップ名(たとえば、Given、When)が最初のプロパティとして、2番目のプロパティとして行のテキストが含まれます。

SenseTalkプロパティリストの詳細については、Property Listsを参照してください。