介绍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.新建一个temple.py,写入以下代码

# 保存为temple.py

# coding:utf-8

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 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
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文档2-unittest单元测试之mock.patch的更多相关文章

  1. python笔记24-unittest单元测试之mock.patch

    前言 上一篇python笔记23-unittest单元测试之mock对mock已经有初步的认识, 本篇继续介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创 ...

  2. 基于 Python 官方 GitHub 构建 Python 文档

    最近在学 Python,所以总是在看 Python 的官方文档, https://docs.python.org/2/ 因为祖传基因的影响,我总是喜欢把这些文档保存到本地,不过 Python 的文档实 ...

  3. python 文档

    python 文档 https://docs.python.org/2/library/index.html

  4. 9.9 Python 文档字符串

    9.9 Python 文档字符串. 进入 Python 标准库所在的目录. 检查每个 .py 文件看是否有__doc__ 字符串, 如果有, 对其格式进行适当的整理归类. 你的程序执行完毕后, 应该会 ...

  5. 第8.19节 使用__doc__访问Python文档字符串(DocStrings )

    __doc__特殊变量用于查看类.函数.模块的帮助信息,这些帮助信息存放在文档字符串中. 一. 关于文档字符串 关于文档字符串前面很多章节提到过,DocStrings 文档字符串用于程序的文档说明,并 ...

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

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

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

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

  8. Python文档

    详细的为代码编写文档,这其实是写好代码的重要部分. 常见编写代码的陷阱: 1.别忘了冒号.一定要记住在复合语句首行末未输入":" 2.从第一行开始.要确定顶层(无嵌套)程序代码从第 ...

  9. Python -- 文档测试

    Python内置的“文档测试”(doctest)模块可以直接提取注释中的代码并执行测试. 例子: # mydict2.py class Dict(dict): ''' Simple dict but ...

随机推荐

  1. Matrix(poj2155)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 25139   Accepted: 9314 Descripti ...

  2. FAT

    目录 概 主要内容 代码 Zhang J., Xu X., Han B., Niu G., Cui L., Sugiyama M., Kankanhalli M. Attacks which do n ...

  3. 自动化集成:Pipeline整合Docker容器

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述流水线集成Docker用法. 一.背景描述 微服务架构 ...

  4. Webpack有哪些常见的Loader?他们是解决什么问题的?

    先来了解一下Loader,webpack是属于模块化方案,他能让任意类型的文件都能运行在浏览器中,怎么做到呢?这时就有了loader 定义: loader 用于对模块的源代码进行转换.loader 可 ...

  5. Spring第一个程序

    目录 1.利用Maven导入jar包 2.编写一个实体类 3.编写Spring文件 4.测试 1.利用Maven导入jar包 <dependency> <groupId>org ...

  6. .NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记

    目录 设计原则 设计模式 设计原则 DRY (Don't repeat yourself 不要重复) KISS (Keep it stupid simple 简单到傻子都能看懂) YAGNI (You ...

  7. ProtoBuf3语法指南(Protocol Buffers)_上

    0.说明 ProtoBuf3语法指南, 又称为proto3, 是谷歌的Protocol Buffers第3个版本. 本文基于官方英文版本翻译, 加上了自己的理解少量修改, 一共分为上下两部分. 1.序 ...

  8. 三角网格上的寻路算法Part.2—A*算法

    背景 继上一篇三角网格Dijkstra寻路算法之后,本篇将继续介绍一种更加智能,更具效率的寻路算法-A*算法,本文将首先介绍该算法的思想原理,再通过对比来说明二者之间的相同与不同之处,然后采用类似Di ...

  9. JZOJ5409. Fantasy && Luogu2048 [NOI2010]超级钢琴

    题目大意 给出一个序列和\(L, R\), 求前k大长度在\([L,R]\)之间的连续子序列的和的和. 解题思路 朴素的想法是对于一个左端点\(p\), 它的右区间取值范围是一个连续的区间即\([p+ ...

  10. 《手把手教你》系列技巧篇(五十五)-java+ selenium自动化测试-上传文件-下篇(详细教程)

    1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...