給定、當、然後
2013 年 8 月 21 日
給定、當、然後是一種表示測試的風格,或正如其支持者所說,使用 範例規格來指定系統行為。這是一種由 Daniel Terhorst-North 和 Chris Matts 作為 行為驅動開發 (BDD) 的一部分而開發的方法。 [1] 它出現在許多測試架構中,例如 Cucumber,作為一種結構化方法。您也可以將其視為 四階段測試 模式的重新表述。
基本概念是將撰寫場景(或測試)分解為三個部分
- 給定部分描述了在您開始在此場景中指定的行為之前的世界狀態。您可以將其視為測試的前提條件。
- 當部分是您正在指定的行為。
- 最後,然後部分描述了您預期由於指定行為而產生的變化。
由於我們正在討論使用範例作為規格,因此使用範例來顯示這一點是有意義的 [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],這是一種撰寫 面向業務測試 的流行方式,但您可以在任何類型的測試中使用給定、當、然後風格。有些人喜歡將給定、當、然後作為註解,以標記單元測試中的非正式區塊 [4]。我也見過這種約定來建構非正式散文。
使用這種方法時,通常會看到「ands」用於組合每個子句中的多個表達式。
我將給定部分描述為前置條件狀態,因為這是我的偏好思考方式。然而,測試架構將給定部分解釋為一系列指令,以便在執行當指令之前將受測系統帶入正確狀態。(這就是為什麼其他命名慣例通常將其稱為「設定」的原因。)測試架構為然後指令提供各種查詢方法,這些方法應該沒有副作用。
儘管 Given-When-Then 風格是 BDD 的症狀,但撰寫測試或範例規格時,基本概念相當常見。Meszaros 將模式描述為 四階段測試。他的四個階段是設定 (Given)、執行 (When)、驗證 (Then) 和終止 [5]。Bill Wake 提出公式為 安排、動作、斷言。
註解
1: 在此的檢閱意見中,Dan 讚揚 Ivan Moore 在提出此概念時提供了大量靈感。
2: 來自 Pete Hodgson
3: 或嚴格來說,它使用 Gherkin,這是 Cucumber 的 DSL 名稱。
4: 測試架構傾向於遵循 xunit 或 BDD 的命名風格,後者傾向於以 Given-When-Then 風格命名方法。
5: 在實作測試時,終止並不總是必要的(特別是如果您使用 自動終止),而且不會為範例規格的溝通面向增加太多內容。因此,從 BDD 風格中省略它很合理。