国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

利用Python中的mock庫(kù)對(duì)Python代碼進(jìn)行模擬測(cè)試

2020-02-23 00:45:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

 如何不靠耐心測(cè)試

通常,我們編寫(xiě)的軟件會(huì)直接與那些我們稱(chēng)之為“骯臟的”服務(wù)交互。通俗地說(shuō),服務(wù)對(duì)我們的應(yīng)用來(lái)說(shuō)是至關(guān)重要的,它們之間的交互是我們?cè)O(shè)計(jì)好的,但這會(huì)帶來(lái)我們不希望的副作用——就是那些在我們自己測(cè)試的時(shí)候不希望的功能。

比如,可能我們正在寫(xiě)一個(gè)社交軟件并且想測(cè)試一下“發(fā)布到Facebook的功能”,但是我們不希望每次運(yùn)行測(cè)試集的時(shí)候都發(fā)布到Facebook上。

Python的unittest庫(kù)中有一個(gè)子包叫unittest.mock——或者你把它聲明成一個(gè)依賴(lài),簡(jiǎn)化為mock——這個(gè)模塊提供了非常強(qiáng)大并且有用的方法,通過(guò)它們可以模擬或者屏敝掉這些不受我們希望的方面。
 注意:mock是最近收錄在Python 3.3標(biāo)準(zhǔn)庫(kù)中的;之前發(fā)布的版本必須通過(guò) PyPI下載Mock庫(kù)。

恐懼系統(tǒng)調(diào)用

再舉一個(gè)例子,考慮系統(tǒng)調(diào)用,我們將在余下的文章中討論它們。不難發(fā)現(xiàn),這些都可以考慮使用模擬:無(wú)論你是想寫(xiě)一個(gè)腳本彈出一個(gè)CD驅(qū)動(dòng),或者是一個(gè)web服務(wù)用來(lái)刪除/tmp目錄下的緩存文件,或者是一個(gè)socket服務(wù)來(lái)綁定一個(gè)TCP端口,這些調(diào)用都是在你單元測(cè)試的時(shí)候是不被希望的方面。

作為一個(gè)開(kāi)發(fā)人員,你更關(guān)心你的庫(kù)是不是成功的調(diào)用了系統(tǒng)函數(shù)來(lái)彈出CD,而不是體驗(yàn)每次測(cè)試的時(shí)候CD托盤(pán)都打開(kāi)。

作為一個(gè)開(kāi)發(fā)人員,你更關(guān)心你的庫(kù)是不是成功調(diào)用了系統(tǒng)函數(shù)來(lái)彈出CD(帶著正確的參數(shù)等)。而不是體驗(yàn)每次測(cè)試的時(shí)候CD托盤(pán)都打開(kāi)(或者更糟,很多次,當(dāng)一個(gè)單元測(cè)試運(yùn)行的時(shí)候,很多測(cè)試點(diǎn)都涉及到了彈出代碼)。

同樣地,保持你的單元測(cè)試效率和性能意味著要還要保留一些自動(dòng)化測(cè)試之外的“緩慢代碼”,比如文件系統(tǒng)和網(wǎng)絡(luò)的訪問(wèn)。

對(duì)于我們的第一個(gè)例子,我們要重構(gòu)一個(gè)從原始到使用mock的一個(gè)標(biāo)準(zhǔn)Python測(cè)試用例。我們將會(huì)證明如何用mock寫(xiě)一個(gè)測(cè)試用例使我們的測(cè)試更智能、更快,并且能暴露更多關(guān)于我們的軟件工作的問(wèn)題。

一個(gè)簡(jiǎn)單的刪除功能

有時(shí),我們需要從文件系統(tǒng)中刪除文件,因此,我們可以寫(xiě)這樣的一個(gè)函數(shù)在Python中,這個(gè)函數(shù)將使它更容易成為我們的腳本去完成這件事情。
 

#!/usr/bin/env python# -*- coding: utf-8 -*-import osdef rm(filename):  os.remove(filename)

很明顯,在這個(gè)時(shí)間點(diǎn)上,我們的rm方法不提供比基本os.remove方法更多的功能,但我們的代碼將會(huì)有所改進(jìn),允許我們?cè)谶@里添加更多的功能。

讓我們寫(xiě)一個(gè)傳統(tǒng)的測(cè)試用例,即,不用模擬測(cè)試:
 

#!/usr/bin/env python# -*- coding: utf-8 -*-from mymodule import rmimport os.pathimport tempfileimport unittestclass RmTestCase(unittest.TestCase):   tmpfilepath = os.path.join(tempfile.gettempdir(), "tmp-testfile")  def setUp(self):    with open(self.tmpfilepath, "wb") as f:      f.write("Delete me!")      def test_rm(self):    # remove the file    rm(self.tmpfilepath)    # test that it was actually removed    self.assertFalse(os.path.isfile(self.tempfile), "Failed to remove the file.")            
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 枞阳县| 宣武区| 竹山县| 黎川县| 库伦旗| 慈利县| 吉林市| 方山县| 静宁县| 阿拉善右旗| 囊谦县| 阳新县| 罗定市| 甘谷县| 中卫市| 广南县| 县级市| 金寨县| 光泽县| 图木舒克市| 甘孜县| 乐平市| 同仁县| 焦作市| 永登县| 墨江| 隆安县| 双桥区| 开封市| 南部县| 蓝田县| 舟山市| 嘉兴市| 漠河县| 贺兰县| 塔河县| 高州市| 泗阳县| 景德镇市| 邻水| 佛坪县|