【问题标题】:Should all validation rules be tested within a Cucumber feature?是否应该在 Cucumber 功能中测试所有验证规则?
【发布时间】:2011-05-07 08:41:40
【问题描述】:

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

写两种场景就够了吗:一种是输入有效数据,一种是输入无效数据?

【问题讨论】:

  • 如果这是一个愚蠢的问题,我深表歉意 - 我仍在努力解决 BDD。
  • 我同意你的观点:在你的情况下,两个黄瓜场景就足够了。
  • @apneadiving:但是考虑一下如果您正在建立一个批发电子商务网站的情况,客户必须至少订购每件商品 10 件。该验证是一项重要的业务规则,应该在 Cucumber 级别公开。
  • @andy:你说得对,你提出的案例需要集成测试。

标签: ruby-on-rails rspec cucumber


【解决方案1】:

这是个好问题,答案是:视情况而定。

您可以将 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 | 

【讨论】:

  • 这似乎是一个不错的折衷方案。但是不同类型的验证(唯一性、长度等)呢?我需要为每种类型提供不同的场景大纲吗?
  • 不知道上下文很难说。你能举个例子吗?
  • 如何使用用户模型,其中用户名必须唯一且仅包含字母数字字符,密码长度必须至少为 6 个字符,并且电子邮件地址必须有效。我的想法是,由于模型规范中已经对验证进行了测试,因此只需在 Cucumber 功能中测试控制器的创建操作中的两个可能结果就足够了——即,模型何时成功保存,何时不成功.
  • 或者我完全错过了 Cucumber 的意义——这也是可能的:P
  • 好的,我们以密码为例。您的产品负责人是否关心最小长度是 5 个字符还是 6 个字符?我怀疑不是。对他来说,重要的是它不容易被猜测或破解。最小密码长度的决定可能应该由程序员做出,因为他将有知识和经验来选择合适的最小长度。所以最小密码长度可能不应该暴露在 Cucumber 功能中。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    为什么要留下任何建议?允许开发人员做出假设在产生返工方面具有内在风险。

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

    如果您将其隐藏在单元测试中,那么您将其与 活动文档

    断开连接

    如果你真的接受了 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 |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多