文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

封装mock

2023-06-02 06:11

关注

1.patch装饰器的概念

  • patch装饰器是mock第二种实现数据模拟的方式,patch()充当函数装饰器,类装饰器或上下文管理器,可用于处理测试范围内的修补模块和类级属性;

2.patch装饰器语法

  • 语法:unittest.mock.patch(target,new = DEFAULT,spec = None,create = False,spec_set = None,autospec = None,new_callable = None,** kwarg )

  • 参数target 为’package.module.classname’格式的字符串,如果参数new被省略,那么target 被MagicMock代替;

  • 如果patch()用作装饰器并且省略new,则创建的mock将作为额外参数传递给装饰函数,如果patch()用作上下文管理器,则上下文管理器返回创建的mock;

  • New_Callable参数允许指定将被调用以创建新对象的其他类或可调用对象,默认情况下,使用magicMock。

3.patch装饰器实现数据模拟

修改Test.py文件中的TestData类,在测试用例前加上一个@mock.patch()装饰器

from unittest import mockfrom unittest import TestCaseimport unittestimport function1class TestData(TestCase):    # patch装饰器    @mock.patch('function1.data_parse')    def test_print1(self, mock_data_parse):        mock_data_parse.return_value = {"result": "success", "reason":"null"}        statues = function1.data_show()        print(statues)        self.assertEqual(statues, "data parse success")    @mock.patch('function1.data_parse')    def test_print2(self, data_parse):        data_parse.return_value = {"result": "fail", "reason": "Data Error"}        statues = function1.data_show()        self.assertEqual(statues, "data parse failed")if __name__ == "__main__":    unittest.main()

我们这里模拟的是函数中的数据,如果需要mock的数据是一个类中方法的数据,写法也是一样的,比如function1.py模块中的代码是:

class DataParse:    def data_parse(self):        passclass DataShow:    def data_show(self):        ret = DataParse().data_parse()        try:            if ret.get('result') == "success":                return "data parse success"            elif ret.get('result') == "fail":                print("data parse failed: {}".format(ret.get('reason')))                return "data parse failed"            else:                return "Unknow Reason"        except:            return "Server Unknow Reason"

那Test.py文件中的代码可以这样写:

from unittest import mockfrom unittest import TestCaseimport unittestfrom function1 import DataParse, DataShowclass TestData(TestCase):    # patch装饰器    @mock.patch('function1.DataParse')    def test_print1(self, mock_DataParse):        # 先拿到类的mock实例        dataParse = mock_DataParse.return_value        # 在通过类的mock实例调用方法,对方法返回值进行mock        dataParse.data_parse.return_value = {"result": "success", "reason":"null"}        # 调用data_show        statues = DataShow().data_show()        print(statues)        self.assertEqual(statues, "data parse success")    @mock.patch('function1.DataParse')    def test_print2(self, mock_DataParse):        # 先拿到类的mock实例        dataParse = mock_DataParse.return_value        # 在通过类的mock实例调用方法,对方法返回值进行mock        dataParse.data_parse.return_value = {"result": "fail", "reason": "Data Error"}        # 调用data_show        statues = DataShow().data_show()        print(statues)        self.assertEqual(statues, "data parse failed")if __name__ == "__main__":    unittest.main()=========输出=============data parse successdata parse failed: Data Errordata parse failed

步骤

  • 首先使用@mock.patch()装饰器来装饰你要使用的测试用例,@mock.patch()中需要带一个参数,指定需要mock的函数或者类,和这个类所在的包和模块,例如:@mock.patch(''function1.data_parse''),表示给一个在function1模块中的data_parse函数mock数据;

  • 然后在测试用例中接受一个参数,这个参数是mock哪个函数,就在函数名前加一个mock,例如给data_parse函数mock数据,这个参数名就是mock_data_parse

  • 有了这个参数之后就可以给mock的函数的return_value赋值了。最后就可以进行断言,运行测试了;

参考:https://www.9xkd.com/user/plan-view.html?id=1585826642

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯