欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python如何在單元測試中給對象打補丁

 更新時間:2020年08月03日 11:11:21   作者:David Beazley  
這篇文章主要介紹了Python如何在單元測試中給對象打補丁,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下

問題

你寫的單元測試中需要給指定的對象打補丁, 用來斷言它們在測試中的期望行為(比如,斷言被調用時的參數(shù)個數(shù),訪問指定的屬性等)。

解決方案

unittest.mock.patch() 函數(shù)可被用來解決這個問題。 patch() 還可被用作一個裝飾器、上下文管理器或單獨使用,盡管并不常見。 例如,下面是一個將它當做裝飾器使用的例子:

from unittest.mock import patch
import example

@patch('example.func')
def test1(x, mock_func):
  example.func(x)    # Uses patched example.func
  mock_func.assert_called_with(x)

它還可以被當做一個上下文管理器:

with patch('example.func') as mock_func:
  example.func(x)   # Uses patched example.func
  mock_func.assert_called_with(x)

最后,你還可以手動的使用它打補丁:

p = patch('example.func')
mock_func = p.start()
example.func(x)
mock_func.assert_called_with(x)
p.stop()

如果可能的話,你能夠疊加裝飾器和上下文管理器來給多個對象打補丁。例如:

@patch('example.func1')
@patch('example.func2')
@patch('example.func3')
def test1(mock1, mock2, mock3):
  ...

def test2():
  with patch('example.patch1') as mock1, \
     patch('example.patch2') as mock2, \
     patch('example.patch3') as mock3:
  ...

討論

patch() 接受一個已存在對象的全路徑名,將其替換為一個新的值。 原來的值會在裝飾器函數(shù)或上下文管理器完成后自動恢復回來。 默認情況下,所有值會被 MagicMock 實例替代。例如:

>>> x = 42
>>> with patch('__main__.x'):
...   print(x)
...
<MagicMock name='x' id='4314230032'>
>>> x
42
>>>

不過,你可以通過給 patch() 提供第二個參數(shù)來將值替換成任何你想要的:

>>> x
42
>>> with patch('__main__.x', 'patched_value'):
...   print(x)
...
patched_value
>>> x
42
>>>

被用來作為替換值的 MagicMock 實例能夠模擬可調用對象和實例。 他們記錄對象的使用信息并允許你執(zhí)行斷言檢查,例如:

>>> from unittest.mock import MagicMock
>>> m = MagicMock(return_value = 10)
>>> m(1, 2, debug=True)
10
>>> m.assert_called_with(1, 2, debug=True)
>>> m.assert_called_with(1, 2)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File ".../unittest/mock.py", line 726, in assert_called_with
  raise AssertionError(msg)
AssertionError: Expected call: mock(1, 2)
Actual call: mock(1, 2, debug=True)
>>>

>>> m.upper.return_value = 'HELLO'
>>> m.upper('hello')
'HELLO'
>>> assert m.upper.called

>>> m.split.return_value = ['hello', 'world']
>>> m.split('hello world')
['hello', 'world']
>>> m.split.assert_called_with('hello world')
>>>

>>> m['blah']
<MagicMock name='mock.__getitem__()' id='4314412048'>
>>> m.__getitem__.called
True
>>> m.__getitem__.assert_called_with('blah')
>>>

一般來講,這些操作會在一個單元測試中完成。例如,假設你已經(jīng)有了像下面這樣的函數(shù):

# example.py
from urllib.request import urlopen
import csv

def dowprices():
  u = urlopen('http://finance.yahoo.com/d/quotes.csv?s=@^DJI&f=sl1')
  lines = (line.decode('utf-8') for line in u)
  rows = (row for row in csv.reader(lines) if len(row) == 2)
  prices = { name:float(price) for name, price in rows }
  return prices

正常來講,這個函數(shù)會使用 urlopen() 從Web上面獲取數(shù)據(jù)并解析它。 在單元測試中,你可以給它一個預先定義好的數(shù)據(jù)集。下面是使用補丁操作的例子:

import unittest
from unittest.mock import patch
import io
import example

sample_data = io.BytesIO(b'''\
"IBM",91.1\r
"AA",13.25\r
"MSFT",27.72\r
\r
''')

class Tests(unittest.TestCase):
  @patch('example.urlopen', return_value=sample_data)
  def test_dowprices(self, mock_urlopen):
    p = example.dowprices()
    self.assertTrue(mock_urlopen.called)
    self.assertEqual(p,
             {'IBM': 91.1,
             'AA': 13.25,
             'MSFT' : 27.72})

if __name__ == '__main__':
  unittest.main()

本例中,位于 example 模塊中的 urlopen() 函數(shù)被一個模擬對象替代, 該對象會返回一個包含測試數(shù)據(jù)的 ByteIO()

還有一點,在打補丁時我們使用了 example.urlopen 來代替 urllib.request.urlopen 。 當你創(chuàng)建補丁的時候,你必須使用它們在測試代碼中的名稱。 由于測試代碼使用了 from urllib.request import urlopen ,那么 dowprices() 函數(shù) 中使用的 urlopen() 函數(shù)實際上就位于 example 模塊了。

本節(jié)實際上只是對 unittest.mock 模塊的一次淺嘗輒止。 更多更高級的特性,請參考 官方文檔

以上就是Python如何在單元測試中給對象打補丁的詳細內容,更多關于Python 單元測試的資料請關注腳本之家其它相關文章!

相關文章

  • 使用 Python 查找本月的最后一天的方法匯總

    使用 Python 查找本月的最后一天的方法匯總

    這篇文章主要介紹了使用 Python 查找本月的最后一天,在本文中,我們學習了使用 datetime 和 calendar 等內置庫以及 arrow 和 pandas 等第三方庫在 Python 中查找月份最后一天的各種方法,需要的朋友可以參考下
    2023-05-05
  • 計算機二級python學習教程(2) python語言基本語法元素

    計算機二級python學習教程(2) python語言基本語法元素

    這篇文章主要為大家詳細介紹了計算機二級python學習教程的第2篇,Python語言基本語法元素,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Python列表和集合的效率大比拼

    Python列表和集合的效率大比拼

    程序的運行效率分為兩種:第一種是時間效率,第二種是空間效率,這篇文章主要介紹了Python列表和集合的效率對比,需要的朋友可以參考下
    2022-07-07
  • Python中的異常處理詳解

    Python中的異常處理詳解

    這篇文章主要介紹了Python中的異常處理詳解,在編寫Python程序時,經(jīng)常會遇到各種運行時錯誤,這些錯誤會導致程序終止并拋出異常。然而,有時我們希望程序能優(yōu)雅地處理這些錯誤,而不是直接崩潰,這就需要用到異常處理了,需要的朋友可以參考下
    2023-07-07
  • python cx_Oracle模塊的安裝和使用詳細介紹

    python cx_Oracle模塊的安裝和使用詳細介紹

    這篇文章主要介紹了python cx_Oracle模塊的安裝和使用詳細介紹的相關資料,需要的朋友可以參考下
    2017-02-02
  • python隨機生成庫faker庫api實例詳解

    python隨機生成庫faker庫api實例詳解

    今天小編就為大家分享一篇python隨機生成庫faker庫api實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Keras保存模型并載入模型繼續(xù)訓練的實現(xiàn)

    Keras保存模型并載入模型繼續(xù)訓練的實現(xiàn)

    這篇文章主要介紹了Keras保存模型并載入模型繼續(xù)訓練的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Python學習筆記之open()函數(shù)打開文件路徑報錯問題

    Python學習筆記之open()函數(shù)打開文件路徑報錯問題

    這篇文章主要介紹了Python學習筆記之open()函數(shù)打開文件路徑報錯問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Python3中對json格式數(shù)據(jù)的分析處理

    Python3中對json格式數(shù)據(jù)的分析處理

    這篇文章主要介紹了Python3中對json格式數(shù)據(jù)的分析處理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Python3.5 + sklearn利用SVM自動識別字母驗證碼方法示例

    Python3.5 + sklearn利用SVM自動識別字母驗證碼方法示例

    這篇文章主要給大家介紹了關于Python3.5 + sklearn利用SVM自動識別字母驗證碼的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05

最新評論