7

背景

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

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

我们将Acceptance Criteria定义为规则列表(例如:输入验证、默认值等),将Acceptance Tests定义为 Cucumber 场景列表。我们计划使用Calabash进行移动测试。

我觉得验收标准/测试是更灵活的,因此是更正式的需求文档的更好解决方案。

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

问题

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

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

我可能盗用了“验收测试”这个词。在我的使用中,验收测试与单元测试不在同一范围内。我将验收测试视为高级集成测试

这个例子

  • 作为客人
  • 我要登录
  • 访问应用程序功能

命令式测试

  • 场景:有效登录
    • 鉴于我在“登录”屏幕上
    • 当我在“电子邮件”中输入“email@domain.com”时
      • 我在“密码”中输入“密码1”
      • 然后我点击“登录”
    • 然后我看到“登录成功”

声明式测试

  • 场景:有效登录
    • 鉴于我有一个有效的帐户
    • 然后我可以登录

这两者都可以涵盖相同的功能,而后者更短,但它并没有说明我是否可以使用用户名、电子邮件或 facebook/twitter/google/etc 帐户登录。仅仅编写解决方案是不够的

问题

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

4

2 回答 2

6

写得很好的问题!

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

对功能的要求记录在步骤定义中。

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

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 社区看到这个问题的其他答案会很有趣。

于 2013-10-21T23:09:42.730 回答
2

我最近访问了一家商店/在线购买洗衣机和洗碗机。我只想买一个用水少、洗得快的。但是我遇到的细节是压倒性的;如转速、内滚筒厚度、总连接负载(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     | ?       |

您可能希望阅读的另一个链接如何实现 UI 测试而不用自取其辱

于 2013-10-22T06:15:48.450 回答