Cucumber概念解析与Java入门实例 (下)

xiaoxiao2021-02-28  101

在前两篇中,我们介绍了Cucumber及相关的核心概念,并逐步在Checkout项目实现中了解其作为自动化测试的工作流程。现在我们来完成最后的工作吧! 有需要的话可以回顾: Cucumber概念解析与Java入门实例 (上) Cucumber概念解析与Java入门实例 (中)

添加断言

为了让最后一个step也通过,修改其step定义如下(同时不要忘记把要调用的checkout实例提出置为全局的):

Checkout checkout; @When("^I checkout (\\d+) \"(.*?)\"$") public void iCheckout(int itemCount, String itemName) throws Throwable { checkout = new Checkout(); checkout.add(itemCount, bananaPrice); } @Then("^the total price should be (\\d+)c$") public void theTotalPriceShouldBeC(int total) throws Throwable { assertEquals(total, checkout.total()); }

我们使用JUnit断言来检查feature中我们的预期结果是否符合Checkout的实际结果。如果不相符,JUnit会引发错误。在编译之前,我们需要在下载最新的JUnit JAR放入jars文件夹中。 就在3天前(2017.7.9),JUnit团队release了JUnit5 M5版本,由于还没有正式版本的发布,我本着怎么可以不尝鲜的人生信条进行了配置,有很多新鲜事,不过配置起来相比正式版本还是相对繁琐,所以为了我们项目的可复现性以及正确性,我们还是使用稳定的最新版JUnit4的Jar包吧,同样可以从maven仓库下载到:http://mvnrepository.com/artifact/junit/junit/4.12

同时我们也要在step_definitions/CheckoutSteps.java中添加import入JUnit的语句:

import static org.junit.Assert.*;

再在Checkout类中增添total()的实现:

public int total() { return 0; }

运行./cucumber,我们将得到一个典型的失败的测试用例输出:

很棒! 现在我们的测试用例失败得合乎情理,它正在使用Checkout,检查购物总价,并告诉我们正确的总价应该是什么。

让它通过吧!

是时候想出一个解决方案让我们的scenario测试通过了。

当然,有一个相当耿直的方法让它通过,编辑Checkout.java如下:

package implementation; public class Checkout { public void add(int count, int price) { } public int total() { return 40; } }

运行一下:

先高兴一分钟!至少通过了! 不过,这样的方法很明显会使得我们的测试不可用:其一,我们没有利用上任何的输入数据;其二,我们根本没有实际地做加法。

是时候做一下调整了,让我们在feature中加入一个新的scenario,不过并不是机械性地复制,而是使用一个全新的关键字 – Scenario Outline 修改features/checkout.feature: Feature: Checkout

Scenario Outline: Checkout bananas Given the price of a "banana" is 40c When I checkout <count> "banana" Then the total price should be <total>c Examples: | count | total | | 1 | 40 | | 2 | 80 |

我们已经将scenario变成了一个Scenario Outline,其让我们使用一个表来指定多个scenario,使用Gherkin语法确实很酷! 让我们看看现在的输出如何:

可以看出,两个scenario,第一个仍然结果会是40的自然会passed,而第二个也很容易预测会failed。

好啦!亮出我们的正确解法吧!编辑implementation/Checkout.java如下:

package implementation; public class Checkout { private int runningTotal = 0; public void add(int count, int price) { runningTotal += (count * price); } public int total() { return runningTotal; } }

我们使用实例变量runningTotal来存储我们计算出的总售价,在add方法中实现计算得到正确结果,并通过total方法返回。

最后一跑:

$ ./cucumber

完美:

我们一步一步地成功完成了Cucumber的第一大步 : )

感谢大家和我一起实作!

Have a nice day!

转载请注明原文地址: https://www.6miu.com/read-47585.html

最新回复(0)