• Python中Mock和Patch的区别


    前言:

    嗨喽~大家好呀,这里是魔王呐 ❤ ~!

    python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取

    在测试并行开发(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)
    
    • 1
    • 2
    • 3
    • 4

    输出:

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

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

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    def test_function():
        with patch('sample_module.sample_module') as mock_object:
            print(mock_object)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    该函数允许我们用mock 对象替换任何对象,以避免调用生产代码,并检查原始对象如何被调用(如果该对象是一个函数)。

    使用patch (或类似的方法)是首选,因为这可以确保补丁在测试后被还原(或在第二种情况下在上下文管理器范围后被还原),这样其他测试或程序就不会受到影响。

    结论

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

    1. 为了方便地用mock 对象(或其他对象)来替代对象,并在完成后恢复之前的状态,

      或者在出现异常的情况下,使用patch 装饰器/上下文管理器函数。

    2. mock.patch 创建mock 或衍生对象,我们可以手工制作。

      手动构建的只用于修复本地函数或其他不需要重置的模拟。

    尾语

    最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

    希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

    躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

    最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

  • 相关阅读:
    Vue界面跳转传递参数
    2023国家网安周 | 开源网安点亮多地,播撒安全意识之种
    7亿听众背后的在线音频掘金故事
    WPF调用webapi并展示数据(二):类库实体类的构建
    前端性能优化:利用防抖节流实现图片懒加载
    深入理解python类的实例变量和类变量
    BA-NeRF ICCV 2021
    Unity代码通过Package Manager导入包的方法
    21天学习挑战:经典算法---折半查找
    Linux项目自动化构建工具--make&Makefile
  • 原文地址:https://blog.csdn.net/python56123/article/details/132920930