如何处理“然后”阶段中有很多步骤的小黄瓜方案

时间:2018-10-14 19:37:03

标签: php bdd behat

他们say认为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,分别使用which has when then 背景之后的场景。

建议?

2 个答案:

答案 0 :(得分:1)

除了@Stratadox的答案(按行为拆分方案)以外-Given的步骤永远不要引用用户界面或用户旅程中的某个阶段。用户所在的页面与业务逻辑无关。

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

这里的最后一步将暗示在后台进行三个声明。很好,因为每个人都知道“购买正在进行中”意味着什么

答案 1 :(得分:0)

最简单的解决方法是遵循您在问题中引用的建议:

  

一种情况,一种行为!

要实施此建议,只需将the肿的情况分成多个较小的情况。

例如:

<?php
$con=mysqli_connect('localhost','root','','u656325986_login');

$response=array('travel' => array());

$result=mysqli_query($con,"select * from travel");

if(mysqli_num_rows($result)>0){

    while($row=mysqli_fetch_array($result)){
        $response["travel"][] = $row;
    }

    $response["t"]=1;
    echo json_encode($response);

}
else{


    $response["message"]="not fonud";
    echo json_encode($response);

}


?>

...等等。

在您的方案中,许多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 Scenario: Notifying ops of the purchase Given I am in the checkout page When I checkout the order Then ops must be notified via a slack notification 之间的关系并不密切。它们具有某种暂时的关系,因为它们都恰好在下订单后发生,仅此而已。

您甚至可以更进一步,考虑将它们归类为不同的功能。

毕竟,通知操作与处理付款是不同的功能,而付款处理又与库存计算不同。