这是Spock系列的第一篇文章,整个专辑会介绍Spock的用途,为什么使用Spock?它能给我们带来什么好处?它和JUnit、JMock、Mockito有什么区别?我们平时写单元测试代码的常见问题和痛点,Spock又是如何解决的,Spock的代码怎么编写以及Spock的优势和缺点等内容,让大家对Spock有个客观的了解。

Spock是什么?

斯波克是国外一款优秀的测试框架,基于BDD思想,功能强大,能够让我们的测试代码规范化,结构层次清晰,结合groovy动态语言的特点以及自身提供的各种标签让编写测试代码更加高效简洁,提供一种通用、简单、结构化的描述语言

引用官网的介绍如下(http://spockframework.org)

“ Spock是一个Java和Groovy应用程序的测试和规范框架。

它之所以能在人群中脱颖而出,是因为它优美而富有表现力的规范语言。

斯波克的灵感来自JUnit、RSpec、jMock、Mockito、Groovy、Scala、Vulcans ”

简单说Spock的特点如下:

  • 让我们的测试代码更规范,内置多种标签来规范单测代码的语义,从而让我们的测试代码结构清晰,更具可读性,降低后期维护难度

  • 提供多种标签,比如: where、with、thrown... 帮助我们应对复杂的测试场景

  • 再加上使用groovy这种动态语言来编写测试代码,可以让我们编写的测试代码更简洁,适合敏捷开发,提高编写单测代码的效率

  • 遵从BDD行为驱动开发模式,不单是为了测试覆盖率而测试,有助于提升代码质量

  • IDE兼容性好,自带mock功能

为什么使用Spock?  Spock和JUnit、JMock、Mockito的区别在哪里?

现有的单测框架比如junit、jmock、mockito都是相对独立的工具,只是针对不同的业务场景提供特定的解决方案。

Junit单纯用于测试,不提供mock功能

微服务已经是互联网公司的主流技术架构,大部分的系统都是分布式,服务与服务之间一般通过接口的方式交互,甚至服务内部也划分成多个module,很多业务功能需要依赖底层接口返回的数据才能继续剩下的流程,或者从数据库/Redis等存储设备上获取,或是从配置中心的某个配置获取。

这样就导致如果我们想要测试代码逻辑是否正确,就必须把这些依赖项(接口、Redis、DB、配置中心...)给mock掉。

如果接口不稳定或有问题则会影响我们代码的正常测试,所以我们要把调用接口的地方给模拟掉,让它返回指定的结果(提前准备好的数据),这样才能往下验证我们自己的代码是否正确,符合预期逻辑和结果。

JMock或Mockito虽然提供了mock功能,可以把接口等依赖屏蔽掉,但不提供对静态类静态方法的mock,PowerMock或Jmockit虽然提供静态类和方法的mock,但它们之间需要整合(junit+mockito+powermock),语法繁琐,而且这些工具并没有告诉你“单元测试代码到底应该怎么写?

工具多了也会导致不同的人写出的单元测试代码五花八门,风格迥异。。。

Spock通过提供规范描述,定义多种标签(given、when、then、where等)去描述代码“应该做什么”,输入条件是什么,输出是否符合预期,从语义层面规范代码的编写。

Spock自带Mock功能,使用简单方便(也支持扩展其他mock框架,比如power mock),再加上groovy动态语言的强大语法,能写出简洁高效的测试代码,同时更方便直观的验证业务代码行为流转,增强我们对代码执行逻辑的可控性。

下一篇文章会详细讲解我们平时在编写单元测试代码过程中遇到的痛点,并结合实际的代码案例来说明Spock是如何解决这些问题的。比如单测开发的效率和成本问题,可读性以及后期维护的问题,单测如何提升业务代码质量等。

背景和初衷

网上关于Spock的资料比较简单,包括官网的demo,无法解决我们项目中的复杂业务场景,需要找到一套适合自己项目的成熟解决方案,所以觉得有必要把我们项目中使用Spock的经验分享出来, 帮助大家提升单测开发的效率和验证代码质量。

在熟练掌握Spock后我们项目组整体的单测开发效率提升了50%以上,代码可读性和维护性都得到了改善和提升。

适合人群

写Java单元测试的开发小伙伴和测试同学,所有的演示代码运行在IntelliJ IDEA中,spring-boot项目,基于Spock 1.3-groovy-2.5版本

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

Spock是什么?它和JUnit,JMock有什么区别?相关推荐

  1. Junit和Junit.Jupiter.api用法区别

    Junit和Junit.Jupiter.api用法区别写在了文章的总结处,这里先简单的介绍一下Junit用法. Junit 5 = Junit Platform + Junit Jupiter + J ...

  2. 使用Spock框架进行单元测试

    阅读目录 2.1.1.单元测试是什么 2.1.2.单元测试的定位 2.2.1.单元测试的资料不够全 2.2.2.单元测试难以理解和维护 2.2.3.单元测试难以去除依赖 3.1.1.groovy 3. ...

  3. spock测试框架使用指北

    文章目录 一.Spock是什么 二.Spock,Junit,Jmock以及PowerMock区别 三.Spock项目引用配置 1. POM版本依赖 2. 新建测试用例 3. 执行单元测试 四.Spoc ...

  4. spock_将Spock 1.3测试迁移到Spock 2.0

    spock 了解Spock 2.0 M1(基于JUnit 5)的期望,如何在Gradle和Maven中迁移到它以及为什么报告发现的问题很重要:). 重要说明. 我绝对不建议您永久将您的真实项目迁移到S ...

  5. 在Spring Boot项目中使用Spock框架

    转载:https://www.jianshu.com/p/f1e354d382cd Spock框架是基于Groovy语言的测试框架,Groovy与Java具备良好的互操作性,因此可以在Spring B ...

  6. junit 运行_运行,JUnit! 跑!!!

    junit 运行 JUnit与JavaScript和SVN一起是程序员经常开始使用的一些技术,甚至没有读过一篇博客文章,更不用说一本书了. 也许这是一件好事,因为它们看起来足够简单并且易于理解,因此我 ...

  7. 运行,JUnit! 跑!!!

    JUnit与JavaScript和SVN一起是程序员经常开始使用的一些技术,甚至没有读过一篇博客文章,更不用说一本书了. 也许这是一件好事,因为它们看起来足够简单且易于理解,因此我们无需任何手册即可立 ...

  8. SpringBoot+Spock的熟悉之路(二):Spock,Mock和Mockitio的关系

    Spock,Mock和Mockitio的关系 前言 环境 依赖 Spock和Mockito Mockito的简述 Mock,Stub和Spy 数据准备 Mock Stub Spy Spock中的Moc ...

  9. BDD测试框架Spock概要

    前言 为了找到一个适合自己的.更具操作性的.以DDD为核心的开发方法,我最近一直在摸索如何揉合BDD与DDD.围绕这个目标,我找到了Impact Mapping → Cucumber → Spock ...

最新文章

  1. 获得客户端的时区(get client-side time zone by JS)
  2. arouter跨module传递消息_利用ARouter实现组件间通信,解决子模块调用主模块问题...
  3. python3将字符串unicode转换为中文
  4. 驱动备份工具哪个好_大庆seo排名优化推广公司工具哪个好
  5. php 取消页面一些样式,jquery如何去除样式
  6. jQuery事件绑定函数:on()与bind()的差别
  7. python学习笔记(十二)之函数
  8. Web页面的生命周期函数
  9. 2022年软考高级网络规划设计师备考指南
  10. 通过bower 下载管理angularjs
  11. 树梅派应用25:宅男必备:配备电子纸屏幕的抽纸盒
  12. 【kong系列九】之限流rate-limiting插件
  13. Redis容灾备份的方法
  14. 关于25岁学编程会不会晚的最佳回答!
  15. 联想笔记本:安装适配自己电脑的驱动
  16. Qgis教程13:照片上图 ImportPhotos
  17. 并行调用框架封装实战-completionService
  18. Debian - 搭建NextCloud私人云盘
  19. 使用Python对FPS游戏读写操作
  20. Windows10登录不上Micrsoft账户,解决办法

热门文章

  1. Vb自动读取本地HTML,VB获取网页源代码的五种方法
  2. 【Java】leetCode 21 合并两个有序链表
  3. C语言易错图形题--打印n行n列的空心正方形图案
  4. HDU2925(约瑟夫环问题)
  5. 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)
  6. codeforce708C:树形dp+二次扫描
  7. 使用vtwinfx插件时fcpx意外退出_FCPX插件:60种电视屏幕切换转场 TRANSTELE
  8. java基础 多维数组_java基础:3.2 多维数组
  9. 向上累积频数怎么算_天天向上:王一博单人cut只有7分钟,给了高天鹤最后的疼爱...
  10. 0x43.数据结构进阶 - 线段树