迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 中的 Mock 和 Patch 之间的区别

作者:迹忆客 最近更新:2023/06/28 浏览次数:

代码开发首先是测试并行开发(TPD)。 尽管如此,我们还是编写了开发的测试并执行它们来验证代码的准确性(而不是直接运行代码或使用控制台)。

在 Python 中,我们有一个称为单元测试的过程,其中包含模拟和补丁函数。 本文将讨论这两个角色的用途和区别。


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

在本文中,我们不会从整体上解决单元测试,而是更多地关注模拟和补丁功能。

我们使用模拟 Python 包将被测系统的特定组件替换为模拟对象,并对其使用情况进行断言。 它是 Python 标准库的一个组件,从 Python 3.3 开始可以作为 unittest.mock 进行访问。

unittest.mock 类消除了整个测试套件中多个存根的需要。 执行特定操作后,我们可以设置有关我们使用的方法/属性和我们调用它们的参数的断言。

它允许我们指定返回值并选择所需的功能。

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

模拟基于 action -> assertion(即,首先使用模拟,然后对其收到的调用进行断言)模式,而不是许多模拟框架使用的 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)

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


总结

我们可以注意以下几点来帮助我们做出决策:

  1. 为了方便地用模拟对象(或其他对象)替换对象并在完成后恢复之前的状态,或者在出现异常的情况下,使用补丁装饰器/上下文管理器功能。
  2. mock.patch 创建模拟或派生对象,我们可以手动生成它们。 手动构建仅用于修复本地函数或其他不需要重置的模拟。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Pandas read_csv()函数

发布时间:2024/04/24 浏览次数:254 分类:Python

Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。

Pandas 追加数据到 CSV 中

发布时间:2024/04/24 浏览次数:352 分类:Python

本教程演示了如何在追加模式下使用 to_csv()向现有的 CSV 文件添加数据。

Pandas 多列合并

发布时间:2024/04/24 浏览次数:628 分类:Python

本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。

Pandas loc vs iloc

发布时间:2024/04/24 浏览次数:837 分类:Python

本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便