一、什么是Spock

Spock 是一个测试框架,甚至可以说是一门语言他是基于Groovy开发的。它的语法完全遵循 BDD(行为驱动开发) 风格的结构。它是基于 Junit test runner 上开发但是又跟 Junit 完成不一样,同时集成了像 Jmock、Mockito 等语法表达风格于一体,使得它很简洁有很高的可读性。

二、Spock 优缺点

  • 语法清晰简单并且有很高的可读性

  • 不好的就是需要学习下Groovy 的语法,对Maven的配置不是很友好。但是在Gradle 中可以很好的支持

三、如何使用Spock

Maven 的配置

  • Gmavenplus-plugin 插件可以让你的测试代码支持 Groovy 语法
  • Surefire 插件 测试时只执行带有 Spec后缀的代码,这个必须是*Spec.java 而不是 groovy
  • spock-core 就是 spock 的核心包
  • byte-buddy 用来做动态代理,如果你需要测试的代码没有实现接口。spock 无法帮你mock,当然你也可以用 cliglib 代替

声明类

/**
*
* @author: serio.shi(苦参)
* @create 2020/08/05 17:22
* */
public class User { private int id;
private String name;
private int age; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

Dao 类

interface UserDao {
public User get(int id);
public User findByName(String name);
public void createUser(User user);
}

UserService 类

/**
*
* @author: serio.shi(苦参)
* @create 2020/08/05 17:23
* */
public class UserService { private UserDao userDao; public UserService(UserDao userDao) {
this.userDao = userDao;
} public User findUser(int id){
return userDao.get(id);
} public void createUser(User user){
User existing = userDao.findByName(user.getName()); if(existing == null){
userDao.createUser(user);
} else{
throw new RuntimeException(String.format("User with name %s already exists!", user.getName()));
}
}
}

测试 service的findUser 方法 mock dao的get 方法返回一个固定 user

是的你没有看错,它的方法名就是一个字符串(它有什么好处后面再讲)。它的语法很简单 given:、when:、then:、

setup 是它的元方法在测试用例执行前调用类似于 @before

  • given 需要的一些变量参数
  • when 就是需要测试的方法
  • then 就是期待的结果

1 * dao.get(id) >> new User(id:id, name:"James", age:27)

表示 dao.get(id) 方法将会被调用一次,并且让他返回 new User(id:id, name:"James", age:27) 对象。并且期待它的结果是 result.id == 1、result.name == "James"、result.age == 27

在运行测试后

从图中我们可以看到,我们定义的方法名被打印出来。我们可以很方便的看到我们想要测试的内容成功了。

如果验证没有通过 Spock 将通过图表的方式告诉你哪里出问题,并且它会帮你把两个值的打印出来帮你做对比(经常有小伙伴写测试用例的时候把值打印出来用肉眼来识别错误)。我们把期待的id改为12再来试下。

我们可以看到 Spock 提示你测试用例失败了,你的id 是1而期待的是12,当你点击 <Click to see difference> 的时候将会弹出一个框帮你做数据对比。简直是开发神器啊有木有!!!

Spock 还有一个神奇的参数化测试,类似于表格的形式填入参数和期待的结果

我们先在UserService类中加上以下代码:

Map datatable = [1:"jerry", 2:"tom", 3:"tommy", 4:"jack"]
public String getUser(int id){
return datatable.get(id)
}

添加测试用例:

def "spock parameterized test demo"(){
expect:
service.getUser(id) == name
where: "some id with name"
id || name
1 || "jerry"
2 || "tom"
3 || "tommy"
4 || "jack"
}

可以看到我们可以以更清晰的方式把入参跟结果描述出来,运行结果:

当前它还有很多的姿势待我们去解锁,本文只举例了简单的案例。

更多详情点击:http://spockframework.org/spock/docs/1.3/all_in_one.html#_introduction

四、小结

Spock 有着依赖少、运行快、语法简单、代码清晰等特点、本文只做简单的举例用于学习和记录

使用Spock 单元测试的更多相关文章

  1. Groovy+Spock单元测试

    一.导入依赖 Spock是基于JUnit的单测框架,提供一些更好的语法,结合Groovy语言,可以写出更为简洁的单测. <!-- groovy依赖 --> <dependency&g ...

  2. SpringCloud升级之路2020.0.x版-40. spock 单元测试封装的 WebClient(下)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们继续上一节,继续使用 spock 测试我们自己封装的 WebClient 测试针对 r ...

  3. SpringCloud升级之路2020.0.x版-40. spock 单元测试封装的 WebClient(上)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们来测试下前面封装好的 WebClient,这里开始,我们使用 spock 编写 gro ...

  4. 运用Spock编写高质量单元测试

    单元测试作为提升代码质量的有效方法,目前在国内各大互联网公司的开发团队中,尤其是业务团队中却鲜少被使用.这主要由于大家对于单元测试有一些认知错误,或者没有正确的打开方式.至今我们团队在小剧场.零代码运 ...

  5. Groovy单元测试框架spock数据驱动Demo

    spock是一款全能型的单元测试框架. 上次文章分享了spock框架的基础功能的使用,在此基础上,我根据自己写的Groovy的封装方法.数据驱动以及一些Groovy的高级语法做了一些尝试.发现还是有一 ...

  6. Groovy单元测试框架spock基础功能Demo

    spock是一款全能型的单元测试框架. 最近在做单元测试框架的调研和尝试,目前确定的方案框架包括是:spock,Junit,Mockito以及powermock.由于本身使用Groovy的原因,比较钟 ...

  7. Maven和Gradle中配置单元测试框架Spock

    Maven Maven本身不支持其他JVM语言(例如Groovy或Scala).要在Maven项目中使用它,需要使用第三方插件.对于Groovy而言,最好的选择似乎是GMavenPlus(重写不再维护 ...

  8. 使用Groovy+Spock构建可配置的订单搜索接口测试用例集

    概述 测试是软件成功上线的安全网.基本的测试包含单元测试.接口测试.在 "使用Groovy+Spock轻松写出更简洁的单测" 一文中已经讨论了使用GroovySpock编写简洁的单 ...

  9. Java单元测试框架 JUnit

    Java单元测试框架 JUnit JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一 ...

随机推荐

  1. 基于Three.js的全景---photo-sphere-viewer

    以前公司其他几个前端做全景都是用软件生成,由于本人比较懒,不想去折腾那个软件,于是乎就有了下面的事...... 这个是基于three.js的全景插件  photo-sphere-viewer.js  ...

  2. DirectX11 With Windows SDK--34 位移贴图

    前言 在前面的章节中,我们学到了法线贴图和曲面细分.现在我们可以将这两者进行结合以改善效果,因为法线贴图仅仅只是改善了光照的细节,但它并没有从根本上改善几何体的细节.从某种意义上来说,法线贴图只是一个 ...

  3. 服务端socket重用属性设置

    初始化socket socket是一种系统资源,并不是每次初始化都一定成功,因此为了避免初始化失败,一般使用多次初始化的方式,如下所示: unsigned int times = 0x0; while ...

  4. websphere8.5配置db2数据源

    websphere8.5配置db2数据源 1. 打开websphere控制台  2.进入websphere变量页面  3. 进入DB2UNIVERSAL_JDBC_DRIVER_NATIVEPATH变 ...

  5. windows如何解决Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion'

    问题再现与解读 首次,使用 java 命令+任意参数 都会报这个错误,最典型的就是java -version 解读一下这个报错信息,注册表路径 Software\JavaSoft\Java Runti ...

  6. python下载及安装方法

    打开 http://www.python.org   找到Downlodas 点击windows   下载安装

  7. Monster Audio 使用教程(三)多音轨录音、播放

    在工作站音轨上,把需要进行录音的音轨的录音按钮点亮,然后点击液晶屏旁边的[录音]按钮,开始录音  导出干声 如果希望录音后,导出干声(干声为录下的原始声音,不受效果器的作用),用其他宿主软件进行处理, ...

  8. SpringBoot-使用lombok插件运行报错

    SpringBoot-使用lombok插件运行报错 标签(空格分隔): java,SpringBoot 1.报错信息 2.解决方案 1.IDEA编辑器安装lombok插件 2.编译注解配置-Enabl ...

  9. 自动化不知如何参数化?xlrd来帮你解决

    平时在做自动化测试的时候,一直都是要求数据与业务逻辑分离.把测试数据都写在业务里面的话,比较混杂.为了方便管理测试数据,所以引入了python的一个扩展库--xlrd.该库使用简单,能满足自动化测试的 ...

  10. Thinkphp5-0-X远程代码执行漏洞分析(2019-1-11)

    周五下午爆洞能不能让人们好好休个周末! 分析过程 本次漏洞关键位置:/thinkphp/library/think/Request.php,lines:501由图可以看到在method函数中引入了可控 ...