Python中的Patch.object
介绍: 在这篇文章中,我们讨论的是Patch.object python。大多数时候,我们编写的软件会直接与我们所说的 “脏 “服务进行交互。说白了,就是对应用程序很重要的服务,但其交互有预期的但不需要的副作用,也就是说,在自主测试执行的情况下,这些服务是不可取的。
例如,你正在构建一个社交应用,想测试一个新的 Facebook 发布功能,但你想避免每次运行测试套件时都向 Facebook 发布信息。unittest Python 库包含一个名为 unittest.mock 的子包 (如果你把它声明为依赖关系,就叫 mock)。这提供了一个强大而方便的方法来模拟和隐藏这些不需要的副作用。
在编写坚固的代码时,测试对于确保你的软件逻辑是正确的、可靠的和绿色的非常重要。然而,测试的费用取决于测试如何很好地证明这些标准。障碍、复杂的逻辑和不可预知的依赖性使得编写实用的测试变得很困难。Python模拟项目库unittest.mock能够克服这些障碍。
mocking或patching的方式是什么意思?
模拟对象在测试环境中取代并模仿真实对象。它是一个灵活而强大的设备,可以提高你的考试的精细程度。
使用Python模拟项目的一个目的是在整个检查过程中操纵你的代码的行为。
例如,如果你的代码请求一个外部载体的HTTP,测试将运行可预测的,但载体的行为是预测的数量。这些外部服务行为的快速调整也可能在你的测试套件中造成间歇性的灾难。
正因为如此,我们建议你在一个受控的环境中看一下你的代码。用模拟对象改变真实的请求有助于你以可预测的方式模拟外部提供者的灾难和成功的响应。
可能很难检查你的代码库的某些区域。这些区域包括难以执行的 “除了 “块和 “如果 “语句。Python模拟对象可以帮助你管理代码的执行路径,以达到这些区域并提高代码覆盖率。
patch是什么?
unittest.mock提供了一个强大的对象嘲弄机制,叫做patch()。这可以在一个特定的模块中寻找一个对象,并用一个模拟对象来替换该对象。Patch()通常作为一个装饰器或上下文管理器来使用,以提供一个区域来模拟目标对象。
patch()函数是如何作为检测器使用的?
如果你想通过你的测试函数来模拟一个对象,请使用 patch() 作为一个函数装饰器。要看这是如何工作的,重新组织my_calendar.py的报告,把逻辑和检查放在不同的文件中。
例子: 现在,我们举一个 patch() 函数作为检测器的例子。该例子如下—
import requests
from datetime import datetime
def is_weekday():
today = datetime.today()
return (0 <= today.weekday() < 5)
def get_holidays():
r = requests.get('http://localhost/api/holidays')
if r.status_code == 300:
return r.json()
return None
这些函数现在在他们的文件中,与测试分开。然后在一个叫做 tests.py 的文件中重建测试。到目前为止,我们已经在对象所在的文件中给猴子打了补丁。猴子的补丁在运行时用另一个对象替换了一个对象。
patch()函数是如何作为一个上下文管理器使用的?
有时,你会想使用 patch() 作为上下文管理器,而不是装饰器。你可能会选择上下文管理器的几个动机包括以下几点。
1.你只需要为测试范围的一部分模拟一个项目。
2.你已经使用了太多的装饰器或参数,这损害了你的测试的清晰性。
结论: 你已经学到了很多关于用unittest.mock模拟对象的知识
现在你可以:使用模拟对象对你的检查进行模拟,研究使用信息,并对模拟项目的返回值和方面的后果进行个性化处理,以了解小工具的使用情况。
在你的代码库过程中发现patch()对象
在使用Python模拟对象时,要远离麻烦。
创建了一个技术基础,以帮助编写更高的测试。Mocks提供了对你的代码的洞察力,而你在其他任何情况下都不可能得到。
最后一项免责声明。要小心谨慎地使用模拟对象!很容易使用Python的模拟对象功能来创建模拟,从而降低测试的价值。