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 创建模拟或派生对象,我们可以手动生成它们。 手动构建仅用于修复本地函数或其他不需要重置的模拟。
相关文章
在 Python 中使用 SciPy、NumPy 和 Pandas 存储数据
发布时间:2023/06/28 浏览次数:184 分类:Python
-
我们将了解为什么需要数据分箱以及哪种技术最适合哪种情况。Python 中的分箱 分箱是推断不同变量关系的最强大的分析技术之一。分箱是一种非参数且高度灵活的技术,其中变量被分类为不同
在 Python 中使用 Fsolve
发布时间:2023/06/28 浏览次数:65 分类:Python
-
本文将探讨如何使用 fsolve 在 Python 中求解。 我们还将探索它的使用场景和一些示例代码,以更好地理解如何以及何时使用它来达到某种结果。让我们首先了解 fsolve 是什么以及为什么使用它。
在 Python 中创建 Getter 和 Setter
发布时间:2023/06/28 浏览次数:172 分类:Python
-
这些行为在支持 OOP 的编程语言中很流行,Python 也支持它。 本文将讨论如何在 Python 中创建 getter 和 setter。Python 中的 Getter 和 Setter
从 Java 代码调用 Python 脚本
发布时间:2023/06/28 浏览次数:93 分类:Python
-
本篇文章介绍了从 Java 代码调用 Python 脚本的三种不同方法。从 Java 代码调用 Python 脚本 有时,我们必须从Java代码中调用Python脚本来满足项目需求。
Python 中的位掩码简介
发布时间:2023/06/27 浏览次数:125 分类:Python
-
本篇文章介绍了 Python 中的位掩码,并演示了如何使用按位运算符(例如 AND、OR、NOT 等)执行位掩码。Python 中的位掩码简介 位掩码是几乎所有编程语言的通用概念;
在 Ubuntu 中卸载 Python
发布时间:2023/06/27 浏览次数:158 分类:Python
-
本文演示如何从 Ubuntu 中删除或卸载 Python。检查你的系统中是否安装了Python 使用 Ctrl+Alt+T 打开终端。打开终端后,使用命令 python3 --version 检查您的系统是否安装了 python。
Python Teradata 连接
发布时间:2023/06/27 浏览次数:86 分类:Python
-
本文将讨论一些基本的正确准则,并在讨论连接方式之前了解 Teradata 模块的工作原理。Python 中的 Teradata 数据库 您可以使用 Python 和 Teradata 模块编写与 Teradata 数据库的强大交互脚本。
在 Python 中查找素因数
发布时间:2023/06/27 浏览次数:175 分类:Python
-
本篇文章将介绍如何在 Python 中执行素因数分解。质因数分解概述 在数学中,数字的因子是那些可以除以给定数字且余数为零的数字。
在 Python 中从 URL 中提取域
发布时间:2023/06/27 浏览次数:86 分类:Python
-
本文将通过实际例子来讲解Python的 urlparse() 函数从URL中解析并提取域名。 我们还将讨论提高解析 URL 和使用其不同组件的能力。使用 urlparse() 从 URL 中提取域