在前两篇中,我们介绍了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!