当前位置: 首页 > news >正文

【稳健之道】第二篇:Mock 的艺术 —— 隔离外部世界的“混沌”

专栏进度:02 / 03 (测试进阶专题)
单元测试的灵魂在于 “孤立”。
如果一个测试因为对方服务器挂了而失败,那这个测试就失去了意义。Mock(模拟)的本质,就是用一个“假对象”替换掉“真依赖”,让测试只关注你写的逻辑本身。

一、 核心概念:什么是 Patch?

在 Python 中,unittest.mock.patch 是最常用的工具。它像是一个临时的“偷梁换柱”魔术,在测试运行期间,强行改变某个模块或函数的指向。

场景:你要测试一个天气预报函数,它依赖于一个真实的 HTTP 请求。

weather.py

importrequestsdefget_weather_advice(city):# 这个请求是不可控的:可能超时,可能返回 404response=requests.get(f"https://api.weather.com/{city}")ifresponse.json()["weather"]=="Rain":return"记得带伞"return"天气不错"

test_weather.py

fromunittest.mockimportpatchfromweatherimportget_weather_advice@patch('weather.requests.get')deftest_get_weather_advice(mock_get):# 配置 Mock 对象的返回内容(伪造一个下雨的 JSON)mock_get.return_value.json.return_value={"weather":"Rain"}result=get_weather_advice("Shanghai")assertresult=="记得带伞"
# 还可以验证:requests.get 是否真的被调用了?参数对吗? mock_get.assert_called_once_with("https://api.weather.com/Shanghai")

二、 进阶技巧:Side Effect(副作用)

有时候,仅仅返回一个固定值是不够的。你需要 Mock 对象表现得更“真实”,比如第一次调用成功,第二次调用抛出异常。

deftest_api_retry_logic(mock_get):# 模拟第一次超时错误,第二次返回正常mock_get.side_effect=[TimeoutError("连接超时"),{"status":200}]# 这里可以编写并测试你的重试逻辑代码
...

三、 避坑指南:Patch 到底该 Patch 谁?

这是 Mock 中最经典的坑:“Patch 应该发生在对象被查找的地方,而不是被定义的地方。”

错误做法:如果你在 weather.py 中写了 from requests import get,然后你去 patch requests.get,测试会失效。因为 weather 模块已经持有了原始 get 函数的引用。

做法:始终 patch 你的业务代码中引用的那个路径,即 @patch(‘weather.requests’) 或 @patch(‘weather.get’)。

四、 为什么要克制使用 Mock?

Mock 虽好,但不能贪杯。

Mock 过度会导致测试虚假通过:你 mock 了一个返回值为 {“id”: 1},但真实 API 升级后返回的是 {“user_id”: 1},你的测试依然是绿的,但程序上线就崩了。

测试维护成本变高:当代码重构、变量名改变时,你得同步修改大量的字符串路径 patch。

建议:只对外部 API、数据库、文件系统、时间函数等“不可控因素”进行 Mock。

http://www.jsqmd.com/news/458200/

相关文章:

  • Python部署卡壳工业MES?Java+YOLOv11+Spring Boot 3.4完美对接PLC!
  • 搭了个AI快讯自动化系统,每天花15分钟看全球AI动态,竟遭Claude封号了
  • MetaNovas两轮融资,AI改写材料研发格局
  • 讲讲2026年学校制冷设备一站式采购批发,如何选择靠谱厂家 - 工业推荐榜
  • 一文吃透AI合规:算法备案、大模型备案、大模型登记!
  • 口碑好的中央空调厂家排名,浙江省有哪些值得选 - mypinpai
  • KIHU快狐|75寸落地全面屏广告机高清展示教学会议信息发布终端
  • 大数据基于Python的大模型岗位人才需求可视化分析
  • 什么是 Java 的 Timer?
  • 写给技术管理者的低代码手册系列文章(8)——第二部分:低代码的概念、价值与发展现状(第四章)
  • 别等着被优化:DevOps 工程师转型 AI 工程师,为什么反而更有优势?
  • 上海理查德米勒机芯异响、震动问题测评解析 - 时光修表匠
  • 2026年3月安徽四柱液压机/压力机/折弯机/液压机/冲床公司推荐:行业变局下的选型逻辑与头部企业解码 - 2026年企业推荐榜
  • 永磁同步电机 滑膜观测器参数识别Matlab/simulink仿真 包括转动惯量 阻尼系数 负...
  • 2026澳洲最好的证券公司求职笔试辅导在哪里:独家面经(必看) - Matthewmx
  • 成套电力接地线,一站式配齐施工检修更高效 - 非研科技
  • 政府创新采购数据库(2016-2024)
  • 2026陕西西安AI人工智能培训+视频剪辑培训哪家强?达内优创综合实力稳居第一(附数据分析/Java/云计算运维课程) - 深度智识库
  • 天虹提货券回收避坑指南:教你快速辨别正规平台 - 可可收
  • 直流变频冷干机工厂
  • HoRain云--二叉树遍历全解析:数据结构核心指南
  • 2026年热门的氨基酸洗面奶厂家推荐:氨基酸洗面奶实力工厂推荐 - 品牌宣传支持者
  • 苹果CMSV10 花心视频二开模板 视频网站源码可封装双端 APP-ym7K
  • 太强了!Python+Excel真的是神仙组合,值得你通宵看完!
  • 如何实现OpenClaw与飞书的更复杂交互,比如多轮对话或自定义命令
  • 邦定板评测排行 猎板高频混压技术领先
  • DHU复试 Day16
  • 上海徐汇区有哪些擅长老房翻新设计的
  • 解读2026年国外国际舞台灯光展会,企亮展览口碑如何 - 工业品网
  • 【CAM350】软件技巧---对比两份gerber 文件的差异(1)