封装mock

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 mock
from unittest import TestCase
import unittest
import function1
class 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):
        pass
class 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 mock
from unittest import TestCase
import unittest
from function1 import DataParse, DataShow
class 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 success
data parse failed: Data Error
data 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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69908432/viewspace-2647837/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/69908432/viewspace-2647837/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值