日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:42日期:2022-07-15 11:49:37

問題

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

解決方案

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

from unittest.mock import patchimport 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() 接受一個已存在對象的全路徑名,將其替換為一個新的值。 原來的值會在裝飾器函數或上下文管理器完成后自動恢復回來。 默認情況下,所有值會被 MagicMock 實例替代。例如:

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

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

>>> x42>>> with patch(’__main__.x’, ’patched_value’):... print(x)...patched_value>>> x42>>>

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

>>> 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__.calledTrue>>> m.__getitem__.assert_called_with(’blah’)>>>

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

# example.pyfrom urllib.request import urlopenimport csvdef 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

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

import unittestfrom unittest.mock import patchimport ioimport examplesample_data = io.BytesIO(b’’’'IBM',91.1r'AA',13.25r'MSFT',27.72rr’’’)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() 函數被一個模擬對象替代, 該對象會返回一個包含測試數據的 ByteIO()

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

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

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

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美成人午夜| 国产日本亚洲| 视频一区二区三区在线| 日韩精品视频一区二区三区| 精品免费av在线| 国产一区2区| 精品国产精品久久一区免费式 | 久久99精品久久久野外观看| 欧美欧美黄在线二区| 久久久精品网| 国产一级久久| 精品国产一区二区三区av片| 久久亚洲专区| 婷婷精品在线观看| 日韩avvvv在线播放| 国产高潮在线| 欧美特黄一级大片| 91久久国产| 国产日韩欧美一区二区三区| 国产模特精品视频久久久久| 日本欧洲一区二区| 国产精品欧美大片| 中文字幕在线官网| 精品久久电影| 免费污视频在线一区| 亚洲成人一区| 日本色综合中文字幕| 欧美性感美女一区二区| 欧美天堂在线| 蜜桃视频在线观看一区| 国产不卡人人| 欧美a级一区二区| 国产精品久久久亚洲一区| 国产一区二区三区亚洲| 欧美成人亚洲| 国产成人精品福利| 亚洲综合不卡| 日本美女一区| 久久久久中文| 日韩在线网址| 国精品一区二区| 欧美综合精品| 1000部精品久久久久久久久| 欧美国产免费| 亚洲欧美专区| 日本精品另类| av成人国产| 国产午夜精品一区在线观看| 亚洲精品1区| 快播电影网址老女人久久| 成人国产精品| 日韩欧美三区| 久久婷婷亚洲| 免费不卡在线视频| 日韩高清中文字幕一区二区| 精品三级在线观看视频| 精品高清久久| 蜜桃久久av| 激情久久一区二区| 久久亚洲精品中文字幕| 天堂俺去俺来也www久久婷婷| 久久精品国产大片免费观看| 黑丝美女一区二区| 久久电影tv| 亚洲综合电影| 红桃视频国产一区| 欧美91在线| 日韩激情综合| 卡一精品卡二卡三网站乱码| 香蕉国产精品| 日韩电影在线视频| 午夜欧美视频| 亚洲精品极品| 激情丁香综合| 久久亚洲成人| 欧美久久亚洲| 国产精品一区二区三区美女| 综合亚洲色图| 欧美亚洲免费| 国产日韩欧美高清免费| 久久亚洲不卡| 亚洲免费在线| 免费一级片91| 午夜久久久久| 国产精品久久久久久久免费软件| 狠狠爱成人网| 国产高清日韩| 国产精品二区不卡| 国产乱码精品一区二区三区四区| 水野朝阳av一区二区三区| 日韩欧美中文字幕在线视频| 伊人网在线播放| 天堂资源在线亚洲| 中国女人久久久| 国产精品嫩草影院在线看| 亚洲国产福利| 亚洲综合在线电影| 欧美va天堂在线| 视频一区二区三区在线| 久久精品人人| 欧美性感美女一区二区| 欧美中文字幕一区二区| 视频一区在线播放| 国产精品亚洲欧美日韩一区在线 | 不卡在线一区| 香蕉久久久久久| 久久久久午夜电影| 青青草国产成人99久久| 激情婷婷欧美| 欧美国产另类| 九九久久婷婷| 日韩不卡一二三区| 99精品视频在线| 高清一区二区三区av| 日韩美女精品| 99成人在线| 久久九九精品| 美女高潮久久久| 久久国产精品毛片| 国产一区日韩一区| 欧美有码在线| 天堂va欧美ⅴa亚洲va一国产| 婷婷激情一区| 久久中文精品| 免费久久99精品国产| 欧美日韩国产探花| 精品视频免费| 国产伦一区二区三区| 久久精品国产68国产精品亚洲| 日韩精品久久理论片| 丰满少妇一区| 午夜性色一区二区三区免费视频| 麻豆精品久久久| 99视频一区| 国产精品亚洲一区二区在线观看| 不卡一区2区| 国产成人精品一区二区三区免费| 国产精品毛片在线看| 久久男女视频| 高清不卡亚洲| 美女性感视频久久| 日韩欧美久久| 尤物精品在线| 亚洲激情五月| 欧美日韩国产精品一区二区亚洲| 最近高清中文在线字幕在线观看1| 国产精品第一国产精品| 国产精品一区二区三区www| 日韩1区2区日韩1区2区| 久久精品99国产精品| 国产日韩一区| 麻豆精品视频在线观看| 涩涩av在线| 在线观看精品| 91精品电影| 日本一区福利在线| 午夜性色一区二区三区免费视频| 国产精品巨作av| 四虎成人av| 亚洲www啪成人一区二区| 国产一区日韩一区| 久久免费精品| 亚洲国产专区校园欧美| 中文字幕乱码亚洲无线精品一区| 精品欧美日韩精品| 日韩国产欧美三级| 亚洲综合精品四区| 国产一区二区久久久久| 国产日韩1区| 欧美一级一区| 午夜精品影视国产一区在线麻豆| 成人国产精品| 精品国产欧美日韩| 日韩精品久久久久久| 亚洲欧美网站在线观看| 国产麻豆综合| 视频一区二区三区入口| 国产亚洲综合精品| 视频一区中文字幕| 亚洲三级av| 亚洲另类黄色| 亚洲精品四区| 日韩中文影院| 91精品高清| 黑丝美女一区二区| 国产精品日韩精品中文字幕| 黄色在线网站噜噜噜| 手机在线电影一区| 亚洲精品进入| 99视频精品全部免费在线视频| 亚洲精品自拍| 日本精品影院| 日韩不卡一区二区三区| 国产91精品对白在线播放| 久久精品99久久久| 91久久黄色| 激情综合网址| 欧美/亚洲一区| 日韩久久精品| 日本综合字幕|