Cucumber 在哪里正确地提取步骤数据?

Cucumber 在哪里正确地提取步骤数据?,cucumber,bdd,Cucumber,Bdd,我需要编写一个类来强制执行关于可以或不可以添加到仓库中同一容器中的项目的规则,并且我希望在实现它之前将需求转换为Cucumber 每个项目都有几个属性,例如“项目系列”(例如:电子产品、书籍)、“项目状态”(例如:主库存、故障库存)和“批次”(例如:10501051) 我可以想出几种写黄瓜测试的策略,我想知道哪一种是推荐的: 首先,您可以枚举每个产品的所有属性: Given I have a tote containing: | sku | client | family | st

我需要编写一个类来强制执行关于可以或不可以添加到仓库中同一容器中的项目的规则,并且我希望在实现它之前将需求转换为Cucumber

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

我可以想出几种写黄瓜测试的策略,我想知道哪一种是推荐的:

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

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

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

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

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

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

那么我会倾向于第二种选择。只需确保您将在引擎盖下使用
FactoryGirl
或类似的工具来创建通用对象,并一次只覆盖您需要的内容

我希望您会觉得这很有用。

您的团队中的非技术人员最容易理解的答案。与QA负责人和项目经理坐下来,问他们同样的问题。我也有类似的问题,从你的第一个建议开始。然后我觉得太详细了,就跳到了第3页。然后我和项目经理坐下来,发现当我创建数据时,我不需要任何细节,但是当我们更改数据时(在我们的例子中,更新发票上的行项目值),我们希望看到这些值在步骤中是什么

第六章“黄瓜什么时候变坏”在引导正确的细节方面确实很有帮助。我真的认为你应该读一读,特别是关于提出一种普遍存在的语言的部分。我认为这将帮助您为您的组织确定正确的详细级别

如果你想使用第一个测试,我对你的问题是,“你多久会改变这些值?”如果答案是“不是很”或“永远”,那么你应该考虑他们是增加还是减损了测试的可读性。 另外,我还在读,但到目前为止,它非常有用,例如,正如索乔帕塔所建议的那样,它把我指向工厂女孩