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编写脚本获取手机当前应用apk的信息
Jul 21 Python
Python实现网络端口转发和重定向的方法
Sep 19 Python
python中numpy包使用教程之数组和相关操作详解
Jul 30 Python
Java及python正则表达式详解
Dec 27 Python
对Python3.x版本print函数左右对齐详解
Dec 22 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
Python编程实现tail-n查看日志文件的方法
Jul 08 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
在python shell中运行python文件的实现
Dec 21 Python
python/golang实现循环链表的示例代码
Sep 14 Python
python自动生成证件号的方法示例
Jan 14 Python
如何在C++中调用Python
May 21 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应用技巧
2008/03/27 PHP
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
PHP实现采集中国天气网未来7天天气
2014/10/15 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
PDO::errorCode讲解
2019/01/28 PHP
js 覆盖和重载 函数
2009/09/25 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
vue.js项目nginx部署教程
2018/04/05 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
python 实现归并排序算法
2012/06/05 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
python生成器用法实例详解
2019/11/22 Python
python环境下安装opencv库的方法
2020/03/05 Python
django model object序列化实例
2020/03/13 Python
利用python生成照片墙的示例代码
2020/04/09 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
工商管理实习自我鉴定
2013/09/28 职场文书
便利店的创业计划书
2014/01/15 职场文书
自我反省检讨书
2014/01/23 职场文书
自荐信写法介绍
2014/01/25 职场文书
2015年秋学期教研工作总结
2015/10/14 职场文书
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis