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做一个了解和拓展.上次的内容点这. ...
随机推荐
- Eclipse安装jad反编译插件(在线安装)
Help→Eclipse Marketplace→Find→jad 然后等安装完成重启eclipse即可
- 转 sql 查出一张表中重复的所有记录数据
select * from DB_PATCH awhere lower(a.db_name) in (select lower(db_name) from DB_PATCH group by lowe ...
- PHP的加密方式
1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str -- 原始字符串. raw_output -- ...
- DOM编程练习(慕课网题目)
编程练习 制作一个表格,显示班级的学生信息. 要求: 1. 鼠标移到不同行上时背景色改为色值为 #f2f2f2,移开鼠标时则恢复为原背景色 #fff 2. 点击添加按钮,能动态在最后添加一行 3. 点 ...
- oid和节点名称
由于单篇文档最大字限制是40000个字符,不能将OID附上,因此写出我是如何得到这些OID的. 1.安装NET-SNMP yum install net-snmp yum install net-sn ...
- 全文索引Elasticsearch,Solr,Lucene
最近项目组安排了一个任务,项目中用到了全文搜索,基于全文搜索 Solr,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步,而且是其他团队在维护,依赖性太强,导致 Solr 服务 ...
- Java子类与父类方法的隐藏和覆盖
class Base{ int x = 1; static int y = 2; String name(){ return "mother" ...
- LC.exe 已退出,代码为-1 问题解决
最近一个c#工程,之前编译正常.后重装系统,安装DevExpress后,编译一直失败,并提示"4>C:\Windows\Microsoft.NET\Framework\v4.0.303 ...
- (转)搭建Spring4.x.x开发环境
http://blog.csdn.net/yerenyuan_pku/article/details/52831306 先去Spring官网下载Spring4.x.x开发包(本人使用的版本是Sprin ...
- MVVM没你想象的那么的好
我写过很多有关于让View Controller 更易于理解的文章,其中一种比较常见的模式就是Model-View-ViewModel(MVVM). 我认为MVVM 是一种非常容易让人混淆的 anti ...