spock中使用到的groovy语法

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2019/08/spock-groovy.html

引言

在使用spock测试框架时,常常会有如下的测试代码出现:

    // 测试方法
    def "test plus 1"() {
        given: "准备数据"
        def a = 1
        def b = 2

        when: "测试方法"
        def c = calculateService.plus(a, b)

        then: "校验结果"
        c == 4 - 1
    }

很多人把它当作固定格式来看待 ,尤其是像我这种从java几天内上手groovy和spock的,几乎不会去深究这是什么语法。

其实,在spock框架中,使用到一些groovy特有的语法格式,这些语法在Java中并不常见,具体如下:

Labeled statements 标签语句

Any statement can be associated with a label. Labels do not impact the semantics of the code and can be used to make the code easier to read like in the following example:

任何语句都可以关联一个标签,这样不但不改变语义,还可以让语句的可读性更强,如下:

given:
    def x = 1
    def y = 2
when:
    def z = x+y
then:
    assert z == 3

其实,在java中也有标签语句,如下代码:

for (int i=0;i<10;i++) {
    for (int j=0;j<i;j++) {
        System.out.println(j);
        if (j == 5) {
            break exit;
        }
    }
    exit: System.out.println(i);
}

虽然上面的代码是符合语法的,但是java中一般不推荐使用标签语句。但是在使用groovy语言的spock测试框架中,这种语法很流行,因为它确实让测试代码更加简单明了。

Power assertion 强断言/强力断言

Power assertion 强断言/强力断言,就是在断言失败时,提供一个可视化的表达,让我们更清楚地看到断言失败的原因以及断言语句每一部分的运算结果。

例如,执行以下断言语句:

assert 1+1 == 3

将会打印出以下内容:

Caught: Assertion failed:

assert 1+1 == 3
        |  |
        2  false

当断言语句更加复杂时,power assertion 则更加能发挥出优势来。例如,下面spock框架具体测试用例和答应出的结果:

spock中使用到的groovy语法插图
power assertion

data tables

    def "test1"() {
        given: "准备mock数据"

        expect: "测试方法"
        z == calculateService.plus(x, y)

        where: "校验结果"
        x | y || z
        1 | 0 || 1
        2 | 1 || 3
    }

以上代码中,where标签后的语句被称为 data tables。这并不是groovy的语法,而是spock框架支持的,这种写法能让数据驱动测试的思想更加明了,让测试这更加专注于数据。

发表评论