基于 Python 中输入的模拟返回值
本文将介绍如何在 Python 中创建一个根据输入返回不同值的模拟函数。 我们还将向您展示如何测试我们的模拟函数。
最后,我们将向您展示一些更高级的模拟函数的技术。 您无需了解编程或测试即可跟进。
基于 Python 中输入的模拟返回值
Python 是一种非常强大的语言,拥有丰富的测试工具生态系统。 它具有许多使其非常适合单元测试的特性。
一个流行的工具是 mock 模块,它允许我们用模拟对象替换我们系统的某些部分,并断言它们是如何使用的。
模拟函数允许我们用我们的代码替换函数的功能。 当我们想要在函数不可用时测试代码的行为时,或者当我们想要测试代码对不同输入的反应时,这会很有用。
模拟在 Python 中的使用
模拟是一种强大的技术,可用于提高我们测试的可靠性和效率。 本文将教我们如何在 Python 测试中使用模拟对象。
-
Mocking 允许我们用模拟版本替换真实对象。 当我们想要测试依赖于另一个尚不可用的组件的组件时,这会很有用。
例如,我们可能希望在不实际连接到数据库的情况下测试数据库连接。
- 模拟也可以用来消除外部依赖。 当我们想避免在测试期间进行网络调用或与数据库交互时,这会很有用。
-
模拟可以用来提高我们测试的效率。 当我们模拟一个对象时,我们可以避免实例化真实对象的开销。
这在测试实例化许多对象的代码时特别有用。
- 模拟也可以用来使我们的测试更可靠。 剔除外部依赖项可以避免依赖网络或数据库可用性的不稳定测试。
在 Python 中使用模拟对象
要在我们的测试中使用模拟对象,我们首先需要创建一个 Mock 类。 此类可用于创建看起来和行为都像真实事物的模拟对象。
一旦我们有了 Mock 类,我们就可以实例化模拟对象并在我们的测试中使用它们。 模拟对象与它们所替换的真实对象具有相同的方法,因此我们可以像使用真实对象一样使用它们。
当我们完成使用模拟对象时,我们可以断言它被正确使用。 例如,我们可以断言模拟数据库连接用于执行查询。
因此,模拟是一种强大的工具,可用于提高 Python 测试的可靠性和效率。
通过用模拟对象替换真实对象,我们可以避免实例化真实对象的开销。 我们还可以消除外部依赖性,使我们的测试更加可靠。
Python 中模拟的意义
嘲笑这个词在多种情况下使用; 但是,本文档通篇将使用以下定义:
对模拟函数的调用会提供一个瞬时值,该值是在没有实际工作的情况下预设的。 假对象的特征和方法完全在测试内部以相同的方式定义,无需首先生成实际对象或进行任何其他工作。
谈到测试,编写测试的人可以定义函数调用的返回值这一事实赋予了他们巨大的力量。 然而,这也意味着编写测试的人需要做一些基础工作才能准确设置所有内容。
Python 中的 unittest.mock 模块负责编程语言中的模拟。 作为装饰器和上下文管理器的 patch 函数和 MagicMock 类是该模块中两个必不可少的类和函数。
它还包括其他几个有用的类和方法。 模拟 Python 所涉及的大部分工作都可以通过使用这两个健壮的组件来完成。
编写一个根据输入返回不同值的模拟
现在我们已经很清楚 mock 及其功能了。 让我们通过编码示例更好地理解 mock。
要创建该函数,我们将使用 *args
和 **kwargs
,因为这些参数采用简单参数和关键字参数。 因此,我们可以传递任何数据类型:字符串、整数、浮点数和布尔值,我们也可以为关键字参数赋值。
- 创建一个函数。
-
传递参数
*args
和关键字参数**kwargs
-
返回具有
*args
和**kwargs
的元组 - 调用函数
- 打印结果
查看下面的代码以获得更好的理解。
def mock_function(*args, **kwargs):
return (args, kwargs)
mock_function('x', 'y')
(('x', 'y'), {})
mock_function('x', y=2, z='mock test')
输出:
(('x',), {'y': 2, 'z': 'mock test'})
在代码输出中,我们可以看到首先打印的是 *args
值,即 x,然后是 **kwargs value {'y': 2, 'z': 'mock test'})
。
基于输入返回的 Python Mock
现在我们将创建一个 mock 来返回我们之前讨论过的函数。
- 要创建模拟函数,我们将首先从 unittest.mock 模块导入 MagicMock。
- 创建一个变量并使用 unittest.mock 中的 MagicMock。
- 打印结果。
示例代码:
from unittest.mock import MagicMock
my_mock_1 = MagicMock(name='abid', return_value=mock_function)
my_mock_1
输出:
<MagicMock name='abid' id='139916486559696'>
代码输出显示使用了 MagicMock 命令。 并且我们可以看到我们在代码中使用的名字abid和代码生成的一个id号。
现在我们将创建另一个变量来查看我们的变量 my_mock_1 在哪里。
示例代码:
func_from_mock2 = my_mock_1()
func_from_mock2
输出:
<function __main__.mock_function(*args, **kwargs)>
代码输出显示该函数带有参数 *args 和关键字参数 **kwargs。
现在我们将给变量 func_from_mock2 一些值。 所以我们将传递 10, 10 并打印它。
示例代码:
func_from_mock2(10,10)
输出:
((10, 10), {})
输出 ((10, 10)) 表示我们使用了参数 *args
,{} 表示我们可以使用关键字参数 **kwargs
。
现在我们将使用关键字参数 **kwargs
。
示例代码:
func_from_mock2(15, 18, param=50)
输出:
((15, 18), {'param': 50})
我们同时使用了参数 *args
和关键字参数 **kwargs
。 ((15, 18), 显示模拟输入的参数部分,{'param': 50})
显示模拟输入的关键字参数部分。
因此,这就是 Mock 基于输入返回不同值的方式。
我们希望您发现这篇 Python 文章有助于理解如何在 Python 中使用 Mock。
相关文章
Python 模拟导入
发布时间:2023/06/16 浏览次数:129 分类:Python
-
在这篇 Python 文章中,我们将研究 mock 库并学习如何有效地使用它。 我们将从简单的示例开始,然后查看更高级的用法。Python 模拟导入 我们将学习模拟对象和模拟的用途和陷阱。
在 Python 中计算和显示凸包
发布时间:2023/06/16 浏览次数:142 分类:Python
-
因此,凸包是指围绕凸物体形状的边界。 本教程将教您在 Python 中计算和显示一组随机点的凸包。在 Python 中计算并显示一个凸包
Python 密码哈希
发布时间:2023/06/16 浏览次数:90 分类:Python
-
我们将了解密码散列以及如何使用名为 bcrypt 的第三方库加密 salt 和 hash 密码。 我们还研究了 Python 中 hashlib 库中的不同哈希算法。Python 中使用 bcrypt 库的 Salt 和 Hash 密码
Python 中的 Collatz 序列
发布时间:2023/06/16 浏览次数:180 分类:Python
-
Collatz数列是一种以1结尾的数字序列。据说当一个数字经过一组特定的运算后,最后剩下的数字一定是1。本文将解释如何编写程序,在 Python 中找到任何给定数字的 collatz 序列。Collatz 序列背后
Python 中的最长递增子序列
发布时间:2023/06/16 浏览次数:90 分类:Python
-
我们将学习什么是子序列以及如何使用 Python 中的 n 平方方法和二分搜索方法计算数组中最长的递增子序列。
使用 Python 将文件上传到 Google 云端硬盘
发布时间:2023/06/15 浏览次数:136 分类:Python
-
本文将介绍我们如何使用 Python 将文件上传到云盘,以 Google Drive 为例。 为此,我们将使用 Google Drive API。
Python 子进程捕获输出
发布时间:2023/06/15 浏览次数:136 分类:Python
-
本文的主要目的是演示如何在 Python 中捕获、存储和显示子进程的输出。Python 子进程捕获输出 Subprocess 是一个内置的 Python 模块,预装了 Python 安装文件。
Python 子进程在运行时读取标准输出
发布时间:2023/06/15 浏览次数:129 分类:Python
-
本文的主要目的是演示如何读取在 Python 中执行的子进程的标准输出。Python 子进程在运行时读取标准输出 与许多其他内置模块一样,Subprocess 也是一个内置模块,预装了“正常”Python 安装。
使用 Python 获取 CPU 数量
发布时间:2023/06/15 浏览次数:173 分类:Python
-
CPU 可以包含单核或多核。 单核只处理一个进程,而多核同时处理多个进程。本篇文章将介绍使用 Python 程序查找 CPU 内核总数的不同方法。使用 multiprocessing 模块获取 Python 中的 CPU 数量