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