如何编写声明性Cucumber功能来描述CRUD操作?

And*_*rew 7 cucumber

我理解命令式和声明性黄瓜步骤之间的区别,但我还没有看到任何真实世界的例子.我总觉得我的功能文件变得过于冗长.

似乎生命周期中的每一步都需要一个黄瓜功能:

  • foobars/list_foobars.feature
  • foobars/create_foobar.feature
  • foobars/view_foobar.feature
  • foobars/edit_foobar.feature
  • foobars/delete_foobar.feature

仅在创建功能中,您似乎想要列出可以输入的字段,需要哪些字段,输入无效数据时会发生什么等等.我不知道这样做的声明方式.当然,在后续功能中,您只需说Given a foobar exists而不是通过所有步骤来创建一个.

在描述应用程序的行为时,您有多详细?您能提供一些您认为完整的功能文件示例吗?

Ben*_*aum 5

我喜欢让黄瓜测试保持人类可读,所以假设我们有一个使用无效数据编辑 foobar 的故事,我想要一个如下场景:

# foobars/edit_foobar.feature
Feature: As a user, I want to edit a Foobar, so I can Baz

Scenario: Validation Errors
  Given I am logged in as a user
  And a foobar exists
  And I edit the foobar with invalid data
  Then I should see validation errors
Run Code Online (Sandbox Code Playgroud)

我认为这捕获了我们想要从故事中得到的内容,而不必处理要编辑哪些字段、要提交哪些按钮等的所有细节。它不会测试所有可能的情况,但应该通过以下方式进行测试:单元测试(设置验证的模型测试,以及设置闪存消息的控制器测试或正在处理错误的请求测试)。

其他场景类似:

Scenario: Successful Edit
  Given I am logged in as a user
  And a foobar exists
  And I edit the foobar with valid data
  Then I should see the valid data
Run Code Online (Sandbox Code Playgroud)

有些人希望将有效数据指定为测试本身的一部分,但我个人更喜欢将这些委托给步骤定义,以保持场景干净。您只需要一个示例来确保黄金案例有效,因为这并不是测试所有表单字段是否有效的合适位置(如果您指定了每个字段,维护工作将变得令人头疼)。

  • 在某些情况下(例如为了遵守适用的法律),需要特定字段是有正当的商业原因的,但我经常发现,当有人想要存储某个字段时,背后还有另一个故事(例如想要通过电子邮件发送营销材料,或者希望用户能够通过电子邮件登录)。在后一种情况下,所需的字段是实现细节,因此应该进行单元测试。在前一种情况下,您可能需要编写一个具体的命令式测试,特别是当您使用黄瓜测试与产品所有者进行通信时。 (2认同)