Python 简明教程

Python - Mocking and Stubbing

Python mocking and stubbing 是单元测试中的重要技术,它通过用受控的替代品替换真实对象或方法来帮助隔离被测功能。在本章中,我们将详细了解 Mocking 和 Stubbing:

Python Mocking

Mocking 是一种测试技术,其中创建模拟对象来模拟真实对象的 behavior。

在测试与复杂、不可预测或缓慢组件(如数据库、Web 服务或硬件设备)交互的代码段时,这非常有用。

模拟的主要目的是隔离被测代码,并确保对其 behavior 的评估独立于其依赖项。

Key Characteristics of Mocking

以下是 Python 中模拟的关键特征:

  1. Behavior Simulation: 可以对模拟对象进行编程,以返回特定值、引发异常或模仿真实对象在各种条件下的 behavior。

  2. Interaction Verification: 模拟可以通过允许测试人员验证是否使用预期参数调用特定方法,从而记录它们的使用方式。

  3. *测试隔离:*通过用模拟替换真实对象,测试可以关注被测代码的逻辑,而不必担心外部依赖项的复杂性或可用性。

Example of Python Mocking

以下是对 database.get_user 方法的示例,该方法被模拟为返回预定义的用户词典。然后,测试可以验证是否使用正确的参数调用了该方法:

from unittest.mock import Mock

# Create a mock object
database = Mock()

# Simulate a method call
database.get_user.return_value = {"name": "Prasad", "age": 30}

# Use the mock object
user = database.get_user("prasad_id")
print(user)

# Verify the interaction
database.get_user.assert_called_with("prasad_id")

Output

{'name': 'Prasad', 'age': 30}

Python Stubbing

Stubbing 是一种相关的测试技术,其中某些 methodsfunctions 被替换为返回固定预定响应的“存根”。

存根比模拟简单,因为它通常不涉及记录或验证交互。相反,存根专注于通过确保一致且可重复的结果来向测试中的代码提供受控输入。

Key Characteristics of Stubbing

以下是在 python 中存根的关键特征 −

  1. Fixed Responses: 不管如何调用存根,它们都会返回具体的、预定义的值或响应。

  2. Simplified Dependencies: 通过用存根替换复杂的方法,测试可以避免建立或管理复杂的依赖项。

  3. Focus on Inputs: 存根强调向测试中的代码提供已知输入,让测试人员可以专注于被测代码的逻辑和输出。

Example of Python Stubbing

以下是 get_user_from_db 函数的示例,该函数被存根来始终返回预定义的用户词典。测试不必与真正的数据库交互,以简化设置和确保结果一致 −

from unittest.mock import patch

# Define the function to be stubbed
def get_user_from_db(user_id):
   # Simulate a complex database operation
   pass

# Test the function with a stub
with patch('__main__.get_user_from_db', return_value={"name": "Prasad", "age": 25}):
   user = get_user_from_db("prasad_id")
   print(user)

Output

{'name': 'Prasad', 'age': 25}

Python Mocking Vs. Stubbing

模拟和存根的关键特性、目的和用例的比较明确说明了在何时使用每种方法。通过探索这些区别,开发者可以创建更有效和可维护的测试,最终构建更高质量的软件。

下表根据不同的条件展示了模拟和存根之间的主要区别 −