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实现
Jan 28 Python
浅谈python内置变量-reversed(seq)
Jun 21 Python
分析Python读取文件时的路径问题
Feb 11 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
用Python读取几十万行文本数据
Dec 24 Python
python实现图片中文字分割效果
Jul 22 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
Pytest allure 命令行参数的使用
Apr 18 Python
Python标准库之typing的用法(类型标注)
Jun 02 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读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
深入分析Javascript事件代理
2016/01/30 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
nodejs express配置自签名https服务器的方法
2018/05/22 NodeJs
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
Python 返回汉字的汉语拼音
2009/02/27 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
Python安装模块的常见问题及解决方法
2018/02/05 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
软件测试企业面试试卷
2016/07/13 面试题
工业自动化专业毕业生推荐信
2013/11/18 职场文书
飞机制造技术专业求职信
2014/07/27 职场文书
就业协议书
2014/09/12 职场文书
捐资助学感谢信
2015/01/21 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
联谊会开场白
2015/06/01 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
年终工作总结范文
2019/06/20 职场文书
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL
Android中的Launch Mode详情
2022/06/05 Java/Android
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers