亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2019年06月27日 09:11:35   作者:linux超  
這篇文章主要介紹了python之mock模塊基本使用方法詳解,Mock是Python中一個用于支持單元測試的庫,它的主要功能是使用mock對象替代掉指定的Python對象,以達(dá)到模擬對象的行為,需要的朋友可以參考下

mock簡介

mock原是python的第三方庫

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

Mock這個詞在英語中有模擬的意思,因此我們可以猜測出這個庫的主要功能是模擬一些東西

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

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

mock作用

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

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

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

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

這個和解決接口依賴是一樣的原理

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

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

mock安裝

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

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

mock實例

一個未開發(fā)完成的功能如何測試?

假如們現(xiàn)在有一個實現(xiàn)兩個數(shù)相加的功能需要編寫測試用例,但是由于開發(fā)進度緩慢,只搭兩個簡單的框架,并沒有內(nèi)部實現(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):
"""兩個數(shù)相加"""
pass
class TestSub(unittest.TestCase):
  """測試兩個數(shù)相加用例"""
def test_sub(self):
sub = SubClass() # 初始化被測函數(shù)類實例
sub.add = mock.Mock(return_value=10) # mock add方法 返回10
result = sub.add(5, 5) # 調(diào)用被測函數(shù)
self.assertEqual(result, 10) # 斷言實際結(jié)果和預(yù)期結(jié)果
if __name__ == '__main__':
unittest.main()

測試結(jié)果

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

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

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

這樣一來,表面看起來就是模擬了add方法(這里只是我個人理解,不對請忽略)

你可以做一個實驗,把用例中的add改成別的名字也一樣可以測試通過

ok,繼續(xù)

我們用例編寫完了,而且開發(fā)既然也把功能開發(fā)完了(要罵街嗎?),既然真實的功能已經(jīng)可以測試了,那么我們怎么在上面用例的基礎(chǔ)上直接測試真實功能呢?

完整的功能如何測試?

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

"""
------------------------------------
@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):
"""兩個數(shù)相加"""
return a + b
class TestSub(unittest.TestCase):
"""測試兩個數(shù)相加"""
def test_sub(self):
sub = SubClass() # 初始化被測函數(shù)類實例
sub.add = mock.Mock(return_value=10, side_effect=sub.add) # 傳遞side_effect關(guān)鍵字參數(shù), 會覆蓋return_value參數(shù)值, 使用真實的add方法測試
result = sub.add(5, 11) # 真正的調(diào)用被測函數(shù)
self.assertEqual(result, 16) # 斷言實際結(jié)果和預(yù)期結(jié)果
if __name__ == '__main__':
unittest.main()

side_effect參數(shù)

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

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

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

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

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 <module>
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)所有值被取完后就會報錯(這個地方有點類似生成器的原理)

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

假設(shè)有這樣一個場景:我們要測試一個支付接口但是這個支付接口又依賴一個第三方支付接口,那么第三方支付接口我們暫時沒有權(quán)限使用,那么我們該如何測試我們自己這個接口呢?

看下面的實例

假設(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: 卡號
:param amount: 支付金額
:return:
"""
pay_url = "http://www.zhifubao.com" # 第三方支付接口地址
data = {"card": card, "amount": amount}
response = requests.post(pay_url, data=data) # 請求第三方支付接口
return response # 返回狀態(tài)碼
def pay(self, user_id, card, amount):
"""
我們自己的支付接口
:param user_id: 用戶id
:param card: 卡號
: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 '未知錯誤'
except Exception:
return "Error, 服務(wù)器異常!"
if __name__ == '__main__':
pass

很明顯第三方支付接口是無法訪問的,因為接口的地址是我DIY的,為了模擬實際中我們無法使用的第三方支付接口

編寫測試用例

"""
------------------------------------
@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, '未知錯誤')
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()

測試輸出結(jié)果

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

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

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

通常我們在測試一個模塊的時候,我們是可以認(rèn)為其他模塊的功能是正常的,只針對目標(biāo)模塊進行測試是沒有任何問題的,所以說測試結(jié)果也是正確的

其實上述代碼還可以使用另一種方式來寫

mock對象的方法

"""
------------------------------------
@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, '未知錯誤')
@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一個普通函數(shù),mock多個方法等,這里先不贅述,寫法和上面實例差不多

最后

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

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

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

相關(guān)文章

  • pytorch無法使用GPU問題的解決方法

    pytorch無法使用GPU問題的解決方法

    這篇文章主要介紹了如何解決pytorch 無法使用GPU 的問題,文中通過代碼和圖文給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Python實現(xiàn)多線程抓取網(wǎng)頁功能實例詳解

    Python實現(xiàn)多線程抓取網(wǎng)頁功能實例詳解

    這篇文章主要介紹了Python實現(xiàn)多線程抓取網(wǎng)頁功能,結(jié)合具體實例形式詳細(xì)分析了Python多線程編程的相關(guān)操作技巧與注意事項,并附帶demo實例給出了多線程抓取網(wǎng)頁的實現(xiàn)方法,需要的朋友可以參考下
    2017-06-06
  • Python中g(shù)event模塊協(xié)程使用

    Python中g(shù)event模塊協(xié)程使用

    協(xié)程是一種用戶態(tài)的輕量級線程,本文主要介紹了Python中g(shù)event模塊協(xié)程使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • 基于python讀取.mat文件并取出信息

    基于python讀取.mat文件并取出信息

    這篇文章主要介紹了基于python讀取.mat文件并取出信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • 基于Python實現(xiàn)繪制一個足球

    基于Python實現(xiàn)繪制一個足球

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實現(xiàn)繪制一個簡單的足球,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以嘗試一下
    2023-02-02
  • Python中使用插入排序算法的簡單分析與代碼示例

    Python中使用插入排序算法的簡單分析與代碼示例

    這篇文章主要介紹了Python使用插入排序算法的簡單分析與代碼示例,插入算法的平均時間復(fù)雜度為O(n^2),需要的朋友可以參考下
    2016-05-05
  • 關(guān)于Python的一些學(xué)習(xí)總結(jié)

    關(guān)于Python的一些學(xué)習(xí)總結(jié)

    這篇文章主要介紹了關(guān)于Python的一些總結(jié),希望自己以后在學(xué)習(xí)Python的過程中可以邊學(xué)習(xí)邊總結(jié),就自己之前的學(xué)習(xí)先做以總結(jié),之后將不斷總結(jié)更新
    2018-05-05
  • python線程啟動的四種方式總結(jié)

    python線程啟動的四種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于python線程啟動的四種方式,線程可以完成一定任務(wù),可以和其它線程共享父進程的共享變量和部分環(huán)境,相互協(xié)作來完成任務(wù),需要的朋友可以參考下
    2024-01-01
  • Python使用海龜繪圖實現(xiàn)貪吃蛇游戲

    Python使用海龜繪圖實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了Python使用海龜繪圖實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Python 數(shù)據(jù)科學(xué) Matplotlib圖庫詳解

    Python 數(shù)據(jù)科學(xué) Matplotlib圖庫詳解

    Matplotlib 是 Python 的二維繪圖庫,用于生成符合出版質(zhì)量或跨平臺交互環(huán)境的各類圖形。今天通過本文給大家分享Python 數(shù)據(jù)科學(xué) Matplotlib的相關(guān)知識,感興趣的朋友一起看看吧
    2021-07-07

最新評論