python 如何在测试中使用 Mock


Posted in Python onMarch 01, 2021

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的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
跟老齐学Python之不要红头文件(1)
Sep 28 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
python高级特性和高阶函数及使用详解
Oct 17 Python
Python Numpy:找到list中的np.nan值方法
Oct 30 Python
Appium+Python自动化测试之运行App程序示例
Jan 23 Python
Python变量访问权限控制详解
Jun 29 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
Python collections模块使用方法详解
Aug 28 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
Python关于拓扑排序知识点讲解
Jan 04 Python
python装饰器代码深入讲解
Mar 01 #Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 #Python
python爬取股票最新数据并用excel绘制树状图的示例
Mar 01 #Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 #Python
python中random模块详解
Mar 01 #Python
利用python实现汉诺塔游戏
Mar 01 #Python
python绘制汉诺塔
Mar 01 #Python
You might like
PHP开发需要注意的安全问题
2010/09/01 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
PHP7 新增功能
2021/03/09 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
一个js实现的所谓的滑动门
2007/05/23 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
js获取字符串字节数方法小结
2015/06/09 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
班级聚会策划书
2014/01/16 职场文书
房屋转让协议书
2014/04/11 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
2015年新农合工作总结
2015/03/30 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python
python爬取豆瓣电影TOP250数据
2021/05/23 Python
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python