3

我需要编写一个类来执行有关可能会或可能不会添加到仓库中同一容器中的项目的规则,并且我想在实现之前将要求转换为 Cucumber。

每个项目都有几个属性,例如“项目系列”(例如:电子产品、书籍)、“项目状态”(例如:主要库存、故障库存)和“批次”(例如:1050、1051)。

我可以想到几种为此编写 Cucumber 测试的策略,我想知道哪个是推荐的策略:

首先,您可以枚举每个产品的所有属性:

Given I have a tote containing:
  | sku    | client  | family  | status | batch | weight |
  | 100000 | Foo     | garment | main   | 1234  |     10 | 
When I add the item:
  | sku    | client  | family  | status | batch | weight |
  | 200000 | Bar     | garment | main   | 1234  |     10 |
Then I should be told there is a Client conflict

其次,您可以硬编码一个基本产品,并尝试指定与其不同的最小属性:

Given I have a tote containing an item that's client "Foo"
When I add an item that's client "Bar"
Then I should be told there is a Client conflict

这假定步骤定义包含基本属性,并在步骤中提到属性时覆盖它们。

最后,您可以进一步进行抽象:

Given I have a tote containing an item
And I add an item with a different client
Then I should be told there's a client conflict

这里有关于正确方法的任何指导吗?

4

2 回答 2

1

提到的第一个选项是最灵活和可重用的选项。使用第一种方法,您基本上可以涵盖您可能需要的任何情况,但有一些缺点,您将在下面阅读。

第二和第三个选项更容易阅读,这也是编写测试时的一个重要因素。此外,似乎专注于实际测试的内容,即“Foo”和“Bar”似乎在该场景/功能中产生的关键区别。这也是编写测试时的首选。

一般来说,恕我直言,编写 Cucumber 测试就像将自己置于岩石和坚硬的地方之间。我注意到开发人员倾向于重用和过度重用黄瓜步骤,从而创建难以理解和维护的场景。第二种方法需要在定义步骤方面做更多的工作,但是场景更清晰,更容易阅读......但是它需要更多的时间来编写场景,并且它会产生一个大的步骤定义库,这可能很难维护。

如果你真的想要 Cucumber 作为 bdd,那么我最倾向于选择第二个选项。只需确保您将使用FactoryGirl或类似的东西来创建通用对象并一次只覆盖您需要的东西。

我希望你觉得这很有用。

于 2012-04-16T15:46:54.380 回答
1

The Cucumber Book的答案将是您团队中的非技术成员最容易阅读的答案。与 QA 负责人和项目经理坐下来,问他们同样的问题。我遇到了类似的问题,并从您的第一个建议开始。然后我觉得它太详细了,跳到了#3。然后我和项目经理坐下来,发现当我创建数据时我不需要任何细节,但是当我们更改数据时(在我们的例子中更新发票上的行项目值),我们想看看那些值在步骤中。

The Cucumber Book “When Cucumbers Go Bad”中的第 6 章对指导正确的细节水平非常有帮助。我真的认为你应该读一读,尤其是关于提出一种无处不在的语言的部分。我认为这将帮助您为您的组织确定正确的详细程度。

如果你想使用第一个测试,我的问题是,“你打算多久更改一次这些值?” 如果答案是“不太”或“从不”,那么您应该考虑它们是否会增加或降低测试的可读性。

PS 我仍在阅读The Cucumber Book,但到目前为止它非常有帮助,例如,按照 socjopata 的建议将我指向 FactoryGirl。

于 2012-04-16T16:38:39.187 回答