Patch.object python

2024 年 8 月 29 日 | 阅读 3 分钟

引言: 在本文中,我们将讨论 patch.object Python。我们编写的软件大部分时间都直接与我们称为“脏”的服务进行交互。也就是说,这些服务对应用程序很重要,但它们的交互会产生预期的但不需要的副作用,即在自治测试执行的上下文中不受欢迎的服务。

例如,您正在构建一个社交应用程序,并希望测试一项新的 Facebook 发布功能,但您希望在每次运行测试套件时都避免实际发布到 Facebook。Python 的 `unittest` 库包含一个名为 `unittest.mock` 的子包(如果将其声明为依赖项,则为 `mock`)。这提供了一种强大而便捷的方式来模拟和隐藏这些不必要的副作用。

测试对于确保您的软件逻辑正确、可靠且在编写健壮代码时能够正常运行至关重要。然而,测试的有效性取决于测试演示这些标准的程度。障碍、复杂逻辑和不可预测的依赖关系使得编写有效的测试变得困难。Python mock 对象库 `unittest.mock` 使克服这些障碍成为可能。

什么是模拟或修补?

模拟对象在测试环境中替换并模仿真实对象。它是一种灵活而强大的工具,用于提高测试质量。

使用 Python mock 对象的一个目的是在测试期间操纵代码的行为。

例如,如果您的代码向外部服务发出 HTTP 请求,则测试的可预测性仅取决于该服务是否按预期运行。这些外部服务的行为的快速变化可能会导致测试套件出现间歇性故障。

因此,我们建议您在受控环境中测试代码。用模拟对象替换实际请求使您能够以可预测的方式模拟外部服务故障和成功响应。

测试代码库的某些区域可能很困难。这些区域包括难以执行的“except”块和“if”语句。Python mock 对象可以帮助您管理代码的执行路径,以到达这些区域并提高代码覆盖率。

什么是 `patch`?

`unittest.mock` 提供了一种强大的对象模拟机制,称为 `patch()`。它会在特定模块中查找一个对象,并用模拟对象替换该对象。`Patch()` 通常用作装饰器或上下文管理器,为模拟目标对象提供一个区域。

`patch()` 作为装饰器是如何使用的?

如果您想通过测试函数模拟对象,请将 `patch()` 用作函数装饰器。为了了解其工作原理,请重组 `my_calendar.py` 文件,将逻辑和检查放在单独的文件中。

示例: 现在,我们提供一个 `patch()` 函数用作装饰器的示例。下面给出了示例 -

这些函数现在都在它们自己的文件中,与测试分开。然后,在名为 `tests.py` 的文件中重新构建测试。到目前为止,我们已经将 `monkey` 对象修补到了对象所在的那个文件中。Monkey patching 在运行时用一个对象替换另一个对象。

`patch()` 函数如何用作上下文管理器?

有时,您可能希望将 `patch()` 用作上下文管理器而不是装饰器。选择上下文管理器的一些原因包括:

  1. 您只需要为部分测试范围模拟一个对象。
  2. 您已经使用了过多的装饰器或参数,这会损害测试的清晰度。

结论: 您已经学到了很多关于使用 `unittest.mock` 模拟对象的内容!

现在您可以:使用 mock 来模拟测试中的对象,学习使用数据,并自定义 mock 对象的返回值和 side effects,以了解对象的使用方式。

在您的代码库中查找 `patch()` 对象。

在使用 Python mock 对象时避免出现问题。

奠定了知识基础,以帮助编写更好的测试。Mock 对象提供了对代码的洞察,您可能无法在其他地方获得。

最后免责声明。请小心谨慎地使用 mock 对象!很容易使用 Python 的 mock 对象功能创建会降低测试价值的 mock。