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 sys模块sys.path使用方法示例
Dec 04 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
Python中序列的修改、散列与切片详解
Aug 27 Python
Python 利用内置set函数对字符串和列表进行去重的方法
Jun 29 Python
Python 串口读写的实现方法
Jun 12 Python
Pycharm运行加载文本出现错误的解决方法
Jun 27 Python
Python.append()与Python.expand()用法详解
Dec 18 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 Python
Python selenium爬取微博数据代码实例
May 22 Python
OpenCV利用python来实现图像的直方图均衡化
Oct 21 Python
python用tkinter实现一个gui的翻译工具
Oct 26 Python
Python可视化神器pyecharts之绘制箱形图
Jul 07 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
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
解析php取整的几种方式
2013/06/25 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
js获取对象为null的解决方法
2013/11/21 Javascript
JavaScript中判断整数的多种方法总结
2014/11/08 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
JavaScript闭包详解
2015/02/02 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
AngularJS实现表单元素值绑定操作示例
2017/10/11 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
2018/01/31 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
javascript实现计算器功能
2020/03/30 Javascript
Python 开发Activex组件方法
2009/11/08 Python
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
python3大文件解压和基本操作
2017/12/15 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
tensorflow自定义激活函数实例
2020/02/04 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
奥巴马竞选演讲稿
2014/05/15 职场文书
入党介绍人意见2015
2015/06/01 职场文书
初中生物教学反思
2016/02/20 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python
react中的DOM操作实现
2021/06/30 Javascript