封裝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()裝飾器html

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=1585826642code

相關文章
相關標籤/搜索