单元测试 Mock不Mock?

news2024/11/15 9:59:10

文章目录

  • 前言
  • 单元测试没必要?
  • Mock不Mock?
    • 什么是Mock?
    • Mock的意义何在?
  • 如何Mock?
    • 应该Mock什么?
    • Mock 编写示例
  • 总结

前言

前段时间,我们团队就单元测试是否采用 Mock 进行了一番交流,各有各的说法。本文就单元测试 Mock不Mock 给出我的观点,欢迎各位同仁提出不同的意见,共同探讨、相互交流。

单元测试没必要?

我见过好多不写单元测试的项目,大多给出的原因都是:“没必要”、“浪费时间”、“get不到单测的作用”,这样的项目要么是小规模,要么就是头铁。

本人之前也有相同的观点…

单元测试在软件开发过程中还是非常重要的,除了可以提高代码的质量,在引入CI/CD后的自动化测试环节可以起到快速部署、交付作用。难道每次上线都需要“点点点”测试?这一点,我想经历过的人都深有体会。

Mock不Mock?

那什么是Mock?

什么是Mock?

简单来说,Mock就是模拟目标代码的行为,在实际测试过程中代替真实的调用目标。如下图

这样做的意义何在?

Mock的意义何在?

试想一下,单元测试中如果出现以下几个问题应该怎么办?

  1. 涉及到的DB操作、网络调用等单元测试产生的数据属不属于垃圾数据?会不会影响业务?
  2. 发布/部署生产环境的过程中,错误地执行了单元测试引起生产问题怎么办?
  3. CI过程中的测试环节花费时间太长怎么办?会不会影响集成交付?

以上几个问题我想大部分开发人员都经历过,那如何避免这些问题?我想Mock就是最好的一种方式。

如果将涉及到的外部操作,例如DB操作、网络调用等行为进行Mock,那就不会存在垃圾数据的问题,也不用担心环境切换带来的问题,外部耗时的操作也可以通过Mock避免CI过程过长。

个人认为Mock只是模拟调用外部的行为,并不影响代码逻辑。所以,不存在“Mock是不是有效的单元测试”这种说法。

如何Mock?

应该Mock什么?

通常,我们编写的方法(或函数)都是由很多方法按照层级组成的,就像这样

当我们对顶层方法进行单元测试时,应该Mock哪些方法?

  • 如果Mock方法1、2、3,那么方法4、5、6就不会被调用到,里面的逻辑不会被覆盖到,也就不是有效的单元测试。
  • 如果Mock方法4、5、6,里面的逻辑或返回值有修改,那么就要递归向上修改,不符合软件工程。

但是,如果方法43、、5、6都涉及到DB或者网络调用等外部不可控操作,我们就应该对其Mock。

所以,应该Mock一些稳定的、不可控的方法。

Mock 编写示例

以Python中的Mock框架为例,下面是一个示例:

class TestXxService(unittest.TestCase):
    def test_init(self):
        XXService.update(xx)

class XXService:
    def update(xx):
        ......

test_init函数中的....update会涉及到数据库的操作,这里使用patch模拟这两个函数的行为

# patch("目标函数路径")
patch('....update')

在模拟的上下文中,XXService.update将会被模拟的函数替代执行

    def test_init(self):
        with patch('....update') as mocked_update:
            # 在模拟的上下文中调用业务逻辑函数
            XXService.update(xx)
            mocked_update.assert_called_once_with(xx)

其中,assert_called_once_with 会验证模拟函数是否被调用了一次,并且会验证预期接收的参数是否匹配。

如果没有参数,使用assert_called_once进行验证是否被调用了一次。

如果模拟的函数实际被调用了多次,需要通过以下方式

# 断言mocked_update被调用了2次
self.assertEqual(mocked_update.call_count, 2)
# 断言mocked_update被调用了,并且参数正确
mocked_update.assert_any_call(xx)

如果函数有返回值,在定义模拟函数时,添加 return_value,return_value可以是任意类型。

patch('...update',
                    return_value='xxx') as mocked_update

在验证返回值时通过下面的方式

xxxx = mocked_update.return_value
self.assertEqual(xxxx, 'xxx')

通过示例,我们Mock了XXService.update行为,实现了对XXService的隔离测试,并确保了测试的可靠性和高效性。

总结

单元测试中使用Mock有以下几个好处:

  1. 隔离测试:Mock 使得测试可以专注于测试的代码逻辑,而不必关心外部不稳定因素。
  2. 提高测试速度:Mock 可以避免耗时的外部调用,从而加快测试速度。
  3. 提高测试的可靠性和稳定性:通过Mock,可以避免外部变化对测试结果的影响。

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

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

相关文章

11 Java 方法引用、异常处理、Java接口之函数式编程(接口知识补充Function<T,R>、BiFunction<T, U, R>和自定义泛型接口)

文章目录 前言一、Java接口之函数式编程 --- 接口知识补充1 Function<T,R>泛型接口2 BiFunction<T, U, R>泛型接口3 自定义泛型函数式编程接口4 使用lambda表达式、方法引用进行函数式编程 二、方法引用1 方法引用初体验&#xff08;以Array.sort()方法为例&#x…

当了中层才发现:领导根本不在意,你干了多少活

在职场的棋盘上&#xff0c;每个人都是一枚棋子&#xff0c;而中层领导则像是那些走在前线的骑士——既要冲锋陷阵&#xff0c;又要运筹帷幄。但你有没有想过&#xff0c;领导真的在意你加班到深夜&#xff0c;或是周末还在回复邮件吗&#xff1f; 当你从基层一步步爬到中层&a…

Unity(2022.3.41LTS) - UI详细介绍-Slider(滑动条)

目录 零.简介 一、基本功能与用途 二、组件介绍 零.简介 在 Unity 中&#xff0c;Slider&#xff08;滑动条&#xff09;是一个可以滑动的 UI 组件. 一、基本功能与用途 数值调节&#xff1a;主要功能是让用户在一个特定的数值范围内进行选择。例如&#xff0c;可以用于调…

深度学习之张量(Tensor)的创建、常见属性及数据转换

基本概念 PyTorch会将数据封装成张量&#xff08;Tensor&#xff09;进行计算&#xff0c;所谓张量就是元素为相同类型的多维矩阵。 张量是一个多维数组&#xff0c;通俗来说可以看作是扩展了标量、向量、矩阵的更高维度的数组。张量的维度决定了它的形状&#xff08;Shape&a…

同城搭子系统小程序开发产品分析

1. 市场调研与需求分析 目标用户定位&#xff1a;定义核心用户群&#xff0c;例如上班族、学生、旅游爱好者等。需求收集&#xff1a;运用问卷调查、用户访谈等方法收集用户对功能的具体需求&#xff0c;特别是对安全、便捷性和费用分摊的关注点。竞品分析&#xff1a;分析同类…

开心第一课:健康坐姿

文章目录 引言保持脊柱的自然伸展选择一把合适的座椅引言 建议坐位时间超过 30 分钟,就起身活动一下,促进血液循环,预防久坐带来的各种健康问题。 保持脊柱的自然伸展 正确的骨盆位置是使坐位时身体重量都作用在双侧的坐骨结节上,在结节的顶端有滑囊,滑囊分泌液体减少组…

由“为什么VO不能继承PO?” 引出的为什么组合优于继承?

简述VO、DTO、PO的概念。 如下概念是我个人的理解&#xff1a; VO&#xff08;View Object&#xff09;&#xff1a; 视图对象&#xff0c;用于展示&#xff0c;这很好理解&#xff0c;就是前端页面所需数据封装&#xff0c;一般所需要的属性比 PO 多并且。DTO&#xff08;Da…

二手电脑配置给你不一样的成就感之四

今天测了e3 1220 v1 没有想象中的好&#xff0c;鲁大师才评20多万分&#xff0c;比fm2平台6600k强一点点有限。 6600k fm2平台是20万出头。cpuz的评分还是比较高&#xff0c;实际使用效果比6600k稍好一些。 单盒能力确实比apu强一些。同样拿world frvr 测试&#xff0c;调到最低…

微分方程_by小崔说数

可降解的微分方程 不显含x&#xff1a;y两撇dp/dxdp/dy*dy/dx 不显含y&#xff1a;dp/dx 都是y撇等于p 自变量与因变量呼唤 讲解为一阶线性微风方程 &#xff0c;变成可分离得 公式得 高阶可降解得微分方程 通解非齐次特解齐次通解 非齐次特解&#xff1b;解得叠加原…

旗晟智能助推浙大海创人形机器人创新中心发展!

8月27日上午&#xff0c;余杭区成功举办机器人产业高质量发展大会。会上&#xff0c;由地方政府与浙江大学共同建设的人形机器人产业创新中心成立并揭牌。该中心目标明确&#xff0c;致力于打造机器人领域国内、国际的高等级创新高地。浙江大学校领导、院士专家、机器人企业代表…

js调试--本地替换

js调试--本地替换 一、本地替换的作用二、操作方法(以百度首页为例)1、选中目标资源地址二、替换为本地资源三、修改本地内容一、本地替换的作用 本地替换的作用就是将原本访问服务器的数据改成访问本地。 二、操作方法(以百度首页为例) 1、选中目标资源地址 以百度首页…

智能工厂MES实施规划

智能工厂MES&#xff08;制造执行系统&#xff09;实施规划是一个复杂而系统的过程&#xff0c;旨在通过数字化手段提升工厂的生产效率、降低成本并提高产品质量。以下是一个全面的智能工厂MES实施规划方案&#xff0c;涵盖主要步骤和关键点&#xff1a; 一、前期准备与需求分析…

手撸瀑布流

一、需求&#xff1f; 要求实现 一排两列 瀑布流样式&#xff0c;样式如下&#xff1a;其中A为容器&#xff0c;B为组件样式&#xff0c;卡片高度会因为标题的多少来自适应。 二、解法 1.使用CSS的column&#xff08;⚠️不推荐&#xff09; 使用CSS 属性 column 用来设置…

朋友们!pinterest视频保存教学给你们做出来啦

有没有在为pinterest视频无法下载而烦恼的小伙伴呀&#xff1f;我反正是被这个困扰好久了&#xff0c;每每看到喜欢的视频素材不能下载&#xff0c;真的很捉急&#xff01;最近发现了这款神器&#xff0c;就是之前给大家推荐【水印抹布】app可以完美解决pinterest视频保存的问题…

Vue2与Vue3区别以及兼容那些浏览器酌情使用

一、vue2与vue3区别 vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。 项目地址:https://gitcode.com/gh_mirrors/vu/vue 免费下载资源 1.根节点不同 vue2中必须要有根标签vue3中可以没…

pod进阶:

pod进阶&#xff1a; pod的生命周期当中的状态&#xff1a; 1、Running 运行中&#xff0c;pod已经分配到节点上&#xff0c;且pod内的容器正常运行。正常状态&#xff08;ready 1/1&#xff09; 2、complete 完成之后退出&#xff0c;容器内的返回码是0 echo $? 表示容器是…

基于Easy-Wav2lip-Gradio的AI数字人

数字人技术近年来在多个领域得到广泛应用,从虚拟主播到电影特效,都需要精确的音视频同步技术来实现逼真的效果。传统的嘴型同步技术往往面临着准确性不高、处理速度慢等问题。为了解决这些问题,原有的Wav2Lip项目应运而生。Wav2Lip通过人工智能技术,实现了音频和视频的高精…

从LED硬件控制流程认识Android架构!

0.Android架构图 一上来就是一张框架图&#xff0c;发明了框架图的天才真是个天才&#xff01; 简单点评一下&#xff1a; 1.对于安卓应用开发来说&#xff1a;App层以下都是操作系统&#xff0c;反正我只关心Android Studio&#xff08;其实是SDK&#xff09;给我什么包&…

字节-人工智能编辑代码方向面试-题目记录

问的都是自己简历里写的&#xff01;不会就不要写 简述一下几个排序算法 二分查找的时间复杂度&#xff08;是O&#xff08;log2n&#xff09;!!!&#xff09; find函数和count函数的时间复杂度都是O&#xff08;n&#xff09;&#xff0c;因为都是遍历整个数组来找的&#x…

Ubuntu Linux Server安装Kubernetes

本文主要描述在Ubuntu Linux Server操作系统中安装Kubernetes云原生对应的microk8s组件。 sudo snap install microk8s --classic 如上所示&#xff0c;在Ubuntu服务器中安装microk8s组件完成&#xff0c;对应的版本是microk8s v1.30版本 microk8s enable dashboard 如上所…