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中的rfind()方法使用详解
May 19 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
python实现搜索文本文件内容脚本
Jun 22 Python
python之django母板页面的使用
Jul 03 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
python numpy数组中的复制知识解析
Feb 03 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
面向新手解析python Beautiful Soup基本用法
Jul 11 Python
Python HTMLTestRunner如何下载生成报告
Sep 04 Python
python脚本框架webpy的url映射详解
Nov 20 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 Python
Python如何用re模块实现简易tokenizer
May 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扩展” 的解决方法
2007/04/16 PHP
php实现异步数据调用的方法
2015/12/24 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
php实现映射操作实例详解
2019/10/02 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
Js 本页面传值实现代码
2009/05/17 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
了解前端理论:rscss和rsjs
2019/05/23 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
element中的$confirm的使用
2020/04/26 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
vue递归获取父元素的元素实例
2020/08/07 Javascript
Python中编写ORM框架的入门指引
2015/04/29 Python
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
Python模拟登录验证码(代码简单)
2016/02/06 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
python元组的概念知识点
2019/11/19 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
应聘文员自荐信范文
2014/03/11 职场文书
大学迎新晚会主持词
2014/03/24 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
R9700摩机记
2022/04/05 无线电
ant design vue的form表单取值方法
2022/06/01 Vue.js