一、单元测试与模拟的意义
在软件开发中,单元测试用于验证代码逻辑的正确性。但实际项目中,代码常依赖外部服务(如数据库、API、文件系统)。直接测试这些依赖会导致:
- 测试速度变慢
- 测试结果不可控
- 产生副作用(如真实发送邮件)
模拟(Mocking) 技术通过创建虚拟对象替代真实依赖,使测试聚焦于当前单元的逻辑。
二、环境安装
使用 pytest
和 pytest-mock
插件:
pip install pytest pytest-mock
三、基础用法示例
场景:邮件发送服务
假设我们有一个邮件发送类 EmailSender
:
# email_sender.py
class EmailSender:
def send(self, to, subject, body):
# 真实发送邮件的逻辑
return True
测试时不应实际发送邮件。使用 pytest-mock
模拟 send
方法:
# test_email_sender.py
def test_send_email(mocker):
mock_send = mocker.patch("email_sender.EmailSender.send")
sender = EmailSender()
result = sender.send("user@example.com", "Hello", "Test email")
mock_send.assert_called_once_with("user@example.com", "Hell