spock测试零基础教程

Posted by hcy on July 1, 2021

spock测试零基础教程

​ 昨天研究了一下spock单元测试,确实特别好用,这也是我第一次接触spock,作为一个新手,网上很多教程讲的太深了,折腾了好几个小时才搞明白。 ​ 所以我想写一个从0开始的简单教程,一步一步做把Demo跑起来,再去看其他人的教程,这样更有效率。

下面我将基于spock2.x版本进行演示。可以新建一个空SpringBoot项目进行测试,防止项目内的其他依赖冲突,Demo跑不起来。

1.引入依赖

这里引入了spock2.x的包,默认情况下spock会自动将groovy引入进来,我这里主动声明了groovy的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
    <dependency>
      <groupId>org.spockframework</groupId>
      <artifactId>spock-core</artifactId>
      <version>2.0-groovy-3.0</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.spockframework</groupId>
      <artifactId>spock-core</artifactId>
      <version>2.0-groovy-3.0</version>
      <scope>test</scope>
    </dependency>

2.创建测试类

在测试目录下,右键选择Spock Specification,会自动创建一个类继承了Specification。

image-20210701180417247

image-20210701180837107

上面这一步也可以选择创建一个普通Groovy Class,我们手动继承Specification也是一样的。

3.编写测试方法

下面就是我们编写的测试方法,我们定义 a = 1+1,然后断言 a == 2

image-20210701180955534

上图中的步骤

  1. 我们定义一个方法,其中方法名是双引号引起来的,Groovy中是允许这样的,这也是Spock的一个规范,不用双引号引起来也是可以的。
  2. 使用when: 标识下面的代码块是我们需要执行验证的代码
  3. 我们真正要测试的代码,如果这里面抛出异常,不会导致方法退出,when:代码块内部是被try catch的,框架帮我们try catch住了
  4. then:代码块,必须和when: 成对出现,两者必须成对,且要写在when:后面
  5. 我们可以在then:代码块中进行断言,不需要assert这样的关键字,直接写语句就可以,使用返回值为boolean的语句,会被当成断言使用

4.执行

​ 就像使用junit一样,点击1处执行测试,我的idea里面有时点击2处的执行不太好使,但1处总是可以的,如果有和我一样的情况,可以尝试使用1处的执行按钮。

image-20210701181926632

执行通过了。

image-20210701182059634

5.还有哪些代码块

上面我们看到,我们在when 中执行我们的逻辑,在then中验证我们的逻辑。除此之外还有下面几个块

image-20210701182812721

首先

1 处given,一般是第一个代码块,我们在此准备需要验证的数据

2 处的when 和 3处的then 是必须配合使用的,when用来执行操作,then用来验证操作

4 处的and用来分隔,一般写点注释性语句

5 处的expect相当于 when 和 then 的结合,独立出现,可以在里面执行一些语句,如果语句返回值是boolean,则会被当作断言进行判断。

6.更强大的where块

有时我们想测试多组数据,如我们想测试四组数据

2 == Math.max(1,2)

5 == Math.max(4,5)

10 == Math.max(10,5)

2 == Math.max(2,3)

我们可以使用where块解决此问题

image-20210701183548811

  1. 在代码中使用到了变量 a,b,c但我们并没有在使用之前定义它们
  2. where块中,我们使用竖线作为分隔符,c a b 作为表头,写了一个表格,这样spock会依次拿表格中的每一行带入到c a b的变量总进行测试,上述表格中有四条数据,所以总共测试四次

执行结果也明确表示,第四条测试没通过:

image-20210701183909934

7.配合springboot 进行测试

​ 在上面基础上,添加spring-boot-starter-test的依赖,排除掉junit-vintage-engine,因为我们需要junit5版本的依赖,而这个是junit4版本的,我们将其排除掉。

​ spock2需要junit5,springboot2自带的就是junit5,spock1需要junit4,springboot1自带的就是junit4。

​ 如果需要交叉版本使用,需要自己处理好依赖版本关系。我这里使用的是spock2+springboot2的组合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.hamcrest</groupId>
                    <artifactId>hamcrest-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

使用方式如下:

image-20210701190437780

1 使用@SpringBootTest注解标识类

2 自动注入是可以使用的,我们这里注入一个DataSource

3 验证数据源可用

4 断言没有抛出任何异常

5 断言resultSet 非空

6 点击这里的三角号执行,而不是方法旁边的三角号 (这里也可能是我的idea版本问题,如果下面可以使用,使用下面的也可以的)

总结

​ 以上就是使用spock的入门教程,一步一步来的话能将spock运行起来,配合springboot也是完全可以的。深入了解的话,可以继续看其他深入点的教程,或直接看官方文档。


转载请注明出处:https://www.huangchaoyu.com/2021/07/01/spock测试零基础教程/