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实现一次创建多级目录的方法
May 15 Python
python3第三方爬虫库BeautifulSoup4安装教程
Jun 19 Python
python pandas实现excel转为html格式的方法
Oct 23 Python
浅谈pyqt5中信号与槽的认识
Feb 17 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
Series和DataFrame使用简单入门
Nov 13 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
Django更新models数据库结构步骤
Apr 01 Python
jupyter notebook参数化运行python方式
Apr 10 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
Python jieba结巴分词原理及用法解析
Nov 05 Python
Python基本知识点总结
Apr 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 操作文件的一些FAQ总结
2009/02/12 PHP
浅析PHP 按位与或 (^ 、&)
2013/06/21 PHP
ThinkPHP分页类使用详解
2014/03/05 PHP
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
Python 爬取携程所有机票的实例代码
2018/06/11 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
Python实现搜索算法的实例代码
2020/01/02 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
C/C++程序员常见面试题一
2012/12/08 面试题
大学教师年终总结的自我评价
2013/10/29 职场文书
毕业生找工作的求职信范文
2013/12/24 职场文书
python 逐步回归算法
2021/04/06 Python
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python
微信小程序APP的生命周期及页面的生命周期
2022/04/19 Javascript