Cucumber 如何通过声明性验收测试捕获需求?

Cucumber 如何通过声明性验收测试捕获需求?,cucumber,bdd,calabash,acceptance-testing,Cucumber,Bdd,Calabash,Acceptance Testing,背景 我试图帮助我的团队组织一个新的移动应用程序项目。我们选择了遵循(另请参见)以捕获简单的英语需求,这些需求在利益相关者和开发人员之间形成了针对每个用户故事的合同 我们使用验收测试来记录每个用户故事的需求。验收测试是在sprint计划之前编写的。开发人员在sprint规划期间对测试进行优化和添加 我们将验收标准定义为规则列表(例如:输入验证、默认值等),将验收测试定义为场景列表。我们计划将其用于移动测试 我觉得验收标准/测试是一种更灵活的方法,因此可以更好地解决更正式的需求文档 我觉得我已经找

背景

我试图帮助我的团队组织一个新的移动应用程序项目。我们选择了遵循(另请参见)以捕获简单的英语需求,这些需求在利益相关者和开发人员之间形成了针对每个用户故事的合同

我们使用验收测试来记录每个用户故事的需求。验收测试是在sprint计划之前编写的。开发人员在sprint规划期间对测试进行优化和添加

我们将验收标准定义为规则列表(例如:输入验证、默认值等),将验收测试定义为场景列表。我们计划将其用于移动测试

我觉得验收标准/测试是一种更灵活的方法,因此可以更好地解决更正式的需求文档

我觉得我已经找到了一个有效的解决方案,但我想了解其他人是如何收集需求和编写验收测试的

问题

关于vs测试步骤,Cucumber社区存在一场争论。我倾向于命令式,因为开发人员必须知道可交付的用户故事是什么样子的

我不觉得UI耦合和测试是一个问题。有一些方法可以将UI与测试分离(例如:)。我也不认为详细的步骤会让非技术利益相关者难以理解(除非他们不知道如何使用web浏览器或移动设备,但这是另一个问题)

我可能盗用了这个词。在我的使用中,验收测试与单元测试的范围不在同一级别。我认为验收测试是一个高水平的测试

示例

  • 作客
  • 我想登录
  • 访问应用程序功能
命令式测试

  • 场景:有效登录
    • 假设我在“登录”屏幕上
    • 当我进去的时候”email@domain.com在“电子邮件”中
      • 我在“密码”中输入“密码1”
      • 我点击“登录”
    • 然后我看到“登录成功”
声明性测试

  • 场景:有效登录
    • 如果我有一个有效的帐户
    • 然后我可以登录
这两者可以涵盖相同的功能,后者更短,但没有说明我是否可以使用用户名、电子邮件或facebook/twitter/google/etc帐户登录。仅仅编写解决方案是不够的

问题


您如何通过声明性步骤捕获功能的需求?

写得很好的问题

您如何使用声明性语言捕获功能的需求 台阶

特征要求记录在步骤定义中

因此,在您的命令式示例中:

When I enter "email@domain.com" in "email"
And I enter "password1" in "password"
And I tap "login"
可以通过将其重写为以下内容使其具有声明性:

Given I login using valid credentials
导航到有效帐户的步骤(即,实现定义“有效”含义的验收标准)可以在该场景语句的步骤定义中实现。这同样适用于相反的情况,即

Given I login using invalid credentials
同样,满足验收标准的实现该场景的步骤可以在底层步骤定义中实现

采用这种声明性方法意味着您失去了功能的(必要的)需求(即需要执行的确切步骤),这使得业务更难从仅仅读取功能文件中看到这些场景在做什么。然而,您得到的是测试变得不那么脆弱,因为实现任务的特定步骤记录在步骤定义中,并且该步骤定义可以在许多功能中共享

在我的公司,我们也遇到了同样的问题,我们发现在某些情况下,使用祈使句比声明式更好,反之亦然。例如,在您的案例中,“给定我有一个有效帐户”的步骤可能会在许多特性中使用,因此将其声明性是合理的。然而,如果您有一个输入许多不同字符串值的特性,那么在这种情况下,最好强制地编写它们


看到SO社区对这个问题的其他答案将非常有趣。

我最近访问了一家商店/在线购买了一台洗衣机和一台洗碗机。我只想买一个用水量少、洗得快的。但我遇到的细节是压倒性的;例如转速、内筒厚度、总连接负载(KW)等

从上面的简单例子来看,命令式风格可能看起来很合适,但实际上它会使阅读场景变得更加困难和枯燥。通过阅读一个项目中的10个场景,您可以体验到这一点,其中您没有直接参与技术/日常层面的工作

考虑到cucumber的目标之一是为整个项目带来透明度,特别是非技术用户,声明式风格更能让管理层积极参与。我在我的项目中看到了这一点

这是一个虚构的故事。试着用命令式的方式来实现它,过几天再来阅读,你会发现它太无聊了

Feature: Delivery 
    Free delivery is offered to customers who order two or more items

  Scenario Outline: Calculate postage for delivery
    Given I am signed-in
    When I "<order>" items
    Then postage should be "<postage>"   

    Examples:
    | order | postage |
    | 1     | 0.99    |
    | 2     | 0       |
    | 3     | 0       |
    | 0     | ?       |
功能:交付
为订购两件或两件以上商品的客户提供免费送货服务
场景概述:计算投递邮资
既然我已经签到了
当我删除“”项时
那么邮资应该是“
示例:
|订购|邮费|
| 1     | 0.99    |
| 2     | 0       |
| 3     | 0       |
| 0     | ?       |

您可能希望阅读的另一个链接

我可以看到在每个用户故事中强制定义验收测试的一些价值,然后在实际场景中声明性地定义验收测试,以降低其脆弱性。谢谢分享!考虑一下,我们可以使用接受标准列出“有效帐户”的详细信息(例如:电子邮件和电子邮件)