是否应在Cucumber功能中测试所有验证规则?

时间:2011-05-07 08:41:40

标签: ruby-on-rails rspec cucumber

在Ruby on Rails中,如果在该模型的规范(或单元测试)中测试给定模型的所有验证规则,是否仍然需要为每个验证编写Cucumber场景?

是否只需编写两个方案即可:一个用于输入有效数据,一个用于输入无效数据?

3 个答案:

答案 0 :(得分:9)

这是一个很好的问题,答案是:这取决于。

您可以将Cucumber视为产品所有者,开发人员和测试人员之间的沟通方式。

如果您认为在Cucumber中进行验证会增加对产品功能的共同理解,那么请将它们保留在那里。

一种方法是将验证结合到场景大纲中:

Scenario Outline: User tries to register but skips a mandatory field
  Given I am registering
  And I leave the "<field>" blank 
  When I click "Submit"
  Then I should see "<message>"
  And I should not be registered
    | field         | message                         |
    | Forename      | Please enter your forename      |
    | Surname       | Please enter your surname       |
    | Date of Birth | Please enter your date of birth | 

答案 1 :(得分:1)

这是一个很好的问题,也是我最近一直在处理的问题。

对于您的组织可能有所不同,但在我的组织中,我们尝试将字段验证测试留给单元测试或其他更好地处理这些情况的框架。除此之外,我认为Cucumber纯粹用于自动化验收测试(AKA是您/您的团队和PO之间的通信工具),并且其他方法应该用于该范围之外的任何其他方法。

答案 2 :(得分:-1)

为什么要提出任何建议?就进行返工而言,允许开发人员做出假设具有固有的风险。

在不同情况下(创建,显示,编辑,角色),表单行为的每个字段显然是接受标准。

如果您将其隐藏在单元测试中,则表明它已从生活文档

中断开

如果您真的对BDD感兴趣,那么您实际上就不需要单元测试。

Feature: Edit staff personal
  Scenario Outline: Form validation
    Given I am editing a staff personal details
    And the form contains a "<Mandatory?>" field with a label "<Label>"
    And text fields have a input length of between "<Min Length>" and "<Max Length>"
    And select fields have these "<Options>"
    When I submit the form by clicking the save button
    Then an error displays if validation fails
    But commits my changes if validation is successful and returns the form back to display mode
    Examples:
    | Label | Mandatory? | Type | Min length | Max length | Options
    | Title | true | select | 0 | 0 | Mr, Mrs, Miss, Ms, Dr, Prof |
    | Surname | true | text | 2 | 50 | null |
    | Forename | true | text | 2 | 50 | null |
    | Known as / Other Surname | false | text | 2 | 50 | null |
    | Known as forename | false | text | 2 | 50 | null |
    | Date of birth | true | date-picker | 0 | 0 | null |
    | NI number | true | ni-number | 0 | 0 | null |