Given When Then
2013 年 8 月 21 日
Given-When-Then 是一种表示测试的风格,或者正如其倡导者所说,使用 示例规范 来指定系统的行为。它是 Daniel Terhorst-North 和 Chris Matts 在 行为驱动开发 (BDD) 中开发的一种方法。 [1] 它作为许多测试框架(如 Cucumber)的结构化方法出现。您也可以将其视为对 四阶段测试 模式的重新表述。
基本思想是将编写场景(或测试)分解为三个部分
- 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 的典型特征,但基本思想在编写测试或示例规范时非常普遍。 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 风格中看到它缺失是合理的。