我正在编写一个功能,该功能涉及像典型的电子商务应用程序一样向购物车中添加多个项目。

就是这样-

Scenario: Promotion is applied
    Given I select "Bacon" worth "$1"
    Given I select "Lettuce" worth "$2"
    Given I select "Diet Coke" worth "$5"
    Given I select "Bread" worth "$2"
    Then  "$0.5" promotion should be applied for "Bacon"
    Then  "$0.0" promotion should be applied for "Lettuce"
    Then  "$0.5" promotion should be applied for "Diet Coke"
    Then  "$1.0" promotion should be applied for "Bread"
    Then  total paid should be "$8"


不用说,stepdefs.js看起来像这样:

Given(/^I select "([^"]*)" worth "([^"]*)"$/, function (item, price) {
 //addToCart
});


等等

还有另一种情况类似,只是增加衣服而不是食品。

如果我使用的是方案大纲和示例,它将变为:

Scenario Outline: Promotion is applied
    Given I select "<item>" worth "<price>"
    Given I select "<item>" worth "<price>"
    Given I select "<item>" worth "<price>"
    Given I select "<item>" worth "<price>"
    Then  "<discount>" promotion should be applied for "<item>
    Then  "<discount>" promotion should be applied for "<item>
    Then  "<discount>" promotion should be applied for "<item>
    Then  "<discount>" promotion should be applied for "<item>
    Then  total paid should be "$8"


例子:

 | item | price | discount |
 | "Bacon" | "$1" | 0.5
 | "Lettuce" | "$2" | 0.0
 | "Diet  Coke" | "$5" | 1.0
 | "Bread" | "$2" | 0.5


但是它每行运行一次测试(因此要运行四个测试),我本质上想要的是对一个测试运行所有的测试。

实际上,我想将它们作为添加食物的4个项目和添加衣服的2个项目来运行。所以,

Scenario Outline: Promotion is applied <type>
    Given I select "<item>" worth "<price>"
    Then  "<discount>" promotion should be applied for "<item>"
    Then  total paid should be "<total>"


例子:

type | items & prices & promotion (may be some object like that?) | total
food | [ {"Bacon - $1 - 0.5"}, {"Lettuce - $2 - 0.0"}, {"Diet  Coke - $5 - 1.0"}, {"Bread - $2 - 0.5"} ] /*takes an array*/ | $8
clothes | [{"pant - $50 - 10"}, {"shirt - $25 - 5"}] | $60


可能吗如何做到这一点?

谢谢

[编辑]:这只是一个示例问题,我已经消除了所有复杂性,这只是一个固定的版本。我的想法是找到一种在场景中使用对象数组的方法。请不要使用问题中提到的名称和数字。

最佳答案

将数据放到场景中是一种真正增加更改成本的好方法,同时又要创建脆弱的测试并增加维护成本。所以不要这样做。

另外,您没有明确说明要测试的内容,而是要重复自己。

从您写的内容中,我可以看到您可能在此处指定了许多不同的行为。

您应该为这些事情编写单独的方案。所以您可能会遇到类似

Scenario: Promotion affects all products in the basket
  Given a have a basket with several products
  And I have applied a promotion
  When I go to the checkout
  Then I should see a discount applied to each product

Scenario: Some products are not discountable


处理折扣的实际价值

Scenario: Correct discount rate is applied for a promotion
  Given a promotion with a 20% discount
  And a basket of products
  When I go to the checkout
  Then I should see a 20% discount


等等等

注意:像示例中那样进行计算是一种特别有效的方法,它使您的方案的维护成本很高,并增加了更改应用程序的成本。

考虑你的例子。它有一些隐藏在图中的业务规则。其中一些可能是:


生菜不打折促销
培根是半价的(还是任何数量的培根都可以获得50英镑的优惠?)
...


请注意,在示例场景中没有明确指定这些规则,您必须从示例中推断(猜测)该规则。

现在,所有这些都是必须以某种方式在您的应用程序中编码的规则(希望在促销和产品中)。什么时候发生


生菜变得可打折
培根供应紧张,所以您不能再打折了


使用当前的方法,结果是测试失败,并且必须重新编写方案以反映新的业务状况-因此,您大大增加了变更成本。

这个东西的简单规则是不要在场景中放置计算得出的数字。更完整,更复杂的规则是,场景中的所有示例都应成熟为业务规则的简洁语言表达。他们应该了解到什么,即某些产品可以有一定的折扣,而不是如何,即培根目前每磅便宜50c。然后,如果有人进行了简单的配置更改,那么培根就不再便宜了,因此您的测试不会失败。

关于javascript - cucumber -数据驱动的测试-同一场景中的多个相似步骤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59250093/

10-17 02:38