欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python之mock模塊基本使用方法詳解

系統(tǒng) 1621 0

mock簡(jiǎn)介

mock原是python的第三方庫(kù)

python3以后mock模塊已經(jīng)整合到了unittest測(cè)試框架中,不用再單獨(dú)安裝

Mock這個(gè)詞在英語(yǔ)中有模擬的意思,因此我們可以猜測(cè)出這個(gè)庫(kù)的主要功能是模擬一些東西

準(zhǔn)確的說(shuō),Mock是Python中一個(gè)用于支持單元測(cè)試的庫(kù),它的主要功能是使用mock對(duì)象替代掉指定的Python對(duì)象,以達(dá)到模擬對(duì)象的行為

既然mock已經(jīng)被整合到了unittest單元測(cè)試框架中,可想而知mock的目的就是為了讓我們更好的進(jìn)行測(cè)試

mock作用

1. 解決依賴問(wèn)題:當(dāng)我們測(cè)試一個(gè)接口或者功能模塊的時(shí)候,如果這個(gè)接口或者功能模塊依賴其他接口或其他模塊,那么如果所依賴的接口或功能模塊未開(kāi)發(fā)完畢,那么我們就可以

使用mock模擬被依賴接口,完成目標(biāo)接口的測(cè)試

2. 單元測(cè)試:如果某個(gè)功能未開(kāi)發(fā)完成,我們又要進(jìn)行測(cè)試用例的代碼編寫,我們也可以先模擬這個(gè)功能進(jìn)行測(cè)試

3. 模擬復(fù)雜業(yè)務(wù)的接口:實(shí)際工作中如果我們?cè)跍y(cè)試一個(gè)接口功能時(shí),如果這個(gè)接口依賴一個(gè)非常復(fù)雜的接口業(yè)務(wù),那么我們完全可以使用mock來(lái)模擬這個(gè)復(fù)雜的業(yè)務(wù)接口,其實(shí)

這個(gè)和解決接口依賴是一樣的原理

4.前后端聯(lián)調(diào):如果你是一個(gè)前端頁(yè)面開(kāi)發(fā),現(xiàn)在需要開(kāi)發(fā)一個(gè)功能:根據(jù)后臺(tái)返回的狀態(tài)展示不同的頁(yè)面,那么你就需要調(diào)用后臺(tái)的接口,但是后臺(tái)接口還未開(kāi)發(fā)完成,是不是你

就停止這部分工作呢?答案是否定的,你完全可以借助mock來(lái)模擬后臺(tái)這個(gè)接口返回你想要的數(shù)據(jù)

mock安裝

python 3 的mock模塊已經(jīng)被整合到了unittest框架中,所以你使用的時(shí)候只需要在文件開(kāi)頭from unittest import mock 導(dǎo)入即可

如果你使用的是python2 那么你需要執(zhí)行pip install mock安裝后再 import mock即可

mock實(shí)例

一個(gè)未開(kāi)發(fā)完成的功能如何測(cè)試?

假如們現(xiàn)在有一個(gè)實(shí)現(xiàn)兩個(gè)數(shù)相加的功能需要編寫測(cè)試用例,但是由于開(kāi)發(fā)進(jìn)度緩慢,只搭兩個(gè)簡(jiǎn)單的框架,并沒(méi)有內(nèi)部實(shí)現(xiàn)

            
"""
------------------------------------
@Time : 2019/6/26 14:09
@Auth : linux超
@File : ClassFunc.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ : 28174043@qq.com
@GROUP: 878565760
------------------------------------
"""
import unittest
from unittest import mock
class SubClass(object):
def add(self, a, b):
"""兩個(gè)數(shù)相加"""
pass
class TestSub(unittest.TestCase):
  """測(cè)試兩個(gè)數(shù)相加用例"""
def test_sub(self):
sub = SubClass() # 初始化被測(cè)函數(shù)類實(shí)例
sub.add = mock.Mock(return_value=10) # mock add方法 返回10
result = sub.add(5, 5) # 調(diào)用被測(cè)函數(shù)
self.assertEqual(result, 10) # 斷言實(shí)際結(jié)果和預(yù)期結(jié)果
if __name__ == '__main__':
unittest.main()
          

測(cè)試結(jié)果

            
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Process finished with exit code 
          

測(cè)試結(jié)果顯示,測(cè)試用例執(zhí)行已經(jīng)通過(guò)

實(shí)際上mock模擬add方法的原理是 使用相同的對(duì)象方法接收mock的對(duì)象(使用sub.add接收),那么當(dāng)mock對(duì)象被調(diào)用時(shí)(sub.add())就會(huì)返回return_value參數(shù)對(duì)應(yīng)的數(shù)據(jù)

這樣一來(lái),表面看起來(lái)就是模擬了add方法(這里只是我個(gè)人理解,不對(duì)請(qǐng)忽略)

你可以做一個(gè)實(shí)驗(yàn),把用例中的add改成別的名字也一樣可以測(cè)試通過(guò)

ok,繼續(xù)

我們用例編寫完了,而且開(kāi)發(fā)既然也把功能開(kāi)發(fā)完了(要罵街嗎?),既然真實(shí)的功能已經(jīng)可以測(cè)試了,那么我們?cè)趺丛谏厦嬗美幕A(chǔ)上直接測(cè)試真實(shí)功能呢?

完整的功能如何測(cè)試?

我們把用例的代碼稍做修改

            
"""
------------------------------------
@Time : 2019/6/26 14:09
@Auth : linux超
@File : ClassFunc.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ : 28174043@qq.com
@GROUP: 878565760
------------------------------------
"""
import unittest
from unittest import mock
class SubClass(object):
def add(self, a, b):
"""兩個(gè)數(shù)相加"""
return a + b
class TestSub(unittest.TestCase):
"""測(cè)試兩個(gè)數(shù)相加"""
def test_sub(self):
sub = SubClass() # 初始化被測(cè)函數(shù)類實(shí)例
sub.add = mock.Mock(return_value=10, side_effect=sub.add) # 傳遞side_effect關(guān)鍵字參數(shù), 會(huì)覆蓋return_value參數(shù)值, 使用真實(shí)的add方法測(cè)試
result = sub.add(5, 11) # 真正的調(diào)用被測(cè)函數(shù)
self.assertEqual(result, 16) # 斷言實(shí)際結(jié)果和預(yù)期結(jié)果
if __name__ == '__main__':
unittest.main()
          

side_effect參數(shù)

代碼中我們給Mock方法添加了另一個(gè)關(guān)鍵字參數(shù)side_effect = sub.add, 這個(gè)參數(shù)和return_value 正好相反,當(dāng)傳遞這個(gè)參數(shù)的時(shí)候return_value 參數(shù)就會(huì)失效

而side_effect生效,這里我給的參數(shù)值是sub.add 相當(dāng)于add方法的地址,那么當(dāng)調(diào)用add方法時(shí)就會(huì)真實(shí)的使用add方法,也就達(dá)到了我們測(cè)試實(shí)際的add 方法。

你也可以理解為當(dāng)傳遞了side_effect參數(shù)且值為被測(cè)方法地址時(shí),mock就不會(huì)起作用

side_effect接收的是一個(gè)可迭代序列,當(dāng)傳遞多個(gè)值時(shí),那么每次調(diào)用mock時(shí)會(huì)返回不同的值

            
mock_obj = mock.Mock(side_effect= [1,2,3])
print(mock_obj())
print(mock_obj())
print(mock_obj())
print(mock_obj())
輸出
Traceback (most recent call last):
1
File "D:/MyThreading/mymock.py", line 37, in 
            
              
2
print(mock_obj())
3
File "C:\Python36\lib\unittest\mock.py", line 939, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "C:\Python36\lib\unittest\mock.py", line 998, in _mock_call
result = next(effect)
StopIteration
Process finished with exit code 1
            
          

當(dāng)所有值被取完后就會(huì)報(bào)錯(cuò)(這個(gè)地方有點(diǎn)類似生成器的原理)

存在依賴關(guān)系的功能如何測(cè)試?

假設(shè)有這樣一個(gè)場(chǎng)景:我們要測(cè)試一個(gè)支付接口但是這個(gè)支付接口又依賴一個(gè)第三方支付接口,那么第三方支付接口我們暫時(shí)沒(méi)有權(quán)限使用,那么我們?cè)撊绾螠y(cè)試我們自己這個(gè)接口呢?

看下面的實(shí)例

假設(shè)第三方接口和我們自己的支付接口如下

            
"""
------------------------------------
@Time : 2019/6/26 15:09
@Auth : linux超
@File : PayMent.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ : 28174043@qq.com
@GROUP: 878565760
------------------------------------
"""
import requests
class PayApi(object):
@staticmethod
def auth(card, amount):
"""
第三方支付接口
:param card: 卡號(hào)
:param amount: 支付金額
:return:
"""
pay_url = "http://www.zhifubao.com" # 第三方支付接口地址
data = {"card": card, "amount": amount}
response = requests.post(pay_url, data=data) # 請(qǐng)求第三方支付接口
return response # 返回狀態(tài)碼
def pay(self, user_id, card, amount):
"""
我們自己的支付接口
:param user_id: 用戶id
:param card: 卡號(hào)
:param amount: 支付金額
:return:
"""
 # 調(diào)用第三方支付接口
response = self.auth(card, amount)
try:
if response['status_code'] == '200':
print('用戶{}支付金額{}成功'.format(user_id, amount))
return '支付成功'
elif response['status_code'] == '500':
print('用戶{}支付失敗, 金額不變'.format(user_id))
return '支付失敗'
else:
return '未知錯(cuò)誤'
except Exception:
return "Error, 服務(wù)器異常!"
if __name__ == '__main__':
pass
          

很明顯第三方支付接口是無(wú)法訪問(wèn)的,因?yàn)榻涌诘牡刂肥俏褼IY的,為了模擬實(shí)際中我們無(wú)法使用的第三方支付接口

編寫測(cè)試用例

            
"""
------------------------------------
@Time : 2019/6/26 15:22
@Auth : linux超
@File : testpay.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ : 28174043@qq.com
@GROUP: 878565760
------------------------------------
"""
import unittest
from unittest import mock
from payment.PayMent import PayApi
class TestPayApi(unittest.TestCase):
def test_success(self):
pay = PayApi()
pay.auth = mock.Mock(return_value={'status_code':'200'})
status = pay.pay('1000', '12345', '10000')
self.assertEqual(status, '支付成功')
def test_fail(self):
pay = PayApi()
pay.auth = mock.Mock(return_value={'status_code':'500'})
status = pay.pay('1000', '12345', '10000')
self.assertEqual(status, '支付失敗')
def test_error(self):
pay = PayApi()
pay.auth = mock.Mock(return_value={'status_code':'300'})
status = pay.pay('1000', '12345', '10000')
self.assertEqual(status, '未知錯(cuò)誤')
def test_exception(self):
pay = PayApi()
pay.auth = mock.Mock(return_value='200')
status = pay.pay('1000', '12345', '10000')
self.assertEqual(status, 'Error, 服務(wù)器異常!')
if __name__ == '__main__':
unittest.main()
          

測(cè)試輸出結(jié)果

            
....用戶1000支付失敗, 金額不變
用戶1000支付金額10000成功
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
Process finished with exit code 0
          

從執(zhí)行結(jié)果可以看出,即使第三方支付接口無(wú)法使用,但是我們自己的支付接口仍然測(cè)試通過(guò)了

也許有人會(huì)問(wèn),第三方支付都不能用,我們的測(cè)試結(jié)果是否是有效的呢?

通常我們?cè)跍y(cè)試一個(gè)模塊的時(shí)候,我們是可以認(rèn)為其他模塊的功能是正常的,只針對(duì)目標(biāo)模塊進(jìn)行測(cè)試是沒(méi)有任何問(wèn)題的,所以說(shuō)測(cè)試結(jié)果也是正確的

其實(shí)上述代碼還可以使用另一種方式來(lái)寫

mock對(duì)象的方法

            
"""
------------------------------------
@Time : 2019/6/26 15:22
@Auth : linux超
@File : testpay.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ : 28174043@qq.com
@GROUP: 878565760
------------------------------------
"""
import unittest
from unittest import mock
from unittest.mock import patch
from payment.PayMent import PayApi
class TestPayApi(unittest.TestCase):
def setUp(self):self.pay = PayApi()
@patch.object(PayApi, 'auth')
def test_success(self, mock_auth):
mock_auth.return_value = {'status_code':'200'}
status = self.pay.pay('1000', '12345', '10000')
self.assertEqual(status, '支付成功')
@patch.object(PayApi, 'auth')
def test_fail(self, mock_auth):
mock_auth.return_value={'status_code':'500'}
status = self.pay.pay('1000', '12345', '10000')
self.assertEqual(status, '支付失敗')
@patch.object(PayApi, 'auth')
def test_error(self, mock_auth):
mock_auth.return_value={'status_code':'300'}
status = self.pay.pay('1000', '12345', '10000')
self.assertEqual(status, '未知錯(cuò)誤')
@patch.object(PayApi, 'auth')
def test_exception(self, mock_auth):
mock_auth.return_value='200'
status = self.pay.pay('1000', '12345', '10000')
self.assertEqual(status, 'Error, 服務(wù)器異常!')
if __name__ == '__main__':
unittest.main()
          

還有mock一個(gè)普通函數(shù),mock多個(gè)方法等,這里先不贅述,寫法和上面實(shí)例差不多

最后

mock還有很多自帶的功能方法

且mock功能很強(qiáng)大,也不是一句兩句話就能說(shuō)完了,本篇文章主要介紹了mock的基本使用方法,甚是簡(jiǎn)單,對(duì)于實(shí)際中如何應(yīng)用,如何掌握更強(qiáng)大的方法還需自己慢慢摸索

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲欧洲视频在线观看 | 日日爱夜夜操 | 青娱乐免费视频 | 欧美日韩一区二区三区高清不卡 | 青娱乐在线免费 | 久久精品视频在线看99 | 黄毛片视频 | 天天躁夜夜躁很很躁麻豆 | 欧美精品福利视频 | 男女无遮挡高清性视频直播 | 亚洲精品久久久蜜桃 | 成人性爱视频在线观看 | 欧美日韩精品一区二区三区视频 | 小视频网站 | 国产欧美一区二区三区久久人妖 | 久久亚洲网 | 丁香婷婷亚洲六月综合色 | 99视频在线观看视频一区 | 亚洲乱码视频在线观看 | 国产精品久久久久久久久久久久久 | 欧美69视频在线 | 成人免费毛片片v | 国产欧美日韩精品一区 | 日本欧美一区二区三区视频 | 国产精品毛片久久久久久 | www.9cao | 日韩在线视频一区 | 六月婷婷综合激情 | 免费v片 | 国产精品精品 | se视频在线观看 | 日本免费观看网站 | 精品久久久久久无码中文字幕 | 91你懂的| 成人精品鲁一区一区二区 | 国产一区在线免费 | 成人精品国产 | 久久国产精品一区二区 | 日本高清18xxxx | 亚洲午夜av | 性欧美18一19sex性高清播放 |