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科学计算环境推荐——Anaconda
Jun 30 Python
利用Fn.py库在Python中进行函数式编程
Apr 22 Python
利用Python实现简单的相似图片搜索的教程
Apr 23 Python
python交互式图形编程实例(二)
Nov 17 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
如何定义TensorFlow输入节点
Jan 23 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
python 穷举指定长度的密码例子
Apr 02 Python
Python HTMLTestRunner可视化报告实现过程解析
Apr 10 Python
python 利用panda 实现列联表(交叉表)
Feb 06 Python
对Keras自带Loss Function的深入研究
May 25 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操作excel文件 基于phpexcel
2010/07/02 PHP
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
python中input()与raw_input()的区别分析
2016/02/27 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
python中的decorator的作用详解
2018/07/26 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
python 安装impala包步骤
2020/03/28 Python
python怎么判断素数
2020/07/01 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
财务学生的职业生涯发展
2014/02/11 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
2019垃圾分类宣传口号汇总
2019/08/16 职场文书
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis
Redis Stream类型的使用详解
2021/11/11 Redis