BDD场景应该包含实际测试数据,还是只描述一下?

Jam*_*com 22 bdd acceptance-testing gherkin

我们已经意识到在定义典型的CRUD场景时有两种指定测试数据的选项:

选项1:描述要使用的数据,并让实现定义数据

Scenario: Create a region
    Given I have navigated to the "Create Region" page
      And I have typed in a valid name
      And I have typed in a valid code
    When I click the "Save" button
    Then I should be on the "Regions" page
     And the page should show the created region details
Run Code Online (Sandbox Code Playgroud)

选项2:明确说明要使用的测试数据

Scenario: Create a region
    Given I have navigated to the "Create Region" page
      And I have filled out the form as follows
        | Label | Value  |
        | Name  | Europe |
        | Code  | EUR    |
    When I click the "Save" button
    Then I should be on the "Regions" page
     And the page should show the following fields
        | Name   | Code |
        | Europe | EUR  |
Run Code Online (Sandbox Code Playgroud)

在利弊方面,我们建立的是:

选项1很好地涵盖了说"有效名称"的定义发生变化的情况.如果我们选择测试数据在几个地方的选项2,这可能会更难处理.选项1明确地描述了该测试数据的重要性,特别是如果我们说的是"输入了无效的信用卡号".它也"感觉"更抽象,BDD不知何故,更关注描述而不是实现.

但是,选项1使用了非常具体的步骤,难以重复使用.例如,"页面应该显示创建的区域详细信息"可能只会被此方案使用.相反,我们可以实现选项2的"页面应显示以下字段",以便其他方案可以多次重复使用.

我还认为选项2似乎更方便客户端,因为他们可以通过示例看到发生了什么,而不是必须解释更多抽象术语,如"有效".选项2会更脆吗?重构模型可能意味着打破这些测试,而如果测试数据是在代码中定义的,编译器将帮助我们进行模型更改.

我很欣赏这里没有正确或错误的答案,但希望听到人们对如何决定使用哪些问题的看法.

谢谢!

小智 11

我会说这取决于.有时,方案可能需要大量数据才能完成成功运行.通常,大多数数据对我们实际测试的事物并不重要,因此会使我们试图通过场景实现的理解分散注意力.我开始使用我称之为默认数据模式的东西来提供可以与特定于方案的数据合并的默认数据.我在这里写过:

http://www.cheezyworld.com/2010/11/21/ui-tests-default-dat/

我希望这有帮助.