Cucumber 在BDD用户故事/验收测试中进行混合

Cucumber 在BDD用户故事/验收测试中进行混合,cucumber,bdd,acceptance-testing,user-stories,Cucumber,Bdd,Acceptance Testing,User Stories,你如何处理用户故事/验收测试,这些故事/验收测试有像这样的长链,然后/什么时候混合在一起?是否最好将其拆分为单独的验收测试,其中一个测试对话框的显示,然后第二个测试对话框显示后的行为 Feature: Confirmation before removing products from cart In order to avoid accidentally removing an item from my cart As a Customer I want a confirmatio

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

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

问题其实是“分支”是什么

如果有多个步骤,则每个步骤都必须有用户选择。应该有多个“When”。这应该形成一个丰富的树,在每个分支上有许多用户选择的备选方案。每种可能的结果都应该有自己的测试,以做出各种选择并得出该结果

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

如果它只是连续的(因为有人想写连续的步骤),而用户没有选择,那么它实际上并不是由考虑用户的行为驱动的,是吗

我看不出有什么选择。没有选择==难闻的气味。但是很容易测试,因为只有一个结果和一系列附加步骤,用户几乎没有选择


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

您的场景似乎有点长,而且与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,而不是英语,但你应该知道):


此测试与GUI绑定,因为验收测试描述的“新功能”是在删除购物车项目之前添加确认对话框。在我们的特殊情况下,我们开始使用cucumber+webrat+selenium,因为我们想测试我们的用户界面,我理解。我自己,我会把它放在低层次上,而把其他人放在高层次上——我觉得没有必要把场景和他们的父母故事联系得如此紧密。YMMV。