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

Creating Tests with Gherkin

Eggplant FunctionalでGherkinを使用してテストを作成する場合、特定のGherkinキーワードと自然言語を使用して、テストシナリオを高いレベルで説明します。その結果、テストされる機能、それをテストするために使用されるさまざまなシナリオ、および各シナリオの期待される結果を説明しやすいテストファイルが得られるはずです。

Gherkinコードのステップは、テスト対象のシステム(SUT)に対してアクションを実行するSenseTalkハンドラにリンクされています。Gherkinテストを「人間が読める」言語で開発したら、必要なSenseTalkハンドラを簡単に生成できます。

フィーチャの定義

Eggplant FunctionalのGherkin実装は、言語の標準ルールに従います。ここではGherkinの基本的な使い方を説明しますが、より完全な情報については、CucumberのGherkinリファレンスを参照してください。

Gherkinテストは、フィーチャとして作成され、.featureファイルとして保存されます。フィーチャの各行は、一般的にGherkinキーワードで始まるか、空白でなければなりません。

最初の行はキーワードFeature:で始まります。コロン(:)はキーワードの一部であることに注意してください。Feature:キーワードは、同じ行に名前や説明が続くことができます。このキーワードの後の行を使用して、フィーチャが期待される動作やテストを追加で説明または説明することができます。

ノート

説明に使用される追加の行は、認識可能なGherkinキーワードで始まってはなりません。この規則の例外は、Feature:およびScenario:キーワードに続く行で、コメントテキストとして使用している行にのみ適用されます。

シナリオはフィーチャの残りの部分を埋めます。シナリオは、フィーチャをテストするために使用される特定のシーケンスを説明します。通常、シナリオは初期または与えられた状況を説明し始め、実行されるアクションやアクションを説明し、期待される結果を定義することで終わります。

シナリオはキーワードScenario:で始まります。再度、コロン(:)はキーワードの一部として必要です。Scenario:キーワードは、同じ行に名前や説明が続くことができます。Feature:キーワードと同様に、このキーワードの後の行を使用して、シナリオが期待する動作やテストを追加で説明または説明することができます。説明に使用される行は、認識可能なGherkinキーワードで始まってはなりません

シナリオはステップで構成され、各ステップはGherkinキーワードに続いて、ステップの目的を説明する自然言語で始まります。ステップのキーワードは次のとおりです:

  • Given: このキーワードを使用して、初期の状況やコンテキストを説明します。同じシナリオ内で複数のGivenステップを使用したり、このステップを省略したりすることができます。
  • When: このキーワードは一般的に、シナリオのイベントやアクションを説明します。これをこのシナリオでテストしている条件と考えることができます。同じシナリオ内で複数のWhenステップを含めたり、このステップを省略したりすることができます。
  • Then: このステップは、シナリオの期待結果を説明します。他のキーワードと同様に、複数の Then ステップを含めたり、このステップを省略したりすることができます。通常、このステップは期待結果のアサーションとして述べたいと思うもので、これを実際の結果と比較してテストします。
  • And, But: 読みやすさのために、特定のステップが複数回ある場合は、キーワード And または But を使用できます。例えば、設定したい Given の状況が3つある場合は、最初のものに Given キーワードを使用し、追加の2ステップに And キーワードを使用することができます。以下の例を参照してください。

ステップキーワードでは、コロンは使用しません。キーワードの後には、特定のステップやテストを説明する言葉を同じ行に追加します。このテキストは何でも構いません。厳密にはコードではありませんが、SUT上でテスト、検証、その他のアクションを実行するために書くSenseTalkハンドラーにリンクしています。

サンプルのシナリオは以下のようになる可能性があります:

Scenario: Add two numbers on the Calculator app
Given that the Calculator app is running and in focus
And there is no current value in the calculator
When you add 3 and 5
Then the value displayed should be 8

フィーチャーには、好きなだけシナリオを追加することができます。通常、各シナリオはフィーチャーの特定のテストを説明します。

シナリオはGherkinフィーチャーの基本的なテスト要素です。しかし、Eggplant Functionalは、より複雑なテストシナリオを作成するために使用できるいくつかの手法をサポートしています。追加の機能については、Advanced Gherkin Techniquesを参照してください。

ステップバイステップ:Gherkinテストの作成

Eggplant FunctionalエディターでGherkinコードを使用してテストを作成するための以下のガイドを使用します。

  1. 新しいフィーチャーを作成するには、スイートウィンドウのフィーチャーズペインで右クリックし、新規フィーチャーを選択します。Mac OS Xでは、ペインの上部にあるギアアイコンをクリックして新規フィーチャーを選択することもできます。新しい、無題のフィーチャーがエディターに開きます。最初のコード行、Feature:Scenario:が自動的に入力され、あなたのカスタマイズのために準備ができていることに注意してください。
  2. .featureファイルに名前を付けるために、フィーチャーズペインでそれを更新します。シナリオステップのSenseTalkハンドラーを生成すると(ステップ6)、Eggplant Functionalはそれらを同じ名前のスクリプトに入れ、スクリプトがまだ存在しない場合は作成します。 注:すでにスイートに存在するスクリプトと同じ名前のフィーチャーを命名すると、生成されたハンドラーはそのスクリプトに追加されます。
  3. Feature:行に、フィーチャーの説明的な名前を入力します。これにより、ファイルを読む人はそれが何をテストするために設計されているのかを知ることができます。必要に応じて、Feature:Scenario:キーワードの間の行に追加の説明を追加します。上述のように、このスペースはコメントや説明文のために予約されています。
  4. Scenario:行に、シナリオの説明的な名前を入力します。必要に応じて、Scenario:キーワードの後とステップキーワードの前の行にシナリオの追加の説明を追加することができます。
  5. GivenWhen、そしてThenのキーワードを入力し、それぞれのステップの説明文を続けます。各タイプのキーワードを複数回含めることができること、または(AndまたはButを使用する場合)、作成するシナリオに合わせてそれらのキーワードステップをスキップまたは省略することができることを覚えておいてください。つまり、ステップは必須ではありません。
  6. ステップに対応するSenseTalkハンドラを生成するには、ステップを右クリックし、Show or Generate Handler を選択します。スクリプトエディタが開き、適切なハンドラがハイライトされます。スクリプト自体がまだ作成されていない場合、Eggplant Functionalは.featureファイルと同じ名前のスクリプトを作成します。 Eggplant Functionalがハンドラを生成し、名前を付ける方法についての詳細は、Gherkin Stepsからハンドラを生成するを参照してください。
  7. スクリプトエディタで、ステップの必要なアクションを実行するためのSenseTalkコードをハンドラに記述します。SenseTalkハンドラについての詳細情報は、Handlersと、Reusing Codeの"Handlers"セクションを参照してください。
  8. 必要に応じてFeatureに追加のシナリオを追加し、ステップ四から七を繰り返します。

Featureテストを実行すると、各ステップが関連するSenseTalkハンドラを呼び出します。Gherkinテストの実行についての詳細情報は、Eggplant FunctionalでのGherkinテストの実行を参照してください。

Gherkin Stepsからハンドラを生成する

Gherkinステップのハンドラを生成するには、ステップのテキストのどこかを右クリックし、Show or Generate Handler を選択します。ハンドラが既に存在する場合、エディタは関連するスクリプトを開き、ハンドラの最初の行をハイライトします。

ハンドラが存在しない場合、Eggplant Functionalは適切なスクリプトに空のハンドラを作成します。つまり、ハンドラの開始コード行と終了コード行を作成します。次に、ハンドラが実行する特定のSenseTalkコードを記述する必要があります。

ハンドラの名前は、Gherkinステップのテキストから生成され、キーワード自体は除外されます。スペースや特殊文字はアンダースコア(_)に変換されます。例えば、ステップが

When
you enter the first number in the calculator app

だった場合、SenseTalkスクリプト内の生成されたハンドラは以下のようになります:

to handle you_enter_the_first_number_in_the_calculator_app

end you_enter_the_first_number_in_the_calculator_app

Gherkinのテキストをハンドラを生成した後に変更した場合、ハンドラの名前を新しいステップ名に更新するか、新しいハンドラを生成する必要があります。一致しない場合、テストを実行すると、Gherkinコードはステップに対してどのハンドラを呼び出すべきかを知らない状態になります。

場合によっては、Eggplant Functionalは、Gherkinステップ中に見つけたテキストに基づいてハンドラをパラメータ化しようとします。パラメータ化のルールは次の通りです:

  • 数字の文字列はNUMに置き換えられます。
  • 引用符で囲まれたものはSTRに置き換えられます。
  • 角括弧(< >)で囲まれたものはVARに置き換えられます。

例えば:

Gherkin:Given Logged in user is "Mike" SenseTalk:to handle logged_in_user_is_STR

Gherkin: Given There are 12 users in the system SensetTalk: to handle there_are_NUM_users_in_the_system

Gherkin: Given Flavor of the day is <flavor> SenseTalk: to handle flavor_of_the_day_is_VAR

ハンドラのタイトルでパラメータの置換が行われると、同じ名前のパラメータを持つparams文が生成されたハンドラに追加されます。実際には、params文は、GherkinステップからSenseTalkハンドラ名への置換が複数行われる場合、複数のパラメータを含むことができます。

例えば、Gherkinステップが

When
you enter username "Spike" and 1234 as the PIN

だった場合、生成されたSenseTalkハンドラは以下のようになります:

to handle enter_username_STR_and_NUM_as_the_pin
params str1, num1

end enter_username_STR_and_NUM_as_the_pin

あなたが書くコードは、params文で渡された値を利用することができ、これをコード内の変数として使用することができます。元のGherkin文から置換された値が変数の初期値となります。

パラメータ化された値を利用する方法についての詳細は、Scenario Outlinesを参照してください。

関連スクリプトまたは別のスクリプト内のハンドラ

Gherkinステップからハンドラを生成すると、Eggplant Functionalはそれらを.featureファイルと同じ名前のスクリプトに配置します。Featureの最初のハンドラを生成するとき、その名前のスクリプトがスイートに存在しない場合、Eggplant Functionalはスクリプト(.scriptファイル)を作成します。

しかし、同じ名前のスクリプトがある場合、そのFeatureから生成されたハンドラは既存のスクリプトに追加されます。既存のスクリプトに書き込むことを避けたい場合は、ファイル名に注意を払ってください。

時には、Featureのハンドラに別のスクリプトを使用したいことがあります。例えば、同一のハンドラを呼び出す複数のFeatureを持っていることが分かった場合などです。

そのような場合、Feature内に#scriptの参照を含め、それに続いて含めたいスクリプト名を指定することができます。例えば:

#script GlobalHandlers
Feature Calculator App Test

この例では、FeatureはGlobalHandlersという名前のスクリプトと、自身の名前と一致するスクリプトの両方でハンドラを探します。#scriptを使用しても自動生成されたハンドラが作成される場所は変わらないので、代替のスクリプトにハンドラを手動で配置する必要があります。ただし、正しい命名スキームを維持するよう注意してください。

このように複数のスクリプトを参照することができます。追加のスクリプトはそれぞれ別の行にリストし、#scriptを先行させる必要があります:

#script GlobalHandlers
#script PrimaryScript
#script BobStuff
Feature Calculator App Test

通常、#scriptの参照はFeatureの始めに配置します。ただし、技術的には、行はどこにあっても構いません、ただし、行が#scriptで始まっていればどこにでも配置できます。