Spock介绍
Spock
是国外一款优秀的测试框架,基于BDD
(行为驱动开发)思想实现,功能非常强大。Spock
结合Groovy
动态语言的特点,提供了各种标签,并采用简单、通用、结构化的描述语言,让编写测试代码更加简洁、高效。Spock
作为测试框架,在开发效率、可读性和维护性方面均取得了不错的收益。
修改项目配置
项目用gradle
管理,用的是7.4.2
版本,spock
用的是2.0-M3-groovy-3.0
版本。
配置修改
修改文件build.gradle
并添加依赖
1 | List spockTest = [ |
修改test.gradle
,这步主要是和jacoco
结合生成报告(带覆盖率,用的jacoco
的offline
特性)
1 | apply from: 'testFilesConf.gradle' |
对Spring的封装
这边对Spring做了一个封装,可以做成一个测试的maven模块,先写一个自定义注解,主要是用作Spring容器的启动,同时制定启动的配置文件为test
1 |
|
这个时候我们在test的resource下面的application.properties
修改一下配置
1 | spring.profiles.active=test |
接下来就是写代码了
代码编写
代码写在test
目录下,跟junit
不一样的是,目录结构是:test->groovy->xxxx.xxx.xxx
需要
IDEA
把groovy
的mark directory
设置成test root
单元测试
这边不懂Spock的语法的,可以百度下,这边直接略过
先看业务代码,业务很简单,查一个字典表返回数据
1 | /** |
Mock模拟
1 |
|
Where使用
正常我们单元测试率有个分支覆盖率指标,如果用junit写太麻烦了,用spock可以非常简洁,假如字典的逻辑不同的dictName有不同的处理逻辑
1 |
|
这里可以用@Unroll
注解,可以把每一次调用作为一个单独的测试用例运行,这样运行后的单元测试结果更加直观:
1 | @Unroll |
测试异常
先修改一下业务代码,如下
1 |
|
写异常测试类
1 |
|
静态方法Mock
先修改一下业务代码
1 |
|
1 | public class DateUtil { |
静态方法测试
1 |
|
测试sql
这个原理是在每个单元测试可以写一个前置后置处理方法,比如跑测试A,会自动跑测试A的前置,把数据库初始化进去,数据初始化进去,用的是H2内存数据库,但是这个东西对特定数据库的一些语法不支持,所以不太建议这么做,简单的sql的确可以测试出问题
1 | /** |
报告
正常运行完成gradle test
会生成报告在路径build\reports\tests\test\index.html
,这个是html的,没有覆盖率的情况,如图所示:
运行我们test.gradle
中自己写的task,gradle jacocoReport
,会生成单元测试覆盖报告在路径build\reports\jacoco\index.html
,如图所示