Python 中的 Mock 和 Patch 之间的区别
代码开发首先是测试并行开发(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)
该函数允许我们用模拟对象替换任何对象,以避免调用生产代码并检查原始对象是如何调用的(如果该对象是函数)。 首选使用补丁(或类似的方法),因为这可以确保在测试之后(或在第二种情况下在上下文管理器范围之后)恢复补丁,以便其他测试或程序不受影响。
总结
我们可以注意以下几点来帮助我们做出决策:
- 为了方便地用模拟对象(或其他对象)替换对象并在完成后恢复之前的状态,或者在出现异常的情况下,使用补丁装饰器/上下文管理器功能。
- mock.patch 创建模拟或派生对象,我们可以手动生成它们。 手动构建仅用于修复本地函数或其他不需要重置的模拟。
相关文章
Pandas DataFrame DataFrame.shift() 函数
发布时间:2024/04/24 浏览次数:133 分类:Python
-
DataFrame.shift() 函数是将 DataFrame 的索引按指定的周期数进行移位。
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
Pandas read_csv()函数
发布时间:2024/04/24 浏览次数:254 分类:Python
-
Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。
Pandas 多列合并
发布时间:2024/04/24 浏览次数:628 分类:Python
-
本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。
Pandas loc vs iloc
发布时间:2024/04/24 浏览次数:837 分类:Python
-
本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串