24

Gherkinで「GivenWhenThenWhenThen」テストを書くことは許容されますか?実際の例は次のとおりです。すべてのAllPlayers.com

Scenario: Successfully register a user
  Given I am on homepage
    And I am not logged into an account
  When I follow "create a new account"
    And I fill in "First Name" with "Bobby"
    And I fill in "Last Name" with "Bricks"
    And I fill in "E-mail" with "bbricks@example.com"
    And I select "Jun" from "Birthday Month"
    And I select "22" from "Birthday Day"
    And I select "1985" form "Birthday Year"
    And I select "Male" from "Gender"
    And I fill in "Password" with "123testing"
    And I fill in "Confirm Password" with "123testing"
    And I solve the captcha math problem
    And I click "Create new account"
  Then I should see "the user dashboard"
    And I should see the Registration Wizard
  When I push "Proceed to next step"
  Then the "First Name" field should contain "Bobby"
    And the "Last Name" field should contain "Bricks".

behatを使用して機能することはわかっているので、構文解析は問題ありません。より良いテストを書こうとしているだけです。私は最初に書くことができましたAnd the Registration Wizard should be filled out with dataが、それは十分に具体的ではないようです...

提案?

4

5 に答える 5

29

書かれている機能の対象読者によって異なります。そこにあるガーキンは、利害関係者 (つまり、技術者ではないが、ビジネスと Web サイトに既得権を持っている人) と一緒に書かれたものではない可能性が非常に高いようです。BDD は実際には要件と期待についての会話に関するものです。Gherkin は、要件と期待を書くことができることを誰もが読むことができる標準/認識された方法を提供するツールです。開発者にとっては自動化されたテストとして機能し、おそらくテスターに​​とってはテスト スクリプトとして機能します。

今、開発者の脱帽を試みています - ビジネス関係者はむしろ読んで簡単に理解したいと思います...

Scenario: Should be able to successfully register on website
    Given I am new to the website
    And I want to register for a user account
    When I go to the registration form
    And I complete all the required registration details correctly
    Then I will be registered on the website
    And I will be automatically logged in

この仕様の舞台裏で同じテストを構築することはできますが、この仕様にはより多くの読者がおり、誰もが理解しなければならないより簡単に理解できる要件です。あなたが手に入れたものに価値がないと言っているのではありません。非常に有効な試験となります。しかし、これは開発者固有のものであり、UI の実装と密接に関連しています (UI をリファクタリング/再設計する場合は、要件をリファクタリングする必要があります...)。

私はあなたのものによく似たガーキン仕様をたくさん用意することから始めました - そして今でも時々それらを使用しています. テスト フレームワークが構築されたら、小さなガーキンは、データ駆動型/構成可能な単体テストを作成するための非常に優れた方法です。そして、それらは今でも私の開発プロセスにとって大きな価値があります。しかし、私はより「純粋な」仕様を「開発者」の仕様から分離しようとしていますが、フォルダーとタグ/カテゴリを分離しようとしています。

編集:要約すると、私が得ているのは...あなたが持っているのは素晴らしい「テスト」ですが、かなり悪い「要件」です。それでも我慢してください!

于 2012-08-22T08:43:57.493 に答える
11

はい、実際のシナリオで必要な場合、Gherkin シナリオでは複数のWhen/サイクルが適切です。Then

SaxonMatt の回答は、シナリオは UI 操作の言語ではなく利害関係者の言語で記述するのが最適であり、そうすることでシナリオの長さを短縮できることが多いという優れた点を示していますが、それでは質問の正確なポイントを見逃しています。角で雄牛を取りましょう。

Gherkin は受け入れテスト用に設計されています。つまり、利害関係者レベルの要件が完全に実装されていること、つまりソフトウェアが実際に利害関係者に価値を提供することをテストするテストです。価値を提供するには、複数の行動と反応のサイクルが必要な場合があります。次のシナリオを検討してください。

Scenario: Guest buys a product
  # This scenario starts with the user not logged in, which doesn't require a step
  Given there is a product named "Elliptical Juicer"

  When I go to the product page for "Elliptical Juicer"
  And I add the product to my shopping cart
  Then I should see 1 product in my shopping cart

  When I request to check out
  Then I should see the account creation form

  When I create an account
  Then I should see the checkout form with 1 product, "Elliptical Juicer"

  When I check out
  Then I should see the checkout success page with 1 product, "Elliptical Juicer"
  And I should receive a checkout confirmation email with 1 product, "Elliptical Juicer"

(シナリオに複数のWhen/Thenサイクルがある場合は、目立つように空白行で区切るのが好きです。)

Whenこのシナリオが複数の/Thenサイクルで最適に記述される理由はいくつかあります。

  • ユーザーがチェックアウトする前に、ショッピング カートに 1 つの製品が表示されます (サイト ヘッダーの数字としてのみ表示されるため、ステップでは製品名は言及されません)。シナリオの最後にこの要件をテストする方法はありません。(まあ、ユーザーが製品をカートに追加した直後にテストで情報を収集し、シナリオの最後に期待されるカウントをアサートすることもできますが、それは無意味に卑劣で混乱を招きます。) 代わりに、自然な位置で正しいカウントをアサートします。ユーザーに表示されるとすぐに、シナリオに配置します。

    同様に、Then I should see the account creation form重要Then I should see the checkout form with 1 product, "Elliptical Juicer"な要件をテストするのが自然なシナリオのポイントでテストできます。

  • プロセス中にユーザーが見るものは気にせず、製品が途中でシナリオの最後に到達するかどうかだけを気にしたとします。Thenその後、中間ステップを省略できます。

    Given there is a product named "Elliptical Juicer"
    When I go to the product page for "Elliptical Juicer"
    And I add the product to my shopping cart
    And I request to check out
    And I create an account
    And I check out
    Then I should see the checkout success page with 1 product, "Elliptical Juicer"
    And I should receive a checkout confirmation email with 1 product, "Elliptical Juicer"
    

    And I create an account意外ですね。チェックアウト中にゲストユーザーがアカウントを作成するように求められていることを読者が推測する必要があります。私が提供したシナリオの最初のバージョンのように、はっきりと言う方が明確です。

  • 上記の懸念事項のどれも納得できず、要件が満たされていることを主張する必要がある全体的なシナリオの各ポイントに対して個別の Gherkin シナリオを作成したとします。

    Scenario: Guest adds a product to their shopping cart
      Given there is a product named "Elliptical Juicer"
      When I go to the product page for "Elliptical Juicer"
      And I add the product to my shopping cart
      Then I should see 1 product in my shopping cart
    
    Scenario: Guest with a product in their shopping cart attempts to check out
      Given I have a product in my shopping cart
      When I request to check out
      Then I should see the account creation form
    
    Scenario: Guest creates an account
      Given I have a product named "Elliptical Juicer" in my shopping cart
      And I am on the account creation form
      When I create an account
      Then I should see the checkout form with 1 product, "Elliptical Juicer"
    
    Scenario: Newly registered user checks out
      Given I am a user
      And I have a product named "Elliptical Juicer" in my shopping cart
      And I am on the checkout form
      When I check out
      Then I should see the checkout success page with 1 product, "Elliptical Juicer"
      And I should receive a checkout confirmation email with 1 product, "Elliptical Juicer"
    

    それはひどい!まず、どのシナリオも利害関係者がシナリオとして考えるようなものではありません。Given第 2 に、中間状態の 1 つが変更されると、次のシナリオのために中間状態をアサートするステップと、中間状態を設定するステップの 2 つのステップを変更する必要があります。これらの各Givenステップは、間違った状態を設定する機会、つまり統合エラーを起こす機会です。この一連のシナリオは、単一のシナリオよりも統合テスト スイートとしての価値がはるかに低くなります。一連の単体テストをほとんど書いたことがあるかもしれません。

すべてのシナリオをエンド ツー エンドで作成すると、重複が発生する可能性が高いのは事実です。通常のコードよりも単体テストで重複を許容するように、Gherkin シナリオでは単体テストよりも重複を許容します。わかりやすさに妥協しないでください。シナリオを分割し、重要なポイント (上記の例での製品の作成など) でのみ s を使用Givenし、シナリオの統合テスト機能を弱めていることを認識してください。

また、受け入れテストは自動化されたテスト スイートの一部に過ぎないことにも注意してください。重要なシナリオをカバーするのに十分な受け入れテストのみを作成し、詳細を単体テストでカバーします。多くの場合、受け入れテストの重複に対する解決策は、1 つを単体テストに置き換えることです。

于 2017-07-21T19:58:54.013 に答える
3

私はノーと言うでしょう。

テストが失敗すると、システムのどこで失敗が発生したかがわかります。あなたの例のような長いテストは脆くなる傾向があり、より高いレベルのメンテナンスが必要です。

テストが何をテストしているかを定義する必要があります (これは 1 つのことである必要があります)。

  • フォーム検証テストである可能性があります。
  • それは登録テストかもしれません。
  • ユーザー ダッシュボードのテストである可能性があります。

障害がどこにあり、それがコードのどこに関連しているかを調査するには、かなりの時間が必要です。

于 2012-09-18T15:42:16.803 に答える
0

私もノーと言います。

ギブンはセットアップの前提条件です。When はアクションです (何もしないこともあります) Then フォームはアサートします。

さらにアクションが必要な場合は、テストを分割します。

これは、最初の Then が問題のローカライズに失敗すると、はるかに便利になります。

于 2013-08-27T12:58:53.180 に答える