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二叉树的实现实例
Nov 21 Python
python之模拟鼠标键盘动作具体实现
Dec 30 Python
Python显示进度条的方法
Sep 20 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
Python 实现还原已撤回的微信消息
Jun 18 Python
详解python中__name__的意义以及作用
Aug 07 Python
使用matlab 判断两个矩阵是否相等的实例
May 11 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
python适合做数据挖掘吗
Jun 16 Python
新手常见Python错误及异常解决处理方案
Jun 18 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
Python使用socket去实现TCP客户端和TCP服务端
Apr 12 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
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
你不知道的文件上传漏洞php代码分析
2016/09/29 PHP
JS 分号引起的一段调试问题
2009/06/18 Javascript
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
p5.js绘制创意自画像
2019/11/04 Javascript
深入解析Python中的lambda表达式的用法
2015/08/28 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
python环境下安装opencv库的方法
2020/03/05 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
什么是索引指示器
2012/08/20 面试题
校班主任推荐信范文
2013/12/03 职场文书
如何写好自荐信
2014/04/07 职场文书
电子信息工程自荐信
2014/05/26 职场文书
计算机科学技术自荐信
2014/06/12 职场文书
先进基层党组织材料
2014/12/25 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
Python echarts实现数据可视化实例详解
2022/03/03 Python