有效的BDD场景步骤?给定 - >当 - >然后 - >什么时候

时间:2010-09-01 09:09:58

标签: bdd

如果我定义了以下步骤,这是有效的方案吗?我觉得这是某种气味。

Scenario: Change users status
   Given I have the following users exist:
        | code | status   |
        | u1   | active   |
        | u2   | inactive |
        | u3   | active   |
     And the status filter is "active"
    When I update "u1" to "inactive" 
    Then I should see the following users:
        | code |
        | u3   |
    When I change status filter to "inactive"
    Then I should see the following users:
        | code |
        | u1   |
        | u2   |

3 个答案:

答案 0 :(得分:6)

Liz正确地描述了系统的功能。我还建议在场景中只有一个。因为每个场景(我认为)应该验证系统是否从Given状态变为Then状态何时发生。

在这种情况下,我还建议有两个不同的功能。一个功能是关于您的应用程序可以更改用户状态(激活/停用):

Feature: Changing user status

Scenario: Deactivating user
   Given following users exist:
        | code | status   |
        | u1   | active   |
        | u2   | inactive |
        | u3   | active   |
    When user u1 is deactivated
    Then following users exist:
        | code | status   |
        | u1   | inactive |
        | u2   | inactive |
        | u3   | active   |

另一个功能是您可以按状态过滤用户:

Feature: Filtering users

Scenario: Filtering active users
   Given following users exist:
        | code | status   |
        | u1   | active   |
        | u2   | inactive |
        | u3   | active   |
    When I filter for active users
    Then I should see the following users:
        | code |
        | u1   |
        | u3   |

Scenario: Filtering inactive users
   Given following users exist:
        | code | status   |
        | u1   | active   |
        | u2   | inactive |
        | u3   | active   |
    When I filter for inactive users
    Then I should see the following users:
        | code |
        | u2   |

在这种情况下,当其中一个场景被破坏时,您就会知道原因。它要么不改变用户的状态,要么不正确地过滤它们。您知道应用程序中哪个功能已损坏。

答案 1 :(得分:4)

你用相当代码驱动的术语来描述它,但除此之外它是一个有效的场景。

如果你想让它变得更好,你可以根据系统的功能来描述它,用户可能用来描述他们正在做的事情的语言:

Scenario: Change users status
   Given these users exist:
        | code | status   |
        | u1   | active   |
        | u2   | inactive |
        | u3   | active   |
    And we filter for active users
    When I disable user u1
    Then I should see the following users:
        | code |
        | u3   |
    When we filter for inactive users
    Then I should see the following users:
        | code |
        | u1   |
        | u2   |

您还可以使用更典型的用户名,以便阅读它的人一目了然(Lunivore,Soe,Jon而不是u1和u2)。

没有那么大的区别。你认为什么是难闻的气味?它只是语言吗?

答案 2 :(得分:0)

通常只有一个'when'步骤是好的,因为这是你实际测试的。但是,有时我发现指定整个用例也很有用,这些用例可能包含几个相互依赖的步骤。例如:

 when a new user registers
 then the user receives an email confirmation
 when the email confirmation is confirmed by the user
 then the user is registered 

但是,在您的示例中,您确实应该编写两个测试,因为您实际上测试了两个不直接相互依赖的不同功能。