首页 > 解决方案 > 如何处理在“then”阶段有很多步骤的小黄瓜场景

问题描述

他们BDD 的基本规则是:

一种情景,一种行为!

这很好,但事实是我得到了一个动作,它会触发系统中的许多不同的事情......我必须验证所有这些事情都会发生。这是我的小黄瓜:

Scenario: Buying a single product to be delivered now
    Given I am in the checkout page 
    When I checkout the order
    Then the order should be created to the specified address 
    And the order should be set in pending state
    And ops must be notified via a slack notification
    And A shopper must be auto assigned the order via a push notification
    And A retailer must be notified about the order via a push notification 
    And A transaction must be recorded in the payment gateway
    And My wallet should be deducted by the payment amount

这看起来真的很难看。但现在我不知道如何分开它。做背景似乎并没有削减它,因为在背景中,您只是为多个场景设置基础,每个场景都有它的时间然后配对(在我的情况下我使用的是 Behat,它有一个给定的,何时然后在背景之后的每个场景中)。

建议?

标签: phpbddbehat

解决方案


除了@Stratadox 的答案(按行为划分场景)- Givenstep 永远不应该指用户界面或用户旅程中的阶段。用户所在的页面与业务逻辑无关。

Given步骤(如Arrange单元测试中的步骤)用于将系统设置为给定状态。在步骤中设置的这个状态Given决定了结果(Then步骤)

例如:

“订单应该创建到指定的地址”——这个结果可能是由于客户正确输入了他们的地址(在这种情况下,可能需要指定实际地址,以便可以在Then步骤中声明它)。

“我的钱包应该从支付金额中扣除”——为了在你的钱包充值后断言系统处于正确状态,我们可能会检查某种数据持久性,我们也会检查特定金额。多少钱?它是您在Given步骤中指定的与此方案的结果直接相关的金额

Scenario: Being charged the correct amount on successful purchase of product
   Given I have £10 in my wallet
   When I purchase a Toaster Oven for £4
   Then I should have £6 left in my wallet

“必须通过推送通知向购物者自动分配订单”——这是可以断言为“成功购买”检查的一部分的结果。唯一取决于的是购买是否成功。您可以将诸如“购物者通知,零售商通知交易记录”之类的断言捆绑在一起 - 并在您的场景中给它们一个名称,一行,例如:

Given Jon has the following items in his basket:
  | Macbook Pro | £3000 |
When Jon checks out his basket
Then a purchase of "xyz" for £3000 by Jon should have gone through

这里的最后一步意味着在后台执行三个断言。这很好,因为每个人都知道“购买经历”意味着什么


推荐阅读