一、什么是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
欢迎来到testingpai.com!
注册 关于