一、什么是mock?
- mock翻译过来有模拟的意思。主要功能是使用mock对象替代掉指定的python对象,以达到模拟对象的行为的目的。
- 在python里面mock是辅助单元测试的一个模块,在2.x版本里面属于单独的模块,在python3以后已经集成到了unittest模块当中。
二、使用场景
- 解决依赖:当测试某个接口或者功能模块时,如果被测接口所依赖的其他接口并没有开发完成,这个时候我们就可以使用mock来模拟依赖接口的返回,进行提前测试。
- 模拟复杂业务接口:如果测试的某个功能,涉及其他系统,而其他系统测试数据构造相对复杂,该系统并不在本次迭代范围以内。此时可以使用mock来模拟这个复杂系统来降低测试成本提高测试效率。
- 外部接口联调:当测试过程中需要与第三方公司联调,但是测试环境并没有打通的时候,此时可以根据第三方公司的接口文档来mock各种场景,提前进行我方系统的测试。
三、简单使用
导入模块
from unittest import mock
使用mock模拟函数返回
from unittest import mock
def test01():
"""
test01函数并未实现,通过mock来模拟该函数的返回
:return:
"""
pass
test01 = mock.Mock(return_value=100) 创建Mock对象, 作为Test01的实例方法
print(test01()) 当调用test01方法时, 会返回定义Mock对象时指定的return_value值
输出:100
跟据不同传参返回不同的值
from unittest import mock
def test01():
"""
根据传参模拟不同返回值
:return:
"""
pass
def test02(data):
mock_data={
"demo01":"支付中",
"demo02":"支付成功",
"demo03":"支付失败"
}
return mock_data[data]
test01 = mock.Mock(side_effect=test02)
print(test01("demo02"))
输出:支付成功
函数传参个数检查
from unittest import mock
def test01(x,y,z):
pass
传参符合规范返回success,否则报错
test01=mock.create_autospec(test01,return_value="success")
print(test01(1,2,3))
输出:success
@path.object()装饰器使用
新建mymock.py
def test01():
print("啥也不干")
新建demo01.py文件
from unittest.mock import patch
import mymock
@patch.object(target=mymock,attribute="test01")
def test02(mock_fun):
"""
函数内调用模拟方法并返回模拟值
demo01:类名称/模块名称
"test01":被模拟的方法
mock_fun:接收被模拟的函数
"""
mock_fun.return_value={'status_code':'200'} 为mock对象设置返回值
result = mymock.test01() 调用函数就相当于调用mock对象
print(result)
test02()
输出:{'status_code':'200'}
总结
- mock还有很多自带方法,而且功能非常强大,但是对于我们测试工程师而言,掌握这几个mock方法,平时工作中就足够了。本篇文章仅介绍mock的常用方法,其他方法感兴趣的同学可以去看官方文档。
- 官方文档地址:https://docs.python.org/3/library/unittest.mock.html