电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

問題

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

解決方案

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

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

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

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

被用來作為替換值的 MagicMock 實例能夠模擬可調(diào)用對象和實例。 他們記錄對象的使用信息并允許你執(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__.calledTrue>>> m.__getitem__.assert_called_with(’blah’)>>>

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

# 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

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

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() 函數(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如何在單元測試中給對象打補丁的詳細內(nèi)容,更多關(guān)于Python 單元測試的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 直流电能表-充电桩电能表-导轨式电能表-智能电能表-浙江科为电气有限公司 | 杰恒蠕动泵-蠕动泵专业厂家-19年专注蠕动泵 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 飞象网 - 通信人每天必上的网站| 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 科普仪器菏泽市教育教学仪器总厂 | 上海办公室装修_上海店铺装修公司_厂房装潢设计_办公室装修 | 天津仓库出租网-天津电商仓库-天津云仓一件代发-【博程云仓】 | CE认证_产品欧盟ROHS-REACH检测机构-商通检测 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 广域铭岛Geega(际嘉)工业互联网平台-以数字科技引领行业跃迁 | 真空吸污车_高压清洗车厂家-程力专用汽车股份有限公司官网 | 杭州顺源过滤机械有限公司官网-压滤机_板框压滤机_厢式隔膜压滤机厂家 | 纳米二氧化硅,白炭黑,阴离子乳化剂-臻丽拾科技 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 青岛侦探调查_青岛侦探事务所_青岛调查事务所_青岛婚外情取证-青岛狄仁杰国际侦探公司 | 上海办公室装修,写字楼装修—启鸣装饰设计工程有限公司 | 口信网(kousing.com) - 行业资讯_行业展会_行业培训_行业资料 | 液氨泵,液化气泵-淄博「亚泰」燃气设备制造有限公司 | LINK FASHION 童装·青少年装展| 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 健身器材-健身器材厂家专卖-上海七诚健身器材有限公司 | 艺术漆十大品牌_艺术涂料加盟代理_蒙太奇艺术涂料厂家品牌|艺术漆|微水泥|硅藻泥|乳胶漆 | 电竞学校_电子竞技培训学校学院-梦竞未来电竞学校官网 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 济南玻璃安装_济南玻璃门_济南感应门_济南玻璃隔断_济南玻璃门维修_济南镜片安装_济南肯德基门_济南高隔间-济南凯轩鹏宇玻璃有限公司 | 一体化污水处理设备-一体化净水设备-「山东梦之洁水处理」 | 圆盘鞋底注塑机_连帮鞋底成型注塑机-温州天钢机械有限公司 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 九州网址_专注于提供网址大全分享推广中文网站导航服务 | 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 | 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 |