Given When Then (与えられたとき、次に、それから)
2013年8月21日
Given-When-Thenは、テストを表現するスタイルです。あるいは、その支持者が言うように、SpecificationByExampleを用いてシステムの振る舞いを記述するスタイルです。これは、ダニエル・テルホルスト・ノースとクリス・マッツがBehavior-Driven Development (BDD) の一部として開発したアプローチです。[1] Cucumberのような多くのテストフレームワークにおいて、構造化アプローチとして登場します。これは、Four-Phase Testパターンの再構成と見なすこともできます。
基本的な考え方は、シナリオ(またはテスト)の記述を3つのセクションに分割することです。
- given部分は、このシナリオで指定する振る舞いを開始する前の世界の状況を記述します。これは、テストの事前条件と考えることができます。
- whenセクションは、指定する振る舞いです。
- 最後に、thenセクションは、指定された振る舞いによって期待される変化を記述します。
例を仕様として使用することについて話しているので、例を示して説明するのが理にかなっています[2]
Feature: User trades stocks Scenario: User requests a sell before close of trading Given I have 100 shares of MSFT stock And I have 150 shares of APPL stock And the time is before close of trading When I ask to sell 20 shares of MSFT stock Then I should have 80 shares of MSFT stock And I should have 150 shares of APPL stock And a sell order for 20 shares of MSFT stock should have been executed
上記の例では、ビジネス向けのテストを記述する一般的な方法であるCucumber [3]を使用していますが、Given-When-Thenスタイルはどのような種類のテストでも使用できます。ユニットテスト内で、Given-When-Thenを非公式なブロックをマークするためのコメントとして使用するのが好きな人もいます[4]。私はまた、この慣習が非公式な文章を構造化するために使用されるのを見てきました。
このアプローチでは、各句内で複数の式を組み合わせるために「ands」を使用するのが一般的です。
私はgivenを、事前条件の状態の説明として特徴付けてきました。なぜなら、それが私が考えるのが好きな方法だからです。ただし、テストフレームワークは、givenを、whenコマンドを実行する前にテスト対象システムを正しい状態にするためのコマンドのセットとして解釈します。(これが、他の命名規則でこれを「セットアップ」と呼ぶ理由です。)テストフレームワークは、thenコマンドにさまざまなクエリメソッドを提供します。これらは副作用がない必要があります。
Given-When-ThenスタイルはBDDの兆候ですが、テストや例による仕様を記述する際には基本的な考え方が非常に一般的です。メサロスは、このパターンをFour-Phase Testとして記述しています。彼の4つのフェーズは、セットアップ(Given)、実行(When)、検証(Then)、およびティアダウン[5]です。ビル・ウェイクは、この定式化をArrange, Act, Assertとして思いつきました。
注記
1: このレビューコメントで、ダンはこのアイデアを思いつくにあたり、イバン・ムーアから多大なインスピレーションを得たと述べています。
2: ピート・ホジソンより
3: 正確に言えば、CucumberのDSLの名前であるGherkinを使用しています。
4: テストフレームワークは、xunitまたはBDDのいずれかの命名スタイルに従う傾向があり、後者はメソッドをGiven-When-Thenスタイルで命名する傾向があります。
5: テストの実装時にティアダウンが常に必要になるわけではなく(特に自動ティアダウンを使用している場合)、例による仕様のコミュニケーションの観点ではあまり追加されません。したがって、BDDスタイルにそれが欠落していても妥当です。