前言

上一篇python笔记23-unittest单元测试之mock对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,写入以下代码

# 保存为temple.py

# coding:utf-8
# 作者:上海-悠悠 QQ交流群:588402570 def zhifu():
'''假设这里是一个支付的功能,未开发完
支付成功返回:{"result": "success", "reason":"null"}
支付失败返回:{"result": "fail", "reason":"余额不足"}
reason返回失败原因
'''
pass def zhifu_statues():
'''根据支付的结果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实现如下:

# coding:utf-8
from unittest import mock
import unittest
import temple
# 作者:上海-悠悠 QQ交流群:588402570 class Test_zhifu_statues(unittest.TestCase):
'''单元测试用例''' @mock.patch("temple.zhifu")
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"}
# 根据支付结果测试页面跳转
statues = temple.zhifu_statues()
print(statues)
self.assertEqual(statues, "支付成功") @mock.patch("temple.zhifu")
def test_02(self, mock_zhifu):
'''测试支付失败场景'''
# mock一个支付成功的数据 mock_zhifu.return_value = {"result": "fail", "reason": "余额不足"}
# 根据支付结果测试页面跳转
statues = temple.zhifu_statues()
self.assertEqual(statues, "支付失败") if __name__ == "__main__":
unittest.main()

类和方法案例

1.如果前面的temple.py里面不是函数,是写的类和方法,如何去使用mock?

# 保存为temple.py

# coding:utf-8
# 作者:上海-悠悠 QQ交流群:588402570
class Zhifu():
def zhifu(self):
'''假设这里是一个支付的功能,未开发完
支付成功返回:{"result": "success", "reason":"null"}
支付失败返回:{"result": "fail", "reason":"余额不足"}
reason返回失败原因
'''
pass class Statues():
def zhifu_statues(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.用例设计如下

# coding:utf-8
from unittest import mock
import unittest
from temple_class import Zhifu,Statues
# 作者:上海-悠悠 QQ交流群:588402570 class Test_zhifu_statues(unittest.TestCase):
'''单元测试用例''' @mock.patch("temple_class.Zhifu")
def test_01(self, mock_Zhifu):
'''测试支付成功场景'''
a = mock_Zhifu.return_value # 先返回实例,对类名称替换
# 通过实例调用方法,再对方法的返回值替换
a.zhifu.return_value = {"result": "success", "reason":"null"}
# 根据支付结果测试页面跳转
statues = Statues().zhifu_statues()
print(statues)
self.assertEqual(statues, "支付成功") @mock.patch("temple_class.Zhifu")
def test_02(self, mock_Zhifu):
'''测试支付失败场景'''
b = mock_Zhifu.return_value # 先返回实例,对类名称替换
# 通过实例调用方法,再对方法的返回值替换
b.zhifu.return_value = {"result": "fail", "reason": "余额不足"}
# 根据支付结果测试页面跳转
statues = Statues().zhifu_statues()
print(statues)
self.assertEqual(statues, "支付失败") if __name__ == "__main__":
unittest.main()

3.相当于函数来说,这里主要多一步,要先对类的名称进行mock一次"a = mock_Zhifu.return_value",再通过实例去调用方法

python自动化交流 QQ群:779429633

python笔记24-unittest单元测试之mock.patch的更多相关文章

  1. python文档2-unittest单元测试之mock.patch

    介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创建模拟并将其传递到装饰函数 patch简介 1.unittest.mock.patch(target,ne ...

  2. python文档1-unittest单元测试之mock

    什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西.它的主要功能是使用mock对象替代掉指定的 ...

  3. python笔记23-unittest单元测试之mock

    什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西. 它的主要功能是使用mock对象替代掉指定 ...

  4. CoreCRM 开发实录 —— 单元测试之 Mock UserManager 和 SignInManager

    单元测试的核心就是:只测试眼前的逻辑.这就要求所有的依赖项都要使用仿类来代替,也就是所谓的 Mock Object.在测试 ProfileRepository 和 AccountController ...

  5. 单元测试之Mock

    为什么需要Mock. 真实对象具有不确定的行为.所以会产生不可预测的结果. 真实对象很难被创建. 真实对象的某些行为很难被触发(如网络错误). 真实对象令程序的运行速度很慢. 真实对象有(或者是)用户 ...

  6. java单元测试之Mock静态方法

    1 public final class AmountUtil { public static String CustomFormatWith2Digits(int amount) { return ...

  7. python + unittest 做单元测试之学习笔记

    单元测试在保证开发效率.可维护性和软件质量等方面有很重要的地位,所谓的单元测试,就是对一个类,一个模块或者一个函数进行正确性检测的一种测试方式. 这里主要是就应用 python + unitest 做 ...

  8. 偷梁换柱:使用mock.patch辅助python单元测试

    最近在搞软工项目的后端测试,重新复习了一下python的mock.patch,并用它简化了对一些复杂逻辑的测试,在此记录 问题描述 本组的项目比较特殊,设计对教务网站的模拟登陆与信息爬取,同时不少接口 ...

  9. Java基础学习总结(24)——Java单元测试之JUnit4详解

    Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @BeforeClass 全局只会执行一次,而且是第一个运行 @Before  ...

随机推荐

  1. rest api load test

    1. SoapUI + LoadUI 2. https://github.com/jeffbski/bench-rest 3. JMeter

  2. DotNetOpenAuth实践之Webform资源服务器配置

    系列目录: DotNetOpenAuth实践系列(源码在这里) 上篇我们讲到WebApi资源服务器配置,这篇我们说一下Webform下的ashx,aspx做的接口如何使用OAuth2认证 一.环境搭建 ...

  3. Codeforces Round #361 (Div. 2) D - Friends and Subsequences

    题目大意:给你两个长度为n的数组a, b,问你有多少个问你有多少个区间满足 a中最大值等于b中最小值. 思路:我本来的想法是用单调栈求出每个点的管辖区间,然后问题就变成了巨麻烦的线段覆盖问题,就爆炸写 ...

  4. 更换 ECharts 散点图图标(散点图中symbol的使用)

    更换 ECharts 散点图图标 使用symbol关键字

  5. 使用Nginx实现TCP反向代理

    Nginx 在1.9.0版本发布以前如果要想做到基于TCP的代理及负载均衡需要通过打名为 nginx_tcp_proxy_module 的第三方patch来实现,该模块的代码托管在github上网址: ...

  6. perl相关知识

    转:http://www.runoob.com/perl/perl-cgi-programming.html Perl 是 Practical Extraction and Report Langua ...

  7. 【转载】Picasso源码解析

    原文地址:http://blog.csdn.net/u012702547/article/details/52273918 Picasso是Squareup公司出的一款图片加载框架,能够解决我们在An ...

  8. Apache+PHP环境搭建

    第一次搭建Apache+PHP+MySQL的开发环境,发现Apache与PHP的整合非常麻烦,先整理记录如下: 一.安装Apache 1.登录http://httpd.apache.org/downl ...

  9. GeneXus项目启动

    使用GeneXus产品开发项目时,在开始,有一些属性我会经常改一下.我现在使用的GeneXus版本是GeneXus U3,由于在做手机应用的开发,所以一般使用最新的版本,老外那边差不多两个月会有一个u ...

  10. scrapy抓取拉勾网职位信息(五)——代码优化

    上一篇我们已经让代码跑起来,各个字段也能在控制台输出,但是以item类字典的形式写的代码过于冗长,且有些字段出现的结果不统一,比如发布日期. 而且后续要把数据存到数据库,目前的字段基本都是string ...