Python之mock模块基本使用方法详解
1. 什么是mock模块
mock 模块是 Python 中的一个第三方库,它可以模拟测试,用于替代复杂的对象或者行为,简化了程序的单元测试,提高了测试的灵活性和便利性。
使用Mock模块的例子:
from mock import Mock, MagicMock, patch
# 1. 创建一个 Mock 对象并且调用
mock_obj = Mock()
mock_obj.method.return_value = 3
print(mock_obj.method(3, 4)) # 输出:3
# 2. MagicMock 对象的使用
mock_magic = MagicMock()
mock_magic.method.return_value = "hello world!"
print(mock_magic.method(2)) # 输出:hello world!
# 3. patch 对象的使用
with patch('module.method') as m:
m.return_value = 4
from module import method
assert method() == 4
2. mock模块的基本用法
主要介绍 Mock、MagicMock、patch 这三个类的使用方法
2.1 Mock 类
Mock 类可以帮助我们创建一个虚拟的对象,这个对象不用关心其功能的实现细节,只需要关注它能够接受输入,并能够输出预期结果即可。
例如:
from mock import Mock
# 创建一个 Mock 对象
mock_obj = Mock()
# 给这个对象添加一个属性
mock_obj.attr = "test"
# 查看这个对象的属性
print(mock_obj.attr) # 输出:test
2.2 MagicMock 类
MagicMock 类是 Mock 的子类,它能够自动的创建 Mock 对象,并且支持任何的方法和属性的调用,如果该方法还不存在,就会自动生成一个符合要求的 Mock 对象。
例如:
from mock import MagicMock
# 创建一个 MagicMock 对象
mock_magic = MagicMock()
# 调用一个不存在的方法,这时会返回一个 MagicMock 对象
print(mock_magic.method1().method2().method3()) # 输出:<MagicMock name='mock_magic.method1().method2().method3()' id='4438287544'>
2.3 patch 类
patch 类的主要作用是在测试过程中,临时替换掉指定的方法或者对象,在测试完成后再将它们还原回来,避免了对象之间的耦合。
例如:
对于一个文件中 func()
函数的测试:
# module.py 文件中
def func():
return True
测试文件中使用 patch 对象:
from mock import patch
from module import func
def test_func():
with patch('module.func') as m:
m.return_value = False
assert func() == False
本例中,当测试函数调用 module.func()
时,patch 对象会将这个函数替换为一个 MagicMock 对象,并修改它的返回值,返回 False
,这就完成了我们的测试。
3. 实例解析
3.1 Mock 类的应用示例
Mock 类可以用来模拟一些数据库操作,如数据库插入数据的场景:
from mock import Mock
# 定义 Mock 对象
mock_db = Mock()
# 模拟数据库插入数据
mock_db.insert.return_value = True
# 真正的数据库插入操作
result = mock_db.insert({
"name": "python",
"version": "3.8.5"
})
# 断言,预期结果为True
assert result == True
3.2 patch 类的应用示例
假设需要将 Python 自带的 smtplib 模块禁用,那么我们就可以使用 patch 技术来实现:
# 需要发送邮件的模块
import smtplib
def send_email(subject, message):
server = smtplib.SMTP('smtp.example.com')
server.sendmail('me@example.com', 'you@example.com', message)
return True
# 禁用 smtplib 模块,使得 send_email() 函数无法发邮件
with patch('smtplib.SMTP') as MockSMTP:
# 开始测试
result = send_email(subject='Hi!', message='Hello World!')
# 断言,预期结果为True
assert result == True
使用 patch 技术,我们临时禁用了 Python 自带的 smtplib 模块,使得 send_email() 函数无法发送邮件,从而完成了我们的测试。
4. 总结
Mock 模块是一个十分重要的测试工具,能够大大简化单元测试的过程,增加了测试的灵活性和便利性,极大地提高了代码质量。通过本文的介绍,相信大家已经学会了如何使用 Mock、MagicMock、patch 这三个类,并且可以运用到实践中去,祝大家使用愉快!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python之mock模块基本使用方法详解 - Python技术站