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

在前两篇中,我们介绍了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,我们将得到一个典型的失败的测试用例输出:
Cucumber概念解析与Java入门实例 (下)_第1张图片

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

让它通过吧!

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

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

package implementation;

public class Checkout {
    public void add(int count, int price) {
    }

    public int total() {
        return 40;
    }
}

运行一下:
output

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

是时候做一下调整了,让我们在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语法确实很酷!
让我们看看现在的输出如何:
Cucumber概念解析与Java入门实例 (下)_第2张图片

可以看出,两个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

完美:
output

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

感谢大家和我一起实作!

Have a nice day!

你可能感兴趣的:(Cucumber,Java,Testing)