用于设计表单的黄瓜场景的最佳BDD实践

时间:2010-12-13 23:05:28

标签: ruby-on-rails tdd cucumber bdd

假设您有一个创建新用户的表单。 你怎么写黄瓜情景?

1)

Given I am logged in as admin
When I create a new user
Then I should see "Successfully created user"

2)。

Given I am logged in as admin
When I go to Create new user
And I fill in "Name" with "Name111"
And I fill in "Password" with "Password111"
And I press "Create new user"
Then I should see "Successfully created user"

如果您选择1.)您在哪里记录用户的要求(用户应该有一个名称和密码)。我看到BDD是关于行为的,但在某些时候你和利益相关者必须指定用户应该拥有哪些属性,不是吗?

我对BDD很新,所以我很感激任何建议......

3 个答案:

答案 0 :(得分:13)

您应该阅读Imperative vs Declarative Scenarios

- Aslak。黄瓜的创造者。

答案 1 :(得分:2)

你写的场景相当低。除非您实际上正在制作出售的安全登录功能,否则我会坚持使用快乐的案例,并对其余部分进行单元/手动测试。如果你不这样做,你会创造很多场景,这将是一场维护噩梦。

找出您正在创建的产品与所有类似产品的区别,然后将其作为方案的价值。然后它会是这样的:

Given Fred is logged in
When Fred <does something>
Then Fred should <get some really differentiating value>
And <something else happens>

坚持真正的高级功能,而不是基于表单的低级步骤。例如:

Given there is already a question on BDD and Cucumber
Given Peyote is logged in
When Peyote proposes a question on BDD and Cucumber
Then Peyote should see other questions on BDD and Cucumber.

有一个名为“Page Paradigm”的概念,您可以在其中创建一个包含页面或屏幕可以执行的所有低级步骤的类。然后,您可以从更高级别的Cucumber步骤夹具中调用页面上的低级步骤。

您的业务将更多地参与此类方案。 BDD的主要目的不是生成自动化测试,而是围绕这些场景进行对话,以便在遇到实现代码的麻烦之前,找出出错的地方以及可以考虑的其他选项。自动化测试是一个很好的副产品。

通过谈话获得的对话和学习,使BDD与ATDD(验收测试驱动开发)不同。这就是为什么我们使用示例,场景,给定,何时,然后,上下文,事件,结果等语言而不是测试,SetUp,TearDown,Act,Arrange,Assert 的语言 - 所以我们可以用同一种语言与业务,BA和测试人员讨论这些问题。

请参阅Dan North's article on Deliberate Discovery及其余博客了解更多信息,并祝BDD好运!

答案 2 :(得分:1)

任何一个都可以。使用#1,您将创建一个步骤来处理表单的填充。我更喜欢#1和#2的混合体,因为我使用了场景概述,例如:

Background: 
 Given the following users exist:
   | email             | password        |
   | test@example.com  | testpassword23  |
   | test2@example.com | notthistime     |
   | test3@example.com | welcomeback     |

  @login @authentication
  Scenario Outline: Authentication
     Given I am on the new user session page
     When I login with "<s_email>" and "<s_password>"
     And I press "Login"
     Then I should see "<s_message>"

  Examples:
    | s_email           | s_password       | s_message                      |
    | test@example.com  | testpassword23   | Signed in successfully         |
    | test2@example.com | itriedreallyhard | Invalid email or password.     |
    | teOst@example.com | testpassword23   | Invalid email or password.     |