关于单测技术选型,聊聊我的思考

news2025/1/18 19:08:22

对于单测来说,目前常用的单测框架有:

  • JUnit
  • Mockito
  • Spock
  • PowerMock
  • JMockit
  • TestableMock

其中 JUnit 不支持 Mock,因此基本不会只用 JUnit,而是结合其他有 Mock 功能的框架一起使用。从知名度及使用率来说,Mockito 和 Spock 使用较多,而 PowerMock、JMockit、TestableMock 使用较少。下面我们将主要对比 Mockito 和 Spock 两种框架的差异。

Mockito

Mockito 是 Java 单元测试中的 Mock 框架,一般都是与 JUnit 一起使用。Mockito 功能强大,几乎所有你能想到的功能都支持,并且由于发布时间较长,因此使用的人非常多。

  • 优点:功能强大、使用人数多、资料丰富。
  • 缺点:代码不够简洁、没有统一的单测结构、不支持静态方法和私有方法 Mock。

更多信息详见官网:Mockito framework site

Spock

Spock 是一个企业级的测试规范框架,可用来测试 Java 和 Groovy 应用。Spock 最大的特色是其简洁美观的语言规范。Spock 兼容绝大多数 IDE、编译工具和 CI 集成服务器。Spock 框架使用 Groovy 语言编写,而 Groovy 语言则是 Java 语言的超集,绝大多数 Java 语言语法在 Groovy 中都支持。

  • 优点:单测结构统一、代码简洁、异常测试及参数测试支持更好。
  • 缺点:学习成本略高、不支持静态方法和私有方法 Mock。

更多信息详见官网:Spock

Mockito vs Spock

在 Spock vs JUnit 5 - the ultimate feature comparison 中详细对比了 Mokito 与 Spock 的差异,他们在发展情况、学习曲线、工具支持等方面的比较如下图所示。

从上图可以看到,Mockito 框架在发展、学习曲线、工具支持、从 JUnit4 迁移几方面比较有优势。而 Spock 框架则在测试结构、异常测试、条件测试等方面比较有优势。因此,选择哪个测试框架完全基于实际情况。例如,如果你目前的情况是:

  1. Java 是唯一的语言。
  2. 想要更强的编译时错误检查。
  3. 更稳定、更主流的实现方式。

那么选择 JUnit + Mockito 的方式是更好的选择。但如果你目前的情况是:

  1. 希望单测跟简单易读
  2. 更简洁的参数测试与异常测试

那么选择 Spock 会是更好的选择。

为啥选择 Spock?

根据前面的分析,Mockito 的主要优势在于比较稳定、主流,缺点在于不够简洁易读。而 Spock 虽然使用人群没有 Mockito 那么多,但国内也有一些大厂在使用 Spock,例如美团等(可参考:Spock单元测试框架介绍以及在美团优选的实践)。

我们重视写单测,但是又不希望写单测花费太多时间,毕竟业务才是第一位的。因此,我们希望单测代码尽可能简洁、可维护。 基于这个原因,我们选择了 Spock 框架作为后端的单测框架解决方案。而 Spock 不支持 static 方法及 private 方法 Mock 的缺陷,则尝试通过整合 PowerMock 或 TestableMock 来解决。

可维护性更强

在极客时间《程序员的测试课》中,有一节关于讲了一个好的自动化测试长什么样?在这里面,作者提到一个好的单测应该由 准备、执行、断言、清理 4 个阶段组成。

对于 Mockito 而言,它并没有规定具体的代码规范,因此只能依靠注释来标注哪些代码是准备阶段的代码,哪些是执行阶段的代码,哪些是断言阶段的代码,如下代码所示。

class SimpleCalculatorTest {
    @Test
    void shouldAddTwoNumbers() {
        //given 准备
        Calculator calculator = new Calculator();
        //when 执行
        int result = calculator.add(1, 2);
        //then 断言
        assertEquals(3, result);
    }
}

对于 Spock 而言,其通过 given-when-then 的结构,强制要求编写者将不同阶段的代码放到不同的位置,从而增强了可读性。同样是用于测试计算器的加法函数的单测用例,使用 Spock 框架编写的单测如下代码所示。

class SimpleCalculatorSpec extends Specification {
    def "should add two numbers"() {
        given: "create a calculater instance"
            Calculator calculator = new Calculator()
        when: "get calculating result via the calculater"
            int result = calculator.add(1, 2)
        then: "assert the result is right"
            result == 3
    }
}

可以看到,通过 given-when-then 结构的划分,我们可以更加快速地弄清楚单测的内容,从而提高单测的可读性,使得单测更加容易维护。

代码更加简洁

对于 Mockito 与 Spock 而言,它们之间的一个很大的差别是:Spock 的代码更加简洁。这个特性可以让我们编写比 Mockito 更少的代码,从而实现同样的功能。例如在 Mockito 中,我们 Mock 某个接口实现时,通常需要写一长串的 give(...).return(...) 代码。而在进行断言的时候,也需要写比较长的 then(xx).should(xx).checkxx() 代码,如下图所示。

@Test
public void should_not_call_remote_service_if_found_in_cache() {
    //given
    given(cacheMock.getCachedOperator(CACHED_MOBILE_NUMBER)).willReturn(Optional.of(PLUS));
    //when
    service.checkOperator(CACHED_MOBILE_NUMBER);
    //then
    then(webserviceMock).should(never()).checkOperator(CACHED_MOBILE_NUMBER);
    verify(webserviceMock, never()).checkOperator(CACHED_MOBILE_NUMBER);  
}

但在 Spock 中的代码就相对比较简洁,如下所示代码实现了上述 Mockito 代码同样的功能。

def "should not hit remote service if found in cache"() {
    given:
        cacheMock.getCachedOperator(CACHED_MOBILE_NUMBER) >> Optional.of(PLUS)
    when:
        service.checkOperator(CACHED_MOBILE_NUMBER)
    then:
        0 * webserviceMock.checkOperator(CACHED_MOBILE_NUMBER)
}

可以看到,Spock 没有 given、willReturn 等关键词,而是取而用 >> 等符号来实现,这样代码更加简洁,阅读起来也更加明了。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【基于HBase和ElasticSearch构建大数据实时检索项目】

基于HBase和ElasticSearch构建大数据实时检索项目 一、项目说明二、环境搭建三、编写程序四、测试流程 一、项目说明 利用HBase存储海量数据,解决海量数据存储和实时更新查询的问题;利用ElasticSearch作为HBase索引,加快大数据集中实时查询数…

干就完了

(1) ENIAC诞生于1946年。但安达信在1954年就拿计算机给通用电气公司算薪,这算计算机最早在工商业界的应用。 其实算薪这个事吧,严格意义来说是人力服务的BPO,只不过为了让这个算薪BPO项目更高效率更高质量更低成本地完…

无人机巢的作用及应用领域解析

无人机巢作为无人机领域的创新设备,不仅可以实现无人机的自主充电和电池交换,还为无人机提供安全便捷的存放空间。为了帮助大家更好地了解无人机巢,本文将着重解析无人机巢的作用和应用领域。 一、无人机巢的作用 无人机巢作为无人机技术的重…

模型优化调参方法介绍(Python代码)

模型算法在机器学习和深度学习中都发挥着自己的作用,但往往训练出来的模型效果不佳或稳定性不强,就需要对模型进行调优。一般来说,会从以下几个角度来优化模型。 1.优化数据维度 在需要对原始需求进行理解、准确定义好坏样本的前提下&#…

MySQL第六七弹,自连接等复杂查询,索引部分知识

一、💛 自连接:自己和自己笛卡尔积(奇淫巧技,特殊场景很牛逼) SQL:编写条件都是列和列之间的比较,但是SQL无法进行,行与行之间的比较。 如:显示所有java比计算机原理高的…

中电金信杜啸争:逐“数”兴业,智胜未来

在数字化转型大潮中,数据要素市场未来如何发展?作为天然具有大量数据应用场景和需求的金融行业,能否逐“数”兴业,实现“换道超车”? 本期分享由中电金信商业分析事业部总经理,中电金信数据研发委员会主席…

Cpp8 — 二叉搜索树

二叉搜索树(搜索二叉树、二叉排序树) 二叉搜索树又称二叉排序树,它要么是一棵空树,要么是具有以下性质的二叉树: 1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 2.若它的右子树不为空&…

刷题笔记 day5

力扣 202 快乐数 首先来分析什么样的数是快乐数, 解题思路: 1)定义快慢指针 ; 2)快指针走两步,慢指针走一步 ;3)两个指针相遇时判断相遇的数值是否为1。 怎样处理 取各分位数的平…

ReentrantLock源码解析和AQS常见问题分析

ReentrantLock和AQS常见问题分析 一、前言 本文利用ReentrantLock作为阅读AQS的切入口,通过问答的方式让大家更好的去理解今天要掌握的点,也欢迎大家说说自己的答案。 二、本文大纲 脑图是个很好的辅助记忆工具,也能提高自己的逻辑思维能…

计算机中数据的表示

计算机数据表示 送入计算机的数字,字母,符号等信息必须转换成0、 1组合的数据形式才能被计算机识别。 能够进行算术运算得到明确数值概念的信息成为计算机数值数据,其余的信息成为非数值数据。 从计算机本质的角度而言啊,它所处理…

《零基础入门学习Python》第077讲:Tkinter 模块:标准对话框

Tkinter 为了提供了三种标准对话框模块,它们分别是: messageboxfiledialogcolorchooser 注:这三个模块原来是独立的,分别是 tkMessageBox、tkFileDialog 和 tkColorChooser,需要导入才能使用。在 Python3 之后&#…

http和https的区别?(网络通讯)

HTTP: 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种 网络协议 HTTPS: 是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。 两者区别: 1、HTTPS …

Vue3_02 创建Vue3.0工程

1.使用 vue-cli 创建 ## 查看 vue/cli 版本,确保 vue/cli 版本在4.5.0以上 vue -V 或 vue --version## 安装或升级你的 vue/cli npm install -g vue/cli## 创建 vue create vue_test## 启动 cd vue-test npm run serve 2.使用 vite 创建 什么是vite?——新一代…

Golang之路---03 面向对象——接口与多态

接口与多态 何为接口 在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为。接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定。   在 Go 语言中,…

24考研数据结构-二叉树的遍历

目录 5.3二叉树的遍历和线索二叉树数据结构:树的遍历前序遍历中序遍历后序遍历层次遍历遍历方法的选择结论 树的遍历应用5.3.1二叉树的遍历1. 先序遍历(根左右 NLR)2. 中序遍历(左根右 LNR)3. 后续遍历(左右…

基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程

基于JenkinsPythonUbuntuDocker的接口/UI自动化测试环境部署详细过程 1 Jenkins是什么?2 Jenkins目标是什么?3 什么是CI/CD?3.1 CI持续集成3.2 CD持续部署3.3 CD持续交付 4 Ubuntu环境4.1 环境需求4.2 实现思路 5 Ubuntu下安装Docker6 安装Jenkins6.1 拉…

电力巡检无人机助力迎峰度夏,保障夏季电力供应

夏季是电力需求量较高的时期,随着高温天气的来临,风扇、空调和冰箱等电器的使用量也大大增加,从而迎来夏季用电高峰期,电网用电负荷不断攀升。为了保障夏季电网供电稳定,供电公司会加强对电力设施设备的巡检&#xff0…

新抗原预测的计算工作流程

参考文献:Xie N, Shen G, Gao W, Huang Z, Huang C, Fu L. Neoantigens: promising targets for cancer therapy. Signal Transduct Target Ther. 2023 Jan 6;8(1):9. doi: 10.1038/s41392-022-01270-x. PMID: 36604431; PMCID: PMC9816309. 文章目录 *新抗原预测的…

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio快速构建React完成点餐H5页面还原

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio快速构建React完成点餐H5页面还原 一、前言二、Cloud Studio 简介1.Cloud Studio 是什么2.Cloud Studio 的优点 三、Cloud Studio 登录注册四、Cloud Studio 的初体验五、使用 Cloud Studio 开发一个简版的点餐系统1.安装 a…

开源元数据管理平台Datahub最新版本0.10.5——安装部署手册(附离线安装包)

大家好,我是独孤风。 开源元数据管理平台Datahub近期得到了飞速的发展。已经更新到了0.10.5的版本,来咨询我的小伙伴也越来越多,特别是安装过程有很多问题。本文经过和群里大伙伴的共同讨论,总结出安装部署Datahub最新版本的部署手…