python mock模块使用(二)
本篇继续介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创建模拟并将其传递到装饰函数
官方文档地址
patch简介
1.unittest.mock.patch(target,new = DEFAULT,spec = None,create =
False,spec_set = None,autospec = None,new_callable = None,** kwargs )
target参数必须是一个str,格式为'package.module.ClassName',
注意这里的格式一定要写对,如果你的函数或类写在pakege名称为a下,b.py脚本里,有个c的函数(或类),那这个参数就写“a.b.c”- new参数如果没写,默认指定的是MagicMock
- spec=True或spec_set=True,这会导致patch传递给被模拟为spec / spec_set的对象
new_callable允许您指定将被调用以创建新对象的不同类或可调用对象。默认情况下MagicMock使用。
函数案例讲解
1.接着上一篇python笔记23-unittest单元测试之mock,新建一个temple.py,写入以下代码
def zhifu():
'''假设这里是一个支付的功能,未开发完
支付成功返回:{"result": "success", "reason":"null"}
支付失败返回:{"result": "fail", "reason":"余额不足"}
reason返回失败原因
'''
pass
def zhifu_status():
'''根据支付的结果success or fail,判断跳转到对应页面'''
result = zhifu()
print(result)
try:
if result["result"] == "success":
return "支付成功"
elif result["result"] == "fail":
print("失败原因:%s" % result["reason"])
return "支付失败"
else:
return "未知错误异常"
except:
return "Error, 服务端返回异常!"
2.用mock.patch实现如下:
from unittest import mock
import unittest
import test_case.temple as temple
class Test_zhifu_status(unittest.TestCase):
@mock.patch("test_case.temple.zhifu") #patch格式必须是 包名.文件名.类名
def test_01(self,mock_zhifu):
'''测试支付成功场景'''
# 方法一:mock一个支付成功的数据
# temple.zhifu = mock.Mock(return_value={"result": "success", "reason":"null"})
# 方法二:mock.path装饰器模拟返回结果
mock_zhifu.return_value = {"result": "success", "reason": "null"}
# 根据支付结果测试页面跳转
status=temple.zhifu_status()
print(status)
self.assertEqual(status,"支付成功")
@mock.patch("test_case.temple.zhifu")
def test_02(self,mock_zhifu):
'''测试支付失败场景'''
# 方法一:mock一个支付成功的数据
# temple.zhifu = mock.Mock(return_value={"result": "fail", "reason": "余额不足"})
# 方法二:mock.path装饰器模拟返回结果
mock_zhifu.return_value = {"result": "fail", "reason": "余额不足"}
# 根据支付结果测试页面跳转
status = temple.zhifu_status()
self.assertEqual(status, "支付失败")
if __name__ == "__main__":
unittest.main()
类和方法案例
1.如果前面的temple.py里面不是函数,是写的类和方法,如何去使用mock?
class Zhifu():
def zhifu(self):
'''假设这里是一个支付的功能,未开发完
支付成功返回:{"result": "success", "reason":"null"}
支付失败返回:{"result": "fail", "reason":"余额不足"}
reason返回失败原因
'''
pass
class Status():
def zhifu_status(self):
'''根据支付的结果success or fail,判断跳转到对应页面'''
result = Zhifu().zhifu()
print(result)
try:
if result["result"] == "success":
return "支付成功"
elif result["result"] == "fail":
print("失败原因:%s" % result["reason"])
return "支付失败"
else:
return "未知错误异常"
except:
return "Error, 服务端返回异常!"
2.用例设计如下
from unittest import mock
import unittest
from test_case.temple import Zhifu,Status
class Test_zhifu_status(unittest.TestCase):
@mock.patch("test_case.temple.Zhifu") #patch格式必须是 包名.文件名.类名(或者函数名)
def test_01(self,mock_zhifu):
'''测试支付成功场景'''
a=mock_zhifu.return_value #返回实例,对类名称替换
# 方法二:mock.path装饰器模拟返回结果
# 通过实例调用方法,再对方法的返回值替换
a.zhifu.return_value = {"result": "success", "reason": "null"}
# 根据支付结果测试页面跳转
status=Status().zhifu_status()
print(status)
self.assertEqual(status,"支付成功")
def test_02(self):#,mock_zhifu):
'''测试支付失败场景'''
#b=mock_zhifu.return_value
# 方法一:mock一个支付成功的数据
Zhifu.zhifu = mock.Mock(return_value={"result": "fail", "reason": "余额不足"})
# 根据支付结果测试页面跳转
status = Status().zhifu_status()
self.assertEqual(status, "支付失败")
if __name__ == "__main__":
unittest.main()
3.相当于函数来说,这里主要多一步,要先对类的名称进行mock一次"a = mock_Zhifu.return_value",再通过实例去调用方法
python mock模块使用(二)的更多相关文章
- python mock模块使用(一)
什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西. 它的主要功能是使用mock对象替代掉指定 ...
- python标准模块(二)
本文会涉及到的模块: json.pickle urllib.Requests xml.etree configparser shutil.zipfile.tarfile 1. json & p ...
- python常用模块(二)
1.ConfigParser模块 用于生成和修改配置文档,在python3.x中变更为configparser 1 [DEFAULT] 2 ServerAliveInterval = 45 3 Com ...
- Python unittest模块心得(二)
基础概念介绍请参看: http://www.cnblogs.com/frost-hit/p/8295818.html 组织测试用例 unittest.TestSuite(tests=()): 除了使用 ...
- Python学习笔记总结(二)函数和模块
一.函数 函数的作用:可以计算出一个返回值,最大化代码重用,最小化代码冗余,流程的分解. 1.函数相关的语句和表达式 语句 例子 Calls myfunc(‘diege', ...
- python基础-------模块与包(二)
sys模块.logging模块.序列化 一.sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时e ...
- 使用Python中的mock模块进行单元测试
在进行单元测试的时候,有时候会遇到这种情况: 出于某些原因,我们不想测试某一部分内容,但是我们想要测试的部分却依赖这部分内容. 这时候,可以使用mock模块来模拟调用这部分内容,并给出返回结果,举例如 ...
- Python学习 :常用模块(二)
常用模块(二) 四.os模块 os模块是与操作系统交互的一个接口,用于对操作系统进行调用 os.getcwd() # 提供当前工作目录 os.chdir() # 改变当前工作目录 os.curdir( ...
- python并发模块之concurrent.futures(二)
python并发模块之concurrent.futures(二) 上次我们简单的了解下,模块的一些基本方法和用法,这里我们进一步对concurrent.futures做一个了解和拓展.上次的内容点这. ...
随机推荐
- Asp.net WebApi 异常处理解决方案
一.使用异常筛选器捕获所有异常 我们知道,一般情况下,WebApi作为服务使用,每次客户端发送http请求到我们的WebApi服务里面,服务端得到结果输出response到客户端.这个过程中,一旦服务 ...
- Codeforces Round #408 (Div. 2) C
Description Although Inzane successfully found his beloved bone, Zane, his owner, has yet to return. ...
- 7.1 Java集合概述
List 有序.重复的集合 Set 无序.不可重复的集合 Map 具有映射关系的集合 jdk1.5之后.Java增加了Queue体系集合,代表一种队列集合实现
- 创建表的规范 nvarchar2,varchar2
1,这个真没见过什么最佳实践,都是变长的,这些都是研发根据业务需求自己设定啊. 如果需要多语种支持就用NVARCHAR2(或者汉语),如果只是单语种(英语)就varchar2 . 2. Oracle中 ...
- 141 Linked List Cycle 环形链表
给定一个链表,判断链表中否有环.补充:你是否可以不用额外空间解决此题?详见:https://leetcode.com/problems/linked-list-cycle/description/ J ...
- mybatis javaConfig实现
@Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessio ...
- java只http改成https访问
目录 生成keystore文件 修改tomcat中的server.xml文件 配置浏览器 生成keystore文件: 1.在tomcat的bin 目录下输入命令:keytool -genkeypair ...
- Java网络编程学习笔记
Java网络编程,我们先来看下面这一张图: 由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听.通过accept来判断是否有客户端与其相连.若成功连上,则通过r ...
- android开发哪些坑需要注意
同一个应用的JNI代码,不要轻易换NDK编译的版本,否则会有很多问题(主要是一些方法实现不一样,并且高版本对代码的检测更严格),比如r8没有问题,但到r9就有问题了,这是个大坑: Android的JN ...
- vue-devtools在google浏览器下安装扩展
下载vue-devtools,地址: https://github.com/vuejs/vue-devtools 解压到对应目录,eg: D:\ProgramFiles\vue-devtools-de ...