php - 如何处理在“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,它有一个给定的,何时,然后在背景之后的每个场景中)。
建议?
解决方案
除了@Stratadox 的答案(按行为划分场景)- Given
step 永远不应该指用户界面或用户旅程中的阶段。用户所在的页面与业务逻辑无关。
该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
这里的最后一步意味着在后台执行三个断言。这很好,因为每个人都知道“购买经历”意味着什么
推荐阅读
- flutter - 将图像添加到扩展磁贴
- c# - C#/JSON - TypeNameHandling 仅在 SerializationBinder 被触发时
- node.js - 打字稿获取响应流
- python-3.x - “对象没有属性‘配置’”——Label.Configure 只工作一次?
- nginx - nginx 拒绝访问根目录和所有子文件夹
- r - R - 更多或等于 (≥) - 符号显示/保存为等号 (=)
- php - 新的 Instagram API PHP
- .net - 失败,因为返回的路径不存在
- java - 创建apk文件时发现错误':app:mergeDebugResources'
- c# - 以编程方式将 ics 会议邀请添加到 Google 日历