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中模拟enum枚举类型的5种方法分享
Nov 22 Python
在Python中用keys()方法返回字典键的教程
May 21 Python
python写一个md5解密器示例
Feb 23 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
Python中Numpy ndarray的使用详解
May 24 Python
python设置环境变量的原因和方法
Jun 24 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
详解Django定时任务模块设计与实践
Jul 24 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
利用Python实现最小二乘法与梯度下降算法
Feb 21 Python
python实现三阶魔方还原的示例代码
Apr 28 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 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 return语句的另一个作用
2014/07/30 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
javascript date格式化示例
2013/09/25 Javascript
原生JavaScript实现连连看游戏(附源码)
2013/11/05 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
Python中的jquery PyQuery库使用小结
2014/05/13 Python
python抽象基类用法实例分析
2015/06/04 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
python获取本机所有IP地址的方法
2018/12/26 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
python判断自身是否正在运行的方法
2019/08/08 Python
python重要函数eval多种用法解析
2020/01/14 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
Python中如何定义一个函数
2016/09/06 面试题
机械专业个人求职自荐信格式
2013/09/21 职场文书
公司委托书范本
2014/04/04 职场文书
一年级小学生评语
2014/04/22 职场文书
化工操作工岗位职责
2014/04/29 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
亲属关系公证书样本
2015/01/23 职场文书
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android