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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。