单元测试 Mock不Mock?

张开发
2026/6/22 11:48:33 15 分钟阅读
单元测试 Mock不Mock?
前段时间我们团队就单元测试是否采用 Mock 进行了一番交流各有各的说法。本文就单元测试 Mock不Mock 给出我的观点欢迎各位同仁提出不同的意见共同探讨、相互交流。单元测试没必要?我见过好多不写单元测试的项目大多给出的原因都是“没必要”、“浪费时间”、“get 不到单测的作用”这样的项目要么是小规模要么就是头铁。本人之前也有相同的观点...单元测试在软件开发过程中还是非常重要的除了可以提高代码的质量在引入CI/CD 后的自动化测试环节可以起到快速部署、交付作用。难道每次上线都需要“点点点”测试这一点我想经历过的人都深有体会。Mock不Mock?那什么是Mock什么是Mock?简单来说Mock就是模拟目标代码的行为在实际测试过程中代替真实的调用目标。如下图这样做的意义何在Mock的意义何在?试想一下单元测试中如果出现以下几个问题应该怎么办涉及到的DB操作、网络调用等单元测试产生的数据属不属于垃圾数据会不会影响业务发布/部署生产环境的过程中错误地执行了单元测试引起生产问题怎么办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可以是任意类型。patch(...update, return_valuexxx) as mocked_update在验证返回值时通过下面的方式xxxx mocked_update.return_value self.assertEqual(xxxx, xxx)通过示例我们Mock了XXService.update行为实现了对XXService的隔离测试并确保了测试的可靠性和高效性。总结单元测试中使用Mock有以下几个好处隔离测试Mock 使得测试可以专注于测试的代码逻辑而不必关心外部不稳定因素。提高测试速度Mock 可以避免耗时的外部调用从而加快测试速度。提高测试的可靠性和稳定性通过Mock可以避免外部变化对测试结果的影响。最后下方这份完整的软件测试 视频教程已经整理上传完成需要的朋友们可以自行领取【保证100%免费】​​​软件测试面试文档我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。

更多文章