patch簡介
unittest.mock.patch(target塑顺,new = DEFAULT嗅虏,spec = None末贾,create = False凝颇,spec_set = None筐钟,autospec = None揩瞪,new_callable = None,** kwargs )
target參數(shù)必須是一個(gè)str,格式為'package.module.ClassName'篓冲,
注意這里的格式一定要寫對李破,如果你的函數(shù)或類寫在pakege名稱為a下宠哄,b.py腳本里,有個(gè)c的函數(shù)(或類)嗤攻,那這個(gè)參數(shù)就寫“a.b.c”new參數(shù)如果沒寫毛嫉,默認(rèn)指定的是MagicMock
spec=True或spec_set=True,這會(huì)導(dǎo)致patch傳遞給被模擬為spec / spec_set的對象
new_callable允許您指定將被調(diào)用以創(chuàng)建新對象的不同類或可調(diào)用對象妇菱。默認(rèn)情況下MagicMock使用承粤。
案例講解
1、新建一個(gè)temple.py,寫入以下代碼:
# 保存為temple.py
# coding:utf-8
# 作者:上海-悠悠 QQ交流群:588402570
def zhifu():
'''假設(shè)這里是一個(gè)支付的功能,未開發(fā)完
支付成功返回:{"result": "success", "reason":"null"}
支付失敗返回:{"result": "fail", "reason":"余額不足"}
reason返回失敗原因
'''
pass
def zhifu_statues():
'''根據(jù)支付的結(jié)果success or fail闯团,判斷跳轉(zhuǎn)到對應(yīng)頁面'''
result = zhifu()
print(result)
try:
if result["result"] == "success":
return "支付成功"
elif result["result"] == "fail":
print("失敗原因:%s" % result["reason"])
return "支付失敗"
else:
return "未知錯(cuò)誤異常"
except:
return "Error, 服務(wù)端返回異常!"
2辛臊、用mock.patch實(shí)現(xiàn)如下:
# coding:utf-8
from unittest import mock
import unittest
import temple
class Test_zhifu_statues(unittest.TestCase):
'''單元測試用例'''
@mock.patch("temple.zhifu")
def test_01(self, mock_zhifu):
'''測試支付成功場景'''
# 方法一:mock一個(gè)支付成功的數(shù)據(jù)
# temple.zhifu = mock.Mock(return_value={"result": "success", "reason":"null"})
# 方法二:mock.path裝飾器模擬返回結(jié)果
mock_zhifu.return_value = {"result": "success", "reason":"null"}
# 根據(jù)支付結(jié)果測試頁面跳轉(zhuǎn)
statues = temple.zhifu_statues()
print(statues)
self.assertEqual(statues, "支付成功")
@mock.patch("temple.zhifu")
def test_02(self, mock_zhifu):
'''測試支付失敗場景'''
# mock一個(gè)支付成功的數(shù)據(jù)
mock_zhifu.return_value = {"result": "fail", "reason": "余額不足"}
# 根據(jù)支付結(jié)果測試頁面跳轉(zhuǎn)
statues = temple.zhifu_statues()
self.assertEqual(statues, "支付失敗")
if __name__ == "__main__":
unittest.main()
類和方法案例
1.如果前面的temple.py里面不是函數(shù),是寫的類和方法房交,如何去使用mock?
# 保存為temple.py
# coding:utf-8
# 作者:上海-悠悠 QQ交流群:588402570
class Zhifu():
def zhifu(self):
'''假設(shè)這里是一個(gè)支付的功能,未開發(fā)完
支付成功返回:{"result": "success", "reason":"null"}
支付失敗返回:{"result": "fail", "reason":"余額不足"}
reason返回失敗原因
'''
pass
class Statues():
def zhifu_statues(self):
'''根據(jù)支付的結(jié)果success or fail彻舰,判斷跳轉(zhuǎn)到對應(yīng)頁面'''
result = Zhifu().zhifu()
print(result)
try:
if result["result"] == "success":
return "支付成功"
elif result["result"] == "fail":
print("失敗原因:%s" % result["reason"])
return "支付失敗"
else:
return "未知錯(cuò)誤異常"
except:
return "Error, 服務(wù)端返回異常!"
2.用例設(shè)計(jì)如下
# coding:utf-8
from unittest import mock
import unittest
from temple_class import Zhifu,Statues
class Test_zhifu_statues(unittest.TestCase):
'''單元測試用例'''
@mock.patch("temple_class.Zhifu")
def test_01(self, mock_Zhifu):
'''測試支付成功場景'''
a = mock_Zhifu.return_value # 先返回實(shí)例,對類名稱替換
# 通過實(shí)例調(diào)用方法候味,再對方法的返回值替換
a.zhifu.return_value = {"result": "success", "reason":"null"}
# 根據(jù)支付結(jié)果測試頁面跳轉(zhuǎn)
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 # 先返回實(shí)例刃唤,對類名稱替換
# 通過實(shí)例調(diào)用方法,再對方法的返回值替換
b.zhifu.return_value = {"result": "fail", "reason": "余額不足"}
# 根據(jù)支付結(jié)果測試頁面跳轉(zhuǎn)
statues = Statues().zhifu_statues()
print(statues)
self.assertEqual(statues, "支付失敗")
if __name__ == "__main__":
unittest.main()
3.相當(dāng)于函數(shù)來說负溪,這里主要多一步透揣,要先對類的名稱進(jìn)行mock一次"a = mock_Zhifu.return_value",再通過實(shí)例去調(diào)用方法