介绍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,写入以下代码

  1. # 保存为temple.py
  2. # coding:utf-8
  3. def zhifu():
  4. '''假设这里是一个支付的功能,未开发完
  5. 支付成功返回:{"result": "success", "reason":"null"}
  6. 支付失败返回:{"result": "fail", "reason":"余额不足"}
  7. reason返回失败原因
  8. '''
  9. pass
  10. def zhifu_statues():
  11. '''根据支付的结果success or fail,判断跳转到对应页面'''
  12. result = zhifu()
  13. print(result)
  14. try:
  15. if result["result"] == "success":
  16. return "支付成功"
  17. elif result["result"] == "fail":
  18. print("失败原因:%s" % result["reason"])
  19. return "支付失败"
  20. else:
  21. return "未知错误异常"
  22. except:
  23. return "Error, 服务端返回异常!"

2.用mock.patch实现如下:

  1. # coding:utf-8
  2. from unittest import mock
  3. import unittest
  4. import temple
  5. class Test_zhifu_statues(unittest.TestCase):
  6. '''单元测试用例'''
  7. @mock.patch("temple.zhifu")
  8. def test_01(self, mock_zhifu):
  9. '''测试支付成功场景'''
  10. # 方法一:mock一个支付成功的数据
  11. # temple.zhifu = mock.Mock(return_value={"result": "success", "reason":"null"})
  12. # 方法二:mock.path装饰器模拟返回结果
  13. mock_zhifu.return_value = {"result": "success", "reason":"null"}
  14. # 根据支付结果测试页面跳转
  15. statues = temple.zhifu_statues()
  16. print(statues)
  17. self.assertEqual(statues, "支付成功")
  18. @mock.patch("temple.zhifu")
  19. def test_02(self, mock_zhifu):
  20. '''测试支付失败场景'''
  21. # mock一个支付成功的数据
  22. mock_zhifu.return_value = {"result": "fail", "reason": "余额不足"}
  23. # 根据支付结果测试页面跳转
  24. statues = temple.zhifu_statues()
  25. self.assertEqual(statues, "支付失败")
  26. if __name__ == "__main__":
  27. unittest.main()

类和方法案例

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

  1. # 保存为temple.py
  2. # coding:utf-8
  3. class Zhifu():
  4. def zhifu(self):
  5. '''假设这里是一个支付的功能,未开发完
  6. 支付成功返回:{"result": "success", "reason":"null"}
  7. 支付失败返回:{"result": "fail", "reason":"余额不足"}
  8. reason返回失败原因
  9. '''
  10. pass
  11. class Statues():
  12. def zhifu_statues(self):
  13. '''根据支付的结果success or fail,判断跳转到对应页面'''
  14. result = Zhifu().zhifu()
  15. print(result)
  16. try:
  17. if result["result"] == "success":
  18. return "支付成功"
  19. elif result["result"] == "fail":
  20. print("失败原因:%s" % result["reason"])
  21. return "支付失败"
  22. else:
  23. return "未知错误异常"
  24. except:
  25. return "Error, 服务端返回异常!"

2.用例设计如下

  1. # coding:utf-8
  2. from unittest import mock
  3. import unittest
  4. from temple_class import Zhifu,Statues
  5. # 作者:上海-悠悠 QQ交流群:588402570
  6. class Test_zhifu_statues(unittest.TestCase):
  7. '''单元测试用例'''
  8. @mock.patch("temple_class.Zhifu")
  9. def test_01(self, mock_Zhifu):
  10. '''测试支付成功场景'''
  11. a = mock_Zhifu.return_value # 先返回实例,对类名称替换
  12. # 通过实例调用方法,再对方法的返回值替换
  13. a.zhifu.return_value = {"result": "success", "reason":"null"}
  14. # 根据支付结果测试页面跳转
  15. statues = Statues().zhifu_statues()
  16. print(statues)
  17. self.assertEqual(statues, "支付成功")
  18. @mock.patch("temple_class.Zhifu")
  19. def test_02(self, mock_Zhifu):
  20. '''测试支付失败场景'''
  21. b = mock_Zhifu.return_value # 先返回实例,对类名称替换
  22. # 通过实例调用方法,再对方法的返回值替换
  23. b.zhifu.return_value = {"result": "fail", "reason": "余额不足"}
  24. # 根据支付结果测试页面跳转
  25. statues = Statues().zhifu_statues()
  26. print(statues)
  27. self.assertEqual(statues, "支付失败")
  28. if __name__ == "__main__":
  29. 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. 如何把maven项目转为eclipse项目

    如何把maven项目转为eclipse项目,按照如下操作便可. 在cmd窗口, 载cmd窗口进入到maven项目所在目录下,输入如下命令: mvn eclipse:eclipse 这样便可.

  2. shell脚本报错:.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录

    .sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录 这是因为shell脚本是Windows下编辑的 格式不一样 执行 sed -i 's/\r$//' 脚本名称.sh

  3. SpringBoot 整合MinIO

    引入依赖 <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifact ...

  4. c++模板移除引用

    背景 一个函数内部需将函数内的一个变量转为其参数的类型, 函数的参数是引用 本文要演示的环境需要c++11支持(使用了新的关键字 using) 例如 get_value 内部将dobuble类型数据转 ...

  5. windows10源码编译llvm

    准备 cmake, 我目前使用的版本是3.18 llvm 源码, 我下载的是 11.0 我已经具备Vs2015和Vs2017的开发环境. debug模式编译需要较多内存和较多硬盘存储空间. (debu ...

  6. 【LeetCode】253. Meeting Rooms II 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序+堆 日期 题目地址:https://leetco ...

  7. 【九度OJ】题目1028:继续畅通工程 解题报告

    [九度OJ]题目1028:继续畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1028 题目描述: 省政府" ...

  8. 【操作系统】编程模拟FIFO,LRU,NUR,OPT页面置换算法

    #include<stdio.h> #include<stdlib.h> #include<time.h> #define random(x) (rand()%x) ...

  9. Contrastive Generative Adversarial Networks

    目录 概 主要内容 代码 Kang M., Park J. Contrastive Generative Adversarial Networks. arXiv preprint arXiv 2006 ...

  10. react中Fragment组件

    什么是Fragment?在我们定义组件的时候return里最外层包裹的div往往不想渲染到页面,那么就要用到我们的Fragment组件了,具体使用如下: import React, { Compone ...