前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Python中Mock和Patch的区别

Python中Mock和Patch的区别

原创
作者头像
Python学习者
发布2023-10-07 16:29:31
发布2023-10-07 16:29:31
40700
代码可运行
举报
文章被收录于专栏:Python学习者Python学习者
运行总次数:0
代码可运行

在测试并行开发(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() 的装饰器,它负责在测试的上下文中修补类和模块级别的特性,并提供了一个用于产生唯一实例的哨兵。

示例代码:

代码语言:python
代码运行次数:0
复制
from unittest.mock import patch
@patch('sample_module.sample_object')
def test_function(mock_object):
    print(mock_object)

输出:

代码语言:python
代码运行次数:0
复制
<MagicMock name='sample_object' id='1870192341512'>

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

代码语言:python
代码运行次数:0
复制
def test_function():
    with patch('sample_module.sample_module') as mock_object:
        print(mock_object)

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

结论

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

  • 为了方便地用mock 对象(或其他对象)来替代对象,并在完成后恢复之前的状态,或者在出现异常的情况下,使用patch 装饰器/上下文管理器函数。
  • mock.patch 创建mock 或衍生对象,我们可以手工制作。手动构建的只用于修复本地函数或其他不需要重置的模拟。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Mock 和Patch 对象库的用途和区别
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档