spock测试零基础教程
spock测试零基础教程
昨天研究了一下spock单元测试,确实特别好用,这也是我第一次接触spock,作为一个新手,网上很多教程讲的太深了,折腾了好几个小时才搞明白。
所以我想写一个从0开始的简单教程,一步一步做把Demo跑起来,再去看其他人的教程,这样更有效率。
下面我将基于spock2.x版本进行演示。可以新建一个空SpringBoot项目进行测试,防止项目内的其他依赖冲突,Demo跑不起来。
1.引入依赖
这里引入了spock2.x的包,默认情况下spock会自动将groovy引入进来,我这里主动声明了groovy的依赖
1 |
|
2.创建测试类
在测试目录下,右键选择Spock Specification,会自动创建一个类继承了Specification。
上面这一步也可以选择创建一个普通Groovy Class,我们手动继承Specification也是一样的。
3.编写测试方法
下面就是我们编写的测试方法,我们定义 a = 1+1,然后断言 a == 2
上图中的步骤
- 我们定义一个方法,其中方法名是双引号引起来的,Groovy中是允许这样的,这也是Spock的一个规范,不用双引号引起来也是可以的。
- 使用when: 标识下面的代码块是我们需要执行验证的代码
- 我们真正要测试的代码,如果这里面抛出异常,不会导致方法退出,when:代码块内部是被try catch的,框架帮我们try catch住了
- then:代码块,必须和when: 成对出现,两者必须成对,且要写在when:后面
- 我们可以在then:代码块中进行断言,不需要assert这样的关键字,直接写语句就可以,使用返回值为boolean的语句,会被当成断言使用
4.执行
就像使用junit一样,点击1处执行测试,我的idea里面有时点击2处的执行不太好使,但1处总是可以的,如果有和我一样的情况,可以尝试使用1处的执行按钮。
执行通过了。
5.还有哪些代码块
上面我们看到,我们在when 中执行我们的逻辑,在then中验证我们的逻辑。除此之外还有下面几个块
首先
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块解决此问题
- 在代码中使用到了变量 a,b,c但我们并没有在使用之前定义它们
- where块中,我们使用竖线作为分隔符,c a b 作为表头,写了一个表格,这样spock会依次拿表格中的每一行带入到c a b的变量总进行测试,上述表格中有四条数据,所以总共测试四次
执行结果也明确表示,第四条测试没通过:
7.配合springboot 进行测试
在上面基础上,添加spring-boot-starter-test的依赖,排除掉junit-vintage-engine
,因为我们需要junit5版本的依赖,而这个是junit4版本的,我们将其排除掉。
spock2需要junit5,springboot2自带的就是junit5,spock1需要junit4,springboot1自带的就是junit4。
如果需要交叉版本使用,需要自己处理好依赖版本关系。我这里使用的是spock2+springboot2的组合
1 |
|
使用方式如下:
1 使用@SpringBootTest注解标识类
2 自动注入是可以使用的,我们这里注入一个DataSource
3 验证数据源可用
4 断言没有抛出任何异常
5 断言resultSet 非空
6 点击这里的三角号执行,而不是方法旁边的三角号 (这里也可能是我的idea版本问题,如果下面可以使用,使用下面的也可以的)
总结
以上就是使用spock的入门教程,一步一步来的话能将spock运行起来,配合springboot也是完全可以的。深入了解的话,可以继续看其他深入点的教程,或直接看官方文档。