写单元测试懒人神器spock(单元测试的测试工具)
ccwgpt 2024-10-09 08:37 26 浏览 0 评论
有人说:“不做单元测试的代码就好像上厕所不洗手”,可见单元测试重要性不言而喻,但实际在国内的开发中,很多开发都没有写单元测试的习惯,为什么单元测试如此重要,但实际在执行落地过程中为什么这么难?
无外乎存在以下方面
1、开发人员的质量意识不够,普遍认为开发质量是由QA负责的,开发只管写代码。
2、代码逻辑过于复杂,写单元测试的耗时较长,代码量多,一般用Junit写单元测试的代码基本相当于代码的3倍
3、业务代码变化频繁,单元测试维护的成本较高,可能刚开始写的很好,写到后面慢慢维护少了,慢慢的原有的单元测试也就没有什么用了。
4、任务重,工期紧,正常的代码都写不完,更何况单元测试了。
.......
以上原因,如果进行归纳总结,无外乎就是两个原因
一、不想写呗
二、写单元测试任务重。
如果是不想写,那只能从其他方面去想办法改变这种状态,别无他法。
但写单元测试任务重?有没有一些可以偷懒的方式,能够提高写单元测试的效率,减少写单元测试的时间,那么本文带来一款写单元测试的利器spock
什么是spock?
spock 是什么?官网给出的原文是
Spock is a testing and specification framework for Java and Groovy applications. What makes it stand out from the crowd is its beautiful and highly expressive specification language. Thanks to its JUnit runner, Spock is compatible with most IDEs, build tools, and continuous integration servers. Spock is inspired from JUnit, RSpec, jMock, Mockito, Groovy, Scala, Vulcans, and other fascinating life forms.
简单来说就是
1、spock 是一个基于Java和Grovvy语言的测试框架
2、它的灵感来源于JUnit、RSpec、jMock、Mockito、Groovy、Scala、Vulcans,得益于JUnit,使得Spock能于多大数的IDE、构建工具进行集成
很明显Spock一出生就站在巨人的肩膀上,更详细的有关spock的说明可以参考其官网
https://spockframework.org/
为什么使用Spock?
对于一个测试框架,我们将它与传统的测试框架Junit进行对比,看它有什么神奇之处。
一、测试数据
在写单元测试的时候,最烦的就是测试数据,如果在一个特别复杂,if/else分支特别多的场景下,写单元测试简直让人崩溃,为了测试一个正常的业务代码,可能要花费几倍甚至于几十倍的单元测试代码。
举个简单的例子:假设有这么一个方法,获取文件名作为输入并验证其扩展名。要求只有.jpeg、.jpg和.bmp扩展名可以通过,而其他扩展名是不允许的。这个方法会根据文件扩展名返回 "true "或 "false”。
public class ImageValidate {
public static boolean validate(String filename){
if(filename==null){
return false;
}
if(filename.endsWith(".jpeg")||filename.endsWith(".jpg")||filename.endsWith(".bmp")){
return true;
}else {
return false;
}
}
}
spock写法:
@Title("测试文件扩展名验证方法")
class ImageValidator extends Specification {
@Unroll
def "validate extension of #filename"() {
when: "validator checks filename"
def isValid = ImageValidate. validate(filename)
then: "return appropriate result"
isValid == expectedResult
where: "input files are"
filename || expectedResult
'some.jpeg' || true
'some.jpg' || true
'some.tiff' || false
'some.bmp' || true
'some.png' || false
}
}
Junit写法
@RunWith(Parameterized.class)
@RunWith(Parameterized.class)
public class ImageValidatorTest {
@Parameters
public static Collection<Object[]> data() {
return asList(new Object[][]{
{"some.jpeg", true},
{"some.jpg", true},
{"some.tiff", false},
{"some.bmp", true},
{"some.png", false}
});
}
private String filename;
private boolean isValid;
public ImageValidatorTest(String filename, boolean expected) {
this.filename = filename;
this. isValid = expected;
}
@Test
public void validateFileExtension() {
assertEquals(isValid, ImageValidate.validate(filename));
}
}
从代码片段中可以看出,JUnit代码很明显要比Spock 要多,且可读性方面也没有Spock清晰。
二、Mock能力
在写JUnit单测的时候,要想使用Mock功能或多或少都需要依赖一些三方库,例如EasyMock或Mockito,但在Spock中无需再引用任何第三方依赖,直接使用Mock()方法即可
举个例子
@Service
public class UserService {
@Autowired
private UserDao userDao;
public UserVO getUserById(int id) {
List<UserDTO> users = userDao.getUserList();
UserDTO userDTO = users.stream().filter(u -> u.getId() == id).findFirst().orElse(null);
UserVO userVO = new UserVO();
if (userDTO == null) {
return userVO;
}
userVO.setId(userDTO.getId());
userVO.setName(userDTO.getName());
userVO.setSex(userDTO.getSex());
userVO.setAge(userDTO.getAge());
return userVO;
}
}
可以使用spock自带的mock能力对userDao进行mock,非常简单
class UserServiceSpec extends Specification {
def userDao = Mock(UserDao)
def tester = new UserService(userDao: UserDao)
def "test getUserById"() {
given: "初始化参数"
def user1 = new UserDTO(id: 1, name: "张三", age: 16,sex:'男')
def user2 = new UserDTO(id: 2, name: "李四", age: 18,sex:'女')
and: "mock userDao"
userDao.getUserList() >> [user1, user2]
when: "获取用户信息(getUserById)"
def response = tester.getUserById(1)
then: "结果验证"
with(response) {
id == 1
name == "张三"
age == 16
sex == '男'
}
}
}
写在最后
当然Spock功能不仅仅只是这样,还有更多的功能强大的功能等着我们去发掘,通过上面几个例子,基本大家可以发现Spock在写单元测试的时候,无论从测试数据、mock能力还是代码的可读性方面均比junit要更好,当然spock也有一些学习的成本,对于不知道grovvy脚本的开发人员来说,还需要额外了解grovvy脚本的语法。
更多关于spock的资料可以参考
相关推荐
- 谷歌正在为Play商店进行Material Design改造
-
谷歌最近一直忙于在其应用程序中完成MaterialDesign风格的改造,而Play商店似乎是接下来的一个。9to5Google网站报道,有用户在Play商店的最新版本中发现了新界面,暗示该应用和网...
- 企业网站免费搭建,定制化建站CMS系统
-
科腾软件企业网站CMS管理系统已完成开发工作,首次开源(全部源码)发布。开发工具:VisualStudioEnterprise2022数据库:SQLite(零配置,跨平台,嵌入式)开发...
- 您需要的 11 个免费 Chrome 扩展程序
-
来源:SEO_SEM营销顾问大师Chrome扩展程序是SEO的无名英雄,他们在幕后默默工作,使您的策略脱颖而出并提高您的努力效率。从竞争对手研究到审核您的网站,速度比您说“元描述”还快,这些小工具发...
- 户外便携设备抗干扰困境如何破局?CMS-160925-078S-67给出答案
-
在户外复杂的电磁环境中,便携式设备中的扬声器需具备出色抗干扰能力,CUID的CMS-160925-078S-67在这方面表现突出。 从其结构设计来看,矩形框架虽主要为适配紧凑空...
- 一个基于NetCore开发的前后端分离CMS系统
-
今天给大家推荐一个开源的前后端分离架构的CMS建站系统。项目简介这是一个基于.Net3构建的简单、跨平台、模块化建站系统。系统业务简单、代码清晰、层级分明、全新架构便于二次扩展开发。支持多种数据库,...
- 本地Docker部署ZFile网盘打造个人云存储
-
前言本文主要介绍如何在LinuxUbuntu系统使用Docker本地部署ZFile文件管理系统,并结合cpolar内网穿透工具实现远程访问本地服务器上的ZFile传输与备份文件,轻松搭建个人网盘,无...
- pcfcms企业建站系统 免费+开源的企业内容管理系统
-
项目介绍pcfcms是基于TP6.0框架为核心开发的免费+开源的企业内容管理系统,专注企业建站用户需求提供海量各行业模板,降低中小企业网站建设、网络营销成本,致力于打造用户舒适的建站体验。演示站...
- 【推荐】一个高颜值且功能强大的 Vue3 后台管理系统框架
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍SnowAdmin是一款基于Vue3、TypeScript、Vite5、Pinia、Arco-Desi...
- java开源cms管理系统框架PublicCMS后台管理系统
-
一款使用Java语言开发的CMS,提供文章发布,图片展示,文件下载,用户权限、站点模块,内容管理、分类等功能。可免费用于商业用途maven工程数据库脚本在工程中database文件夹下代码结构:效果...
- 一定要大量读书:当我问Deepseek,它给出的高效阅读方法厉害了!
-
一年一度的世界读书日,总该写点什么。于是,我去问Deepseek给我推荐人生破局必读的10本书,结果它给了我回复,竟然10本推荐的书籍里,我都曾经浏览过,同时还给出破局关键。而说浏览过,不是读过,是因...
- 《搜神札记》:不应磨灭的惊奇(小说《搜神记》)
-
□黄勃志怪传说的书写一直是文人墨客的后花园,晚近尤盛,从张岱到袁枚到纪昀,收集那些或阴森或吊诡的行状故事,遂成一类,到民国年间,周作人挟此遗传,捋袖子拿希腊神话动刀,乃兄鲁迅不甘其后,《故事新编》虎...
- 《如何构建金字塔》之第三章总结(构建金字塔结构的方法有)
-
“没有什么比一套好理论更有用了。”——库尔特.勒温这篇读后感依然引用了这句库尔特.勒温名言,这句话也是我读芭芭拉.明托这本书的初衷。今天就“如何构建金字塔”,我来谈谈我的读后心得。我热爱写作,但是写...
- 《助人技术》第一章助人引论内容框架
-
第一章内容基本呈现如何成为助人者(心理咨询师)以及一些相关基础知识,对于进入这个行业有兴趣以及希望通过心理咨询寻求帮助但存有疑虑的当事人,都值得一读。心理咨询的三个阶段(不是说严格的三个阶段,而是广义...
- AI助手重构读后感写作流程:从提纲到完整性思考的转换
-
大家好!你有没有遇到过读完一本书,想要写读后感,却不知道从何下手的情况呢?今天我们要来探讨一下如何利用稿见AI助手来重构读后感写作流程,从提纲到完整性思考的转换。让我们一起来看看这个全新而又实用的方法...
- 图解用思维导图做读书笔记技巧(图解用思维导图做读书笔记技巧视频)
-
做阅读笔记非常有利于读后进行有效的深入思考,而思维导图这一强大的工具其最大的特点就是架构清晰,在阅读过程中对文章的分析、总结、分类起着很大的辅助作用。思维导图读书笔记步骤:1、阅读大纲。首先要快速浏览...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)