Mock概念
mock 的意思是模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对所依赖的模块的测试。
一般有两种场景:
- 前端对后端接口的 mock,
- 后端服务之间的测试中涉及的mock,常常发生在单元测试的时候。
前端mock可以通过一些工具来完成:
- 使用抓包工具Fiddler,Charles 来实现,通过修改代理返回的数据,实现多种场景的测试。
- 使用一些API管理工具来模拟,比如yapi,Easy Mock 等
- 当然有编码能力的,也可以使用node.js,python的fastAPI来模拟
后端的 Mock 则是从接口的角度,如果一个接口A返回的数据需要依赖于另一个接口B,当敏捷开发中B接口还未开发完全时候这里会需要用到 Mock。
对于测试人员,对接口测试的时候,部分接口尚未开发完成,在约定了接口定义之后,也可以使用 Mock 来模拟。
在 python3.X 中 Mock 模块已经被集成到unittest里面。
Mock类
class Mock(spec=None,side_effect=None,return_value=DEFAULT,name=None)
- spec:定义Mock对象的属性值,可以是一个列表,字符串,一个对象的实例
- side_effect:可以用来抛出异常或者动态改变返回值,可以覆盖return_value
- return_value:定义mock的返回值
- name:作为mock对象的标识可以在print时候看到
简单的例子体验下 Mock 的功能特点
from unittest import mock def add(num1,num2): return num1 + num2 # pass add = mock.Mock(return_value=200) # 创建mock对象 print( add(10,20) )
你会发现无论输入的参数是什么,输出结果都是200。等于方法被 Mock 拦截处理了。
一个相对正式的 Mock 例子
正常情况:
import requests def request_scm(): # res = requests.get('http://www.mysx-scm.com') res = requests.get('http://baidu.com') return res.status_code import unittest from unittest import mock class TestScmApi(unittest.TestCase): def testUrl(self): # request_scm = mock.Mock(return_value=200) self.assertEqual(request_scm(), 200, msg='testUrl 出现错误') if __name__ == '__main__': unittest.main()
可以分别把两个 # 注释移到下一句试试。
一个完整的测试例子
import requests class scmapi(): def request_scm(): res = requests.get('http://www.mysx-scm.com') # res = requests.get('http://baidu.com') return res.status_code def pay_alipay(): ''' 待实现 return 200 ''' return 0 import unittest from unittest import mock class TestScmApi(unittest.TestCase): needmock = True def setUpClass(): print("setUpClass():所有方法之前执行") def tearDownClass(): print("tearDownClass():所有方法之后执行") def setUp(self): self.scmapi = scmapi() print("setUp():每个方法之前执行") def tearDown(self): print("teardown():每个方法之后执行") def test_request_scm(self): if self.needmock: scmapi.request_scm = mock.Mock(return_value=200) self.assertEqual(scmapi.request_scm(), 200, msg='test_request_scm 出现错误') def test_pay_alipay(self): if self.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的资料请关注其它相关文章!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]