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

前言

上一篇python笔记23-unittest单元测试之mock对mock已经有初步的认识,
本篇继续介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创建模拟并将其传递到装饰函数
官方文档地址:https://docs.python.org/3/library/unittest.mock.html#the-patchers

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”,再通过实例去调用方法

(0)

相关推荐

  • [About China]Mati Temple

    ---------------- 今天给大家介绍的,还是甘肃的一个地方,叫马蹄寺. ---------------- Mati Temple The name "Mati" lit ...

  • 接口自动化

    一.自动化分类 (1)接口自动化 > python/java+requests+unittest框架来实现 > python/java+RF(RobotFramework)框架来实现--对 ...

  • The Giant Buddha Temple(张掖大佛寺)

    英文系列在每周一晚推送: 点击文章最下方的"阅读原文"(Read more)可链接到我们英文网站的原文页面. 据说暑期流行丝绸之路的游学活动(今年大概是难了),我们就从丝路上的重要 ...

  • 自动化搭建环境及基础理论

    在dos命令中输入python,在dos命令中输入pip Pip是Python官方推荐的包管理工具,提供了对Python包的查找.下载.安装.卸载的功能,属于python的一部分. Python3.0 ...

  • The Bingling Temple Grottoes(炳灵寺石窟)

    英文系列在每周一晚推送: 点击文章最下方的"阅读原文"(Read more)可链接到我们英文网站的原文页面. 第一季<丝绸之路>,我们从丝路上的重要地点开始介绍,希望能 ...

  • Da Ci’en Temple (大慈恩寺)

    英文文章系列又回来了,计划在每周一推送一篇: 点击文章最下方的"阅读原文"(Read more)可链接到我们英文网站的原文页面. 最近看丝绸之路的游学旅行宣传很火,那我们就从丝路上 ...

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

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

  • 完整版Python笔记|超级有用

    完整版Python笔记|超级有用

  • 胡希恕伤寒论学习笔记——24

    24.太阳病,初服桂枝汤,反烦不解者,先刺风池.风府,却与桂枝汤则愈. 太阳中风,一般情况下使用桂枝汤治疗是正确的,但是这位病家服用桂枝汤以后,反倒出现了心烦,并且疾病也没有痊愈,这种情况正确的治疗应 ...

  • 【python笔记】python java 语法,对比学习

    【python笔记】python java 语法,对比学习

  • python笔记2-冒泡排序

    前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序. 一.基本原理 1.概念: 冒泡排序(Bubble Sort),是一种 ...

  • python笔记3-发送邮件(smtplib)

    前言 本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件,可以发给多个收件人,专治各种不行,总之看完这篇麻麻再也不用担心我的邮件收不到了. 以下代码兼容python2和python3, ...

  • python笔记4-遍历文件夹目录os.walk()

    前言 如何遍历查找出某个文件夹内所有的子文件呢?并且找出某个后缀的所有文件 一.walk功能简介 1.os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下. 2.walk( ...

  • python笔记5-python2写csv文件中文乱码问题

    前言 python2最大的坑在于中文编码问题,遇到中文报错首先加u,再各种encode.decode. 当list.tuple.dict里面有中文时,打印出来的是Unicode编码,这个是无解的. 对 ...

  • python笔记6-%u60A0和\u60a0类似unicode解码

    前言 有时候从接口的返回值里面获取到的是类似"%u4E0A%u6D77%u60A0%u60A0"这种格式的编码,不是python里面的unicode编码. python里面的uni ...