在 BDD 用户故事/验收测试中混合当时和何时

Posted

技术标签:

【中文标题】在 BDD 用户故事/验收测试中混合当时和何时【英文标题】:Mixing Then and When in BDD User Stories/Acceptance Tests 【发布时间】:2010-08-18 22:44:50 【问题描述】:

您如何处理像这样具有长链的用户故事/验收测试,然后/何时混合在一起?是否最好将其拆分为单独的验收测试,其中一个测试对话框是否出现,然后第二个测试对话框显示后的行为?

Feature: Confirmation before removing products from cart
  In order to avoid accidentally removing an item from my cart
  As a Customer
  I want a confirmation dialog to ask me if I'm sure I want to remove an item

  Scenario: I want to remove an item from my cart
    Given I have added item "xyz" to my cart
    When I click "Remove"
    Then a confirmation dialog pops up
    And it asks "Are you sure you want to remove this from your cart"
    When I click "Yes"
    Then item "xyz" should be removed from my cart

【问题讨论】:

【参考方案1】:

您的场景似乎有点长,并且与 gui 密切相关。如果你将它与系统的功能联系起来会发生什么?

Scenario: I want to remove an item from my cart
  Given I have a cart containing "xyz"
  When I remove "xyz" from my cart
  Then my cart should be empty.

该场景现在描述了对用户有用的东西,并且更容易重构。

我和我一样喜欢 BDD,因为我遇到过这样的情况。我们进行了 120 次验收测试,但大部分都失败了。有人在很像你描述的那个里面放了一个确认对话框,并立即打破了 80 多个验收测试。通过将它们转换为具有高级、可重用步骤的场景,即使我们用于实现系统功能的机制发生变化,我们也可以轻松重构并保持测试正常工作。按钮的实际点击发生在这些可重复使用的步骤中,每个步骤可以有多个 UI 操作。

我在这里写了一个场景,如果有用的话会这样做(它是 DSL 而不是英语,但你应该明白):

http://code.google.com/p/wipflash/source/browse/Example.PetShop.Scenarios/PetRegistrationAndPurchase.cs

【讨论】:

此测试与 GUI 相关联,因为验收测试描述的“新功能”是在删除购物车项目之前添加确认对话框。在我们的特殊情况下,我们开始使用 cucumber + webrat + selenium,因为我们想测试我们的用户界面 啊,我明白了。我自己,我会把它放在低层次的步骤中,而把其他人放在高层次上——我觉得没有必要将场景与他们的父故事如此紧密地联系起来。 YMMV。【参考方案2】:

问题实际上是“分支”之一。

如果有多个步骤,则每个步骤都必须有用户选择。应该有多个“何时”。这应该形成一个丰富的树,每个分支都有很多用户选择的替代品。每个可能的结果都应该有自己的测试来做出各种选择并得出那个结果。

具有两个用户选择的三步序列是 8 条可能的路径。不同的路径可能会达到相同的结果(也可能不会)。但是你应该有多个路径。

如果它只是顺序的(因为有人想写顺序步骤)并且用户没有选择,那么它并不是真正考虑到用户的行为,是吗?

我没有看到选择。没有选择==难闻的气味。但是很容易测试,因为只有一个结果带有一系列强制步骤,用户几乎没有选择。

如果你正确地做出选择,那么每个步骤都有多个结果,并且每个步骤都应该独立测试。

【讨论】:

以上是关于在 BDD 用户故事/验收测试中混合当时和何时的主要内容,如果未能解决你的问题,请参考以下文章

《用户故事与敏捷方法》阅读笔记05

用户故事与敏捷开发方法笔记03

Restful and 前后端分离

iOS 测试/规范 TDD/BDD 和集成与验收测试

让用户故事真的像故事那样

聊天客户端的验收测试