python 如何在测试中使用 Mock
作者:路上有莉 发布时间:2022-01-08 07:41:09
目录
Mock概念
Mock类
简单的例子体验下 Mock 的功能特点
一个相对正式的 Mock 例子
一个完整的测试例子
断言方法
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 |
来源:https://www.cnblogs.com/chxl-china/p/14446003.html
猜你喜欢
- 一、去除空格strip()" xyz ".strip() &n
- 一、react-reduxreact-redux依赖于redux工作。 运行安装命令:npm i react-redux:使用: 将Prov
- 内容摘要:这篇文章的主旨是弄清楚如何根据实际需求实现一个联动菜单以及联动菜单的原理,实例是实现一个日期选择下拉菜单。首先来分析一下日期下拉菜
- 当元素设置浮动(float)后会被移出文档流,相信大家都会经常遇到这样的问题。这问题的解决办法有N种之多,因为每种浏览器对CSS的解析各异,
- 尽管 JavaScript 历史上使用冗长而令人生厌的代码块来标的特定浏览器的时期已经结束了,但是偶尔使用一些简单的代码块和对象检测来确保一
- CSS中最常用的布局类属性,一个是Float(CSS浮动属性Float详解),另一个就是CSS定位属性Position。1. positio
- 时下,个性ico图标却成为一些主流大牌网站提高用户体验(UE)的一个“时髦”玩法,那么,是如何在IE地址栏显示出网站的个性图标的呢?常浏览网
- 这个可应用于所有浏览器中.<SCRIPT language=javascript>var leave=true; functio
- 这篇文章主要介绍了wxpython自定义下拉列表框过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 在刚过去不久的6月30日那天,国外一位在YouTube拥有上千万粉丝的我的世界游戏主播Technoblade因癌症与世长辞,年仅23岁,他并
- 二、XML的定义 XML是一个精简的SGML,它将SGML的丰富功能与HTML的易用性结合到Web的应用中。XML保留了SGML的可扩展功能
- 一、get//get请求function getUrl($url, $header = []){ $ch = cu
- 通过变量ID得到变量的值已知获得变量的id用函数id(),那么它的反函数是什么?答案是:PyObj_FromPtr,据此,写了一个函数di(
- 原文作者:青女 附注及色样添加:Quester西式的色名及色样表,可以参见以下链接 (Java 类色彩兼容):http
- 1.建表代码如下:-- Create table create table test ( dm1 char(3), dm2 char(3),
- 先来了解一下收/发邮件有哪些协议:SMTP协议 SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议。
- 阅读上一节:美化段落文本 Ⅰweb标准知识——美化段落文本 Ⅱ懒,可能是唯一解释为什么这么长时间才写这一篇的主要原因。不述详情,以此责心。上
- 从本文开始,本系列将介绍python简单案例并进行代码展示,本文的案例是利用pandas库实现读取csv文件并按照列的从小到大进行排序。前言
- 使用的类库pip install openpyxl操作实现•工作簿操作# coding: utf-8from openpyxl import
- Silverlight和Flash,到底谁更强?谁更有优势?很多初接触Silverlight和Flash的人总是会问这个问题,因为它们在表面