gpt4 book ai didi

javascript - Cucumber - 数据驱动测试 - 同一场景中的多个类似步骤

转载 作者:行者123 更新时间:2023-12-02 22:20:21 24 4
gpt4 key购买 nike

我正在编写一个功能,该功能可以像典型的电子商务应用程序一样将多个商品添加到购物车。

是这样的 -

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

处理折扣的实际值(value)

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

等等。等等

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

考虑一下你的例子。它在数字中隐藏着一些业务规则。其中一些可能是:

  • 促销事件中生菜不打折
  • 培根半价(或者任何数量的培根都可以享受 50c 的折扣?)...

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

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

  • 生菜打折
  • 培根供应紧张,无法再打折

按照您当前的方法,会发生的情况是您的测试失败,并且您必须重新编写场景以反射(reflect)您的新业务条件 - 因此您大大增加了变更成本。

这个东西的简单规则是不要将计算出的数字放入场景中。更完整、更复杂的规则是场景中的所有示例都应该成熟为业务规则的简洁语言表达。他们应该捕捉“什么”,即某些产品可以有百分比折扣,而不是“如何”,即培根目前每磅便宜 50 美分。然后,如果有人进行简单的配置更改,使培根不再打折,您的测试就不会因此而中断。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com