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 (2)
Oct 31 Python
python打开网页和暂停实例
Sep 30 Python
Python中的高级数据结构详解
Mar 27 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
使用Python对Access读写操作
Mar 30 Python
使用Python设计一个代码统计工具
Apr 04 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
Python类如何定义私有变量
Feb 03 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
使用python编写一个语音朗读闹钟功能的示例代码
Jul 14 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 Python
Python可视化神器pyecharts之绘制箱形图
Jul 07 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” 彩蛋进行敏感信息获取
2013/08/07 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
react实现换肤功能的示例代码
2018/08/14 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
Python中装饰器高级用法详解
2017/12/25 Python
对python中的for循环和range内置函数详解
2018/04/17 Python
django query模块
2019/04/20 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
Python3 JSON编码解码方法详解
2019/09/06 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
2019/12/23 Python
django处理select下拉表单实例(从model到前端到post到form)
2020/03/13 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
危货运输企业安全生产责任书
2014/07/28 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
2015年综治宣传月活动总结
2015/03/25 职场文书
python实现简单的名片管理系统
2021/04/26 Python
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android