本篇继续介绍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模块使用(二)的更多相关文章

  1. python mock模块使用(一)

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

  2. python标准模块(二)

    本文会涉及到的模块: json.pickle urllib.Requests xml.etree configparser shutil.zipfile.tarfile 1. json & p ...

  3. python常用模块(二)

    1.ConfigParser模块 用于生成和修改配置文档,在python3.x中变更为configparser 1 [DEFAULT] 2 ServerAliveInterval = 45 3 Com ...

  4. Python unittest模块心得(二)

    基础概念介绍请参看: http://www.cnblogs.com/frost-hit/p/8295818.html 组织测试用例 unittest.TestSuite(tests=()): 除了使用 ...

  5. Python学习笔记总结(二)函数和模块

    一.函数 函数的作用:可以计算出一个返回值,最大化代码重用,最小化代码冗余,流程的分解. 1.函数相关的语句和表达式 语句        例子 Calls        myfunc(‘diege', ...

  6. python基础-------模块与包(二)

    sys模块.logging模块.序列化 一.sys模块 sys.argv           命令行参数List,第一个元素是程序本身路径 sys.exit(n)        退出程序,正常退出时e ...

  7. 使用Python中的mock模块进行单元测试

    在进行单元测试的时候,有时候会遇到这种情况: 出于某些原因,我们不想测试某一部分内容,但是我们想要测试的部分却依赖这部分内容. 这时候,可以使用mock模块来模拟调用这部分内容,并给出返回结果,举例如 ...

  8. Python学习 :常用模块(二)

    常用模块(二) 四.os模块 os模块是与操作系统交互的一个接口,用于对操作系统进行调用 os.getcwd() # 提供当前工作目录 os.chdir() # 改变当前工作目录 os.curdir( ...

  9. python并发模块之concurrent.futures(二)

    python并发模块之concurrent.futures(二) 上次我们简单的了解下,模块的一些基本方法和用法,这里我们进一步对concurrent.futures做一个了解和拓展.上次的内容点这. ...

随机推荐

  1. Query on a tree again! SPOJ - QTREE3

    https://vjudge.net/problem/SPOJ-QTREE3 https://www.luogu.org/problemnew/show/P4116 一个log(LCT)比两个log( ...

  2. normal曲线绘制

      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...

  3. iOS UILabel UITextView自适应文本,或文本大小自适应

    //UILabel自适应文本的高度 UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(, , , )]; label.numberOf ...

  4. 用python编写的excel拆分小工具

    from datetime import date,datetime from openpyxl import Workbook from openpyxl import load_workbook ...

  5. 机器学习概念之特征选择(Feature selection)之RFormula算法介绍

    不多说,直接上干货! RFormula算法介绍: RFormula通过R模型公式来选择列.支持R操作中的部分操作,包括‘~’, ‘.’, ‘:’, ‘+’以及‘-‘,基本操作如下: 1. ~分隔目标和 ...

  6. [转]Android 完美退出 App (Exit)

    本文转自:http://blog.csdn.net/zeus_9i/article/details/7259881 最近两天为了解决Android上面退出程序问题折腾了半死,在google & ...

  7. oracle 数据导入、导出

    导入导出 --数据导出备份和导入 ------注意 导出和导入 必须是CMD 命令行下操作,而不是SQL编辑器中 --1.导出表 . --exp:导出关键字 ,userid:用户权限 ,file:保存 ...

  8. HttpMessageNotWritableException异常解决办法

    昨天做多对多的时遇到这个错误,网上找了一大堆,都没有解决掉,这个异常是说要解析的对象解析不了,就有可能该对象为null了,为了测试,我把数据库的数据都填上去    结果还是报错 看来是时候debug下 ...

  9. PE刷题记

    PE 中文翻译 最喜欢做这种很有意思的数学题了虽然数学很垃圾 但是这个网站的提交方式好鬼畜啊qwq 1.Multiples of 3 and 5 直接枚举 2.Even Fibonacci numbe ...

  10. Java并发编程之原子操作类

    什么是原子操作类当更新一个变量的时候,多出现数据争用的时候可能出现所意想不到的情况.这时的一般策略是使用synchronized解决,因为synchronized能够保证多个线程不会同时更新该变量.然 ...