私はガーキンで受け入れテストを書いており、初期アクションに基づいてWebアプリのUIの複数の変更をテストしたいと考えています。次に例を示します。
Scenario: Cancel editing a new text asset
Given the user "[email protected]" is logged in
When the user navigates to "/build/"
And the user clicks the "Sandbox" link
And the user inputs "Test story for canceling editing of a new text asset" for the "title" field
And the user inputs "Test User" for the "byline" field
And the user inputs "My summary, so exciting!" for the "summary" textarea
And the user clicks on "Untitled Section" in the section list
And the user clicks the "Text" icon in the "center" container
And the user inputs the following text in the rich text editor:
"""
Test text for asset. This is cool.
"""
And the user clicks the "cancel" button
Then the following text is not present:
"""
Test text for asset. This is cool.
"""
And the "Image" icon is present
And the "Text" icon is present
When the user refreshes the browser
And the user clicks on "Untitled Section" in the section list
Then the following text is not present:
"""
Test text for asset. This is cool.
"""
When the user opens the asset drawer
Then the following text is not present:
"""
Test text for asset. This is cool.
"""
初期アクションの応答をテストするために、When/Thenステップのグループが複数あることに注意してください。ほとんどのステップの実装はprefixキーワードを無視し、このテストを実行できると確信していますが、さまざまな結果をテストするためのより良い方法はありますか?同じ設定で異なる "Then"ステートメントを使用して複数のシナリオを記述する方が良いでしょうか?
一度に1つの動作/機能のみをテストする必要があることに注意してください。経験則では、1つのWhenステップのみを使用する必要があります。
Given some state before action
And some other state before action
...
When only one action
Then assert correct output
And assert correct output
...
ご覧のとおり、Whenの下にAndsがない、Whenの1行のみ。代わりに多くのWhenステップを使用する場合は、仕様ではなくテストスクリプトを作成します。テストが理解しにくくなり、基礎となる実装が変更されると、ますます多くのステップが追加されることに気づくでしょう。
また、無関係なものを変更するたびに変更したくないので、基礎となるロジックを非表示にしておく必要もあります。例:
そして、ユーザーは「私の要約、とてもエキサイティングです!」と入力します。 「要約」テキストエリア
集計フィールドをテキストエリアから入力タイプに変更するとどうなりますか?シナリオを変更する(メンテナンスの悪夢)か、シナリオを横にしたままにする必要があります(シナリオがないことよりも悪い)。代わりに書く必要があります:
When the user describes it as "so exciting!"
しかし、それでも、シナリオ全体の構造は悪いです。あなた自身に質問してください:私がチェックしたいことは?私がその機能のビジネスロジックを理解したい人だったら、次のようなものを見たいと思います。
Scenario: Cancel editing a new text asset
Given I edit the Sandbox details with some data
When I cancel editing
Then Sandox details should be empty
それでおしまい!
それを達成する方法は?すべての無関係なロジックをより深く移動し、 PageObject pattern などを使用します。そして 例による指定 について読んでください。