python 如何在测试中使用 Mock
Mock概念
mock的意思是模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对所依赖的模块的测试。
一般有两种场景:
- 前端对后端接口的mock,
- 后端服务之间的测试中涉及的mock,常常发生在单元测试的时候。
前端mock可以通过一些工具来完成:
- 使用抓包工具Fiddler,Charles来实现,通过修改代理返回的数据,实现多种场景的测试。
- 使用一些API管理工具来模拟,比如yapi,EasyMock等
- 当然有编码能力的,也可以使用node.js,python的fastAPI来模拟
后端的Mock则是从接口的角度,如果一个接口A返回的数据需要依赖于另一个接口B,当敏捷开发中B接口还未开发完全时候这里会需要用到Mock。
对于测试人员,对接口测试的时候,部分接口尚未开发完成,在约定了接口定义之后,也可以使用Mock来模拟。
在python3.X中Mock模块已经被集成到unittest里面。
Mock类
classMock(spec=None,side_effect=None,return_value=DEFAULT,name=None)
- spec:定义Mock对象的属性值,可以是一个列表,字符串,一个对象的实例
- side_effect:可以用来抛出异常或者动态改变返回值,可以覆盖return_value
- return_value:定义mock的返回值
- name:作为mock对象的标识可以在print时候看到
简单的例子体验下Mock的功能特点
fromunittestimportmock defadd(num1,num2): returnnum1+num2#pass add=mock.Mock(return_value=200)#创建mock对象 print(add(10,20))
你会发现无论输入的参数是什么,输出结果都是200。等于方法被Mock拦截处理了。
一个相对正式的Mock例子
正常情况:
importrequests
defrequest_scm():
#res=requests.get('http://www.mysx-scm.com')
res=requests.get('http://baidu.com')
returnres.status_code
importunittest
fromunittestimportmock
classTestScmApi(unittest.TestCase):
deftestUrl(self):
#request_scm=mock.Mock(return_value=200)
self.assertEqual(request_scm(),200,msg='testUrl出现错误')
if__name__=='__main__':
unittest.main()
可以分别把两个#注释移到下一句试试。
一个完整的测试例子
importrequests
classscmapi():
defrequest_scm():
res=requests.get('http://www.mysx-scm.com')
#res=requests.get('http://baidu.com')
returnres.status_code
defpay_alipay():
'''
待实现
return200
'''
return0
importunittest
fromunittestimportmock
classTestScmApi(unittest.TestCase):
needmock=True
defsetUpClass():
print("setUpClass():所有方法之前执行")
deftearDownClass():
print("tearDownClass():所有方法之后执行")
defsetUp(self):
self.scmapi=scmapi()
print("setUp():每个方法之前执行")
deftearDown(self):
print("teardown():每个方法之后执行")
deftest_request_scm(self):
ifself.needmock:
scmapi.request_scm=mock.Mock(return_value=200)
self.assertEqual(scmapi.request_scm(),200,msg='test_request_scm出现错误')
deftest_pay_alipay(self):
ifself.needmock:
scmapi.pay_alipay=mock.Mock(return_value=200)
self.assertEqual(scmapi.pay_alipay(),200,msg='test_pay_alipay出现错误')
if__name__=='__main__':
unittest.main()
断言方法
基本的断言方法提供了测试结果是True还是False。所有的断言方法都有一个msg参数,如果指定msg参数的值,则将该信息作为失败的错误信息返回。
| 序号 | 断言方法 | 断言描述 |
|---|---|---|
| 1 | assertEqual(arg1,arg2,msg=None) | 验证arg1=arg2,不等则fail |
| 2 | assertNotEqual(arg1,arg2,msg=None) | 验证arg1!=arg2,相等则fail |
| 3 | assertTrue(expr,msg=None) | 验证expr是true,如果为false,则fail |
| 4 | assertFalse(expr,msg=None) | 验证expr是false,如果为true,则fail |
| 5 | assertIs(arg1,arg2,msg=None) | 验证arg1、arg2是同一个对象,不是则fail |
| 6 | assertIsNot(arg1,arg2,msg=None) | 验证arg1、arg2不是同一个对象,是则fail |
| 7 | assertIsNone(expr,msg=None) | 验证expr是None,不是则fail |
| 8 | assertIsNotNone(expr,msg=None) | 验证expr不是None,是则fail |
| 9 | assertIn(arg1,arg2,msg=None) | 验证arg1是arg2的子串,不是则fail |
| 10 | assertNotIn(arg1,arg2,msg=None) | 验证arg1不是arg2的子串,是则fail |
| 11 | assertIsInstance(obj,cls,msg=None) | 验证obj是cls的实例,不是则fail |
| 12 | assertNotIsInstance(obj,cls,msg=None) | 验证obj不是cls的实例,是则fail |
以上就是python如何在测试中使用Mock的详细内容,更多关于python测试中使用Mock的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。