Python中Mock和Patch的区别

Python给依赖包打补丁 需要注意使用patch代码后,后续任何代码在调用到被打补丁的代码后行为都会改变,包括你使用的其他第三方函数调用该代码,因此可能会引入隐形bug,导致很难排查。当我们使用外部包的时候,有可能会发现源码效率不高或者有bug等问题,我们想要用自己的代码替换掉包中的部分代码。 阅读详情

在测试并行开发(TPD)中,代码开发是第一位的。尽管如此,我们还是要写出开发的测试,并执行它们来验证代码的准确性(而不是直接运行代码或使用控制台)。

在Python中,我们有一个叫做单元测试的过程,里面有mock 和patch 函数。这篇文章将讨论这两个角色的用途和区别。

Mock 和Patch 对象库的用途和区别

在这篇文章中,我们不会把单元测试作为一个整体来处理,而是更多地关注于mock 和patch 函数。

我们使用mock Python包,用mock 对象替换你的被测系统的特定组件,并对它们的使用进行断言。它是Python标准库的一个组成部分,从Python 3.3开始可以作为unittest.mock 。

unittest.mock 类消除了在整个测试套件中对几个存根的需要。在执行了一个特定的动作后,我们可以设置关于我们使用了哪些方法/属性以及我们调用它们的参数的断言。

它让我们指定返回值并选择需要的功能。

MagicDock可以处理Magic 对象,它是Mock 的子类。Mock 和MagicMock 对象在我们使用它们时自发地产生特性和方法,并记录使用信息。

嘲讽是基于action -> assertion (即先让mock 被使用,然后对它收到的调用进行断言)模式,而不是许多嘲讽框架使用的record -> replay 模式。此外,mock 模块提供了一个叫做patch() 的装饰器,它负责在测试的上下文中修补类和模块级别的特性,并提供了一个用于产生唯一实例的哨兵。

示例代码:

from unittest.mock import patch
@patch('sample_module.sample_object')
def test_function(mock_object):
    print(mock_object)

输出:

<MagicMock name='sample_object' id='1870192341512'>

上面的代码片段等同于下面的代码片段:

def test_function():
    with patch('sample_module.sample_module') as mock_object:
        print(mock_object)

该函数允许我们用mock 对象替换任何对象,以避免调用生产代码,并检查原始对象如何被调用(如果该对象是一个函数)。使用patch (或类似的方法)是首选,因为这可以确保补丁在测试后被还原(或在第二种情况下在上下文管理器范围后被还原),这样其他测试或程序就不会受到影响。

结论

我们可以注意到以下几点来帮助我们的决策:

  • 为了方便地用mock 对象(或其他对象)来替代对象,并在完成后恢复之前的状态,或者在出现异常的情况下,使用patch 装饰器/上下文管理器函数。
  • mock.patch 创建mock 或衍生对象,我们可以手工制作。手动构建的只用于修复本地函数或其他不需要重置的模拟。
python 彻底理解线程 Rlock是一个可以被同一个线程请求多次的同步指令.Rlock使用了"拥有的线程"和"递归等级"的概念,处于锁定状态时,Rlock被某个线程拥有.拥有Rlock的线程可以再次调用acquire(), 释放锁时需要调用release()相同次数.可以认为RLock包含一个锁定池和一个初始值为0的计数器,每次成功调用 acquire()/release(),计数器将+1/-1,为0。很多时候,线程之间会有互相通信的需要.常见的情形是次要线程为主要线程执行特地的任务,在执行过程中需要不断报告执行的进度情况. 阅读详情

相关推荐

Python的单元测试unittest中的Mock使用小结

前面一篇博文简单说了使用unittest.mock对无返回值的函数做单元测试。这里是更多一些例子的总结。 被测函数中使用到了input需要自动化输入 #!/usr/bin/env python3 from unittest import TestCase from unittest.mock import patch from unittest import main def fu...

python012的专栏 5155

python中patch的使用

1、由于python是一切皆对象,当我们import一个module时,python会做以下几个事情:     导入一个module     将module对象加入到sys.modules中,后续对该module的导入将直接从该dict中获得     将module对象加入到golbal dict中 因此当我们引入一个模块时,会从global中查找,如果需要替换原有模块,需

lck5602的专栏 1万+

【测试】Unittest

python自带的单元测试框架,也可以做自动化测试组织多个用例去执行丰富断言方法可生成测试报告核心要素为下方5个标题。

你的每一个关注每一次观看都会支持我越来越好,关注能加快我的更新速度~ 560

python模块06 mock-2高级用法patch

Mock高级用法 patch是Mock库提供的一种函数装饰器,可以创建模拟并将i传递给装饰函数 使用patch()需要明白2个主要的步骤: 确定使用的目标对象 什么方式使用patch() python 提供3种方式进行使用patch() 装饰器修饰函数或类方法 Context manager Manual start/stop

噗噗bug博客 792

python-patch:解析和应用统一差异的库

用于解析和应用统一差异的库。 特征 兼容Python 2和3 自动更正 根据修补文件换行 被剥离尾随空格打破的差异 a /和b /前缀 单个文件,它是命令行工具和库 Python stdlib外没有依赖项 补丁格式检测(SVN,HG,GIT) 好的diffstat直方图 Linux / Windows / OS X 测试范围 开箱即用的东西: 文件重命名,创建和删除 目录树操作 版本控制的特定属性 非统一的差异格式 用法 下载patch.py并使用Python运行它。 它是一个独立的模块,没有外部依赖性。 patch.py diff.patch 您也可以运行.zip文件。 python patch-1.16.zip diff.patch 安装 patch.py是自给自足的。 您可以将其复制到您的存储库中,然后从此处使用它。 此设置将始终是可重复的。 但是,如果您需要添加pa

【RK3588开发记录】超详细的RK3588修改debug串口波特率为115200

修改RK3588的debug串口为115200

Crazydrams的博客 4806

python mock patch_关于mock.patch()和mock.patch.object()的区别的问题

查询了下,还是使用mock.patch()的时候,查找module的问题,修改了下,现在可以正常运行了。代码结构:py_unittest.pyperson(目录)__init__.pyperson.pyperson.py的代码class Person(object):def __init__(self, name):self.name = namedef print_name(self):prin...

weixin_42396180的博客 1502

白盒测试逻辑覆盖之谓词覆盖、子句覆盖、三类有效字句覆盖等知识点

本篇笔记会简化书本上的概念,用容易理解的方式来说明,有些例子打字麻烦,我会直接放图片! 目录 基础知识: 谓词覆盖predicate coverage 子句覆盖 clause coverage 组合覆盖 combinatorial coverage 有效字句覆盖Active Clause Coverage 广义有效子句覆盖(General Active Clause Coverage) 相关性有效子句覆盖(Correlated Active Clause Coverage) 限制性有效

weixin_46019681的博客 2665

Python的mock把我坑惨了,原来Mock和patch的区别这么大

这是。

这家伙很懒,什么都没有留下 100

软件自动化测试脚本如何编写,编写自动化测试脚本的几点注意事项

我们需要自动化测试脚本的原因:1、验收测试是一项非常复杂和费力的被用来确保软件质量的环节。它的目的就是使软件能得到充分运行并且能使其符合原始需求。2、测试的目的无非就是满足了两个结果:测试通过或测试不通过。为了能实现每个测试结果,必须要明确每个测试用例。并且对于整个系统而言在合同中必须定义测试用例的失败标准,而且这个失败标准数必须是可接受的。3、测试用例的通过条件必须有一个清晰的标准,标准可以被定...

weixin_39575775的博客 2251

支付域——“清算、结算、清结算”

本文深入探讨了支付系统中的清算和结算流程,包括核心流程、模块设计及特殊场景处理。文章详细阐述了交易收单、资金冻结、清分规则、清算批处理、结算出账等关键步骤,并讨论了交易失败、数据不一致、退款、汇率波动等异常情况的处理方法。

庄小焱 2564

Python Unit Testing

开始看Openstack中的单元测试,其中Mock用的比较多。记得在Openstack的某个wiki上看到建议用Mock,少用Mox。现在社区有patch逐步将mox替换为mock。Openstack单元测试中主要由两种形式(不准确哦): 1. @mock.patch(….) 2. @mock.patch.object(…)这篇文章对两者有说明。回头看看。Mock已经成为了Python 3.3标

qeelee的专栏 679

【WRF-GHG 教程上】完整教程(2024年更新版)

完整教程(2024年更新版)

WW、forever的博客 1436

Python单元测试打桩技术:unittest.mock模块实战指南

在软件测试领域,单元测试是确保代码质量的基础环节。其核心原理在于隔离被测代码单元,验证其内部逻辑的正确性。当代码依赖外部服务(如数据库、API接口)时,直接调用会产生速度慢、不稳定等问题,这时测试替身技术应运而生。通过模拟外部依赖的行为,测试替身技术能够提供可控的测试环境,其技术价值在于提升测试的稳定性、执行速度和可维护性。在Python开发中,这一技术广泛应用于Web应用、数据管道和微服务等场景。本文聚焦于Python标准库中的unittest.mock模块,深入解析Mock对象、patch装饰器等核心工

weixin_33911824的博客 380

【变化检测】变化检测相关数据集+代码+论文合集

光学影像变化检测领域数据集(有label的,无label的)、高光谱影像变化检测领域数据集、3D变化检测领域数据集、传统变化检测算法、深度学习变化检测算法、SAR变化检测算法、高光谱变化检测算法论文及代码等资源。

向上生长的程序媛的博客 2089

自抗扰控制(ADRC)理论与工程实践:8.2 模糊ADRC、神经网络ADRC等智能融合变体

智能融合ADRC变体概述 自抗扰控制(ADRC)与智能控制方法(如模糊逻辑、神经网络)的融合,旨在突破传统ADRC在非线性、时变系统中的应用局限。智能融合ADRC主要通过以下方式实现性能提升: 模糊ADRC 参数自整定:利用模糊推理在线调节ADRC带宽参数,实现自适应控制。 非线性反馈:用模糊控制器替代线性PD,灵活设计非线性控制策略。 优势:融入专家经验,无需精确模型;局限:依赖规则库设计,稳定性分析困难。 神经网络ADRC 增强ESO:用神经网络学习扰动动态,提高估计精度。

技术工作者 228

unittest.mock 实战指南:用依赖隔离打造稳定可控的 Python 测试

单元测试是软件质量保障的基石,而测试不稳定的根源往往不在业务逻辑,而在无法控制的外部依赖——网络请求、数据库、时间、随机值等不确定因素会悄悄摧毁测试的可信度。要解决这个问题,核心思路是隔离:让被测代码与外部世界解耦,使每次测试都可重复、可验证。Python 标准库自带的 unittest.mock 提供了强大的模拟能力,通过 Mock、MagicMock 与 patch 机制,开发者可以精准替换外部依赖,控制返回值与异常行为,并校验调用参数。合理运用这些技术,不仅能让测试速度大幅提升,还能在重构和持续集成中

weixin_28839549的博客 223

PNETLab 镜像包官方下载太慢?不急,最新版本PNET_4.2.10分享!

你好,这里是网络技术联盟站,我是瑞哥。PNETLab是一个强大的网络仿真工具平台,全称Packet Network Emulator Tool Lab。它不仅允许用户进行深入的网络实验,还支持社区成员之间的实验室共享。PNETLab致力于为学习者、教师以及网络工程师提供一个全面的实验环境,以便于他们能够在实际部署前测试和验证网络配置和协议。和。这两个部分相辅相成,共同构成了一个全面且灵活的网络仿真生态系统。

网络技术联盟站 4481

Python单元测试中Mock的正确使用路径解析

在Python单元测试中,Mock技术是隔离外部依赖的核心手段,其本质是通过替换目标对象来实现测试隔离。理解import机制是正确使用Mock的关键——Python的import会创建新的引用而非原始对象的别名,这导致常见的'patch定义点无效'问题。从工程实践角度看,Mock的价值在于实现可重复、稳定的单元测试,特别是在涉及网络请求、数据库访问等场景时。正确的做法是遵循'patch使用点而非定义点'原则,即修改被测试代码实际引用的对象路径。通过打印调试、网络隔离等验证方法可以确保Mock生效,而使用py

weixin_28840143的博客 280

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Python单元测试:用unittest.mock模拟外部函数与避坑指南

单元测试的目标是验证单个函数的逻辑正确性,但真实环境中的数据库访问、网络请求等外部函数往往会让测试变得缓慢且脆弱。为了隔离外部依赖,Python标准库提供的unittest.mock能够将目标函数替换为可控的Mock对象,从而精确设定返回值或抛出异常,同时支持调用断言,极大提升测试的速度与稳定性。从基础的patch路径选择、返回值与side_effect设置,到多个外部函数同时模拟时的装饰器顺序,以及常见假绿场景的排查,都有一套成熟实践可循。了解mock的适用边界,在需要模拟外部函数时合理运用,能让单元测试

weixin_42531923的博客 264

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

模拟与存根实战:unittest.mock深度使用指南

本文深度解析unittest.mock的核心技术与高级用法,涵盖Mock、MagicMock、AsyncMock等对象类型及其应用场景。重点介绍了四种patch方式、复杂场景模拟(如异常处理、上下文管理器和迭代器)、异步代码模拟技巧,以及调用验证与自定义匹配器方法。文章还提供了企业级模拟策略,包括模拟对象工厂模式、分层模拟策略和性能优化建议。通过5个Mermaid流程图展示了模拟对象生命周期、补丁机制等核心概念,帮助开发者解决测试隔离、依赖模拟和异步测试三大难题。附有官方文档资源和最佳实践总结,是提升测试代

七夜zippoe的博客 907

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python单元测试入门实战:从unittest机制到Mock与CI实践

软件测试是保障代码质量的关键,其中单元测试作为测试金字塔的基石,能够让开发者在修改功能后快速验证旧行为是否被破坏。Python标准库自带的unittest框架无需额外安装与配置,即可实现自动化测试,通过断言机制直观地校验函数逻辑。理解其测试发现规则、fixture执行顺序以及mock外部依赖的原理,能帮助开发者在无网络、无数据库等隔离环境下稳定运行测试,并结合覆盖率报告精准定位未覆盖的业务分支。在日常Web开发、爬虫与数据处理项目中,将测试接入持续集成(CI)流程,可让每次提交都自动回归,大幅降低线上故障风

weixin_30082367的博客 314

Python unittest单元测试核心实践:断言、Mock与用例组织

在Python工程迭代中,单元测试是保障代码质量的关键防线。unittest作为标准库内置测试框架,基于xUnit体系提供了从用例组织、断言校验到外部依赖隔离的完整能力。通过TestCase和test_开头方法定义测试用例,使用assertEqual、assertRaises等断言方法精确验证逻辑,结合setUp/tearDown夹具管理生命周期,并借助mock.patch隔离网络与数据库依赖,使测试在可控环境中稳定运行。掌握unittest不仅能解决手动print验证带来的漏检问题,还能通过discove

weixin_42523326的博客 257

Python unittest.mock深度解析:从Mock到patch的完整实战指南

在单元测试中,如何隔离外部依赖是关键问题。模拟(mock)与存根(stub)作为测试替身,能让代码在不受网络、数据库等环境制约下稳定运行。Python标准库中的unittest.mock不仅提供了Mock和MagicMock对象,还通过patch、patch.object等机制实现精准的依赖替换。理解其底层原理,如动态属性创建、return_value与side_effect的分工,有助于写出可靠的测试。autospec和AsyncMock进一步强化了对签名校验与异步代码的支持。掌握这些技术,不仅能提升测试

weixin_33766805的博客 188
上一篇: Python创建Getter和Setter
下一篇: Python中匹配模糊的字符串
Python热爱者
博客等级 码龄7年 3056粉丝 1330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值