簡體   English   中英

用Python編寫單元測試文件

[英]Unit testing file write in Python

我正在用Python編寫ConfigParser的包裝程序,以提供用於存儲和檢索應用程序設置的簡便接口。

包裝器有兩種方法, readwrite ,以及用於不同應用程序設置的一組屬性。

write方法只是ConfigParserwrite方法的包裝,另外還創建了ConfigParser所需的文件對象。 看起來像這樣:

def write(self):
    f = open(self.path, "w")
    try:
        self.config_parser.write(f)
    finally:
        f.close()

我想編寫一個單元測試,斷言該方法在無法寫入文件時引發IOError,而在另一種情況下,調用配置解析器的write方法。

使用模擬對象進行第二項測試非常容易。 但是open電話使事情變得有些棘手。 最終,我必須創建一個文件對象以傳遞給配置解析器。 運行此代碼時實際上將創建文件的事實並不能使其對單元測試非常有用。 有一些模擬文件創建的策略嗎? 這段代碼可以通過某種方式進行測試嗎? 還是測試太簡單了?

首先,您實際上不需要對open()進行單元測試,因為假設標准庫是正確的是相當合理的。

接下來,您不想執行文件系統操作來獲取open()來生成所需的錯誤,因為這樣就無需進行單元測試,而是通過包含文件系統來進行功能/集成測試。

因此,您可以使用僅引發IOError的代理替換全局名稱空間中的open() 但是,如果繼續執行,可能需要確保您放回原處。

但是最后,測試有什么價值? 您自己的系統中的代碼片段很少。 即使替換open()實際上實際上最終只是一個測試,內容為“ Python中的tryfinally語句是否起作用?”

我的建議? 只需在文檔字符串中添加一條記錄您的期望的語句即可。 “如果無法寫入文件,則引發IOError。” 然后繼續前進。 如果此方法增加了一些復雜性(以及測試的優點),則可以稍后添加單元測試。

實際上,只有open可能在您的代碼中引發異常。 write()的文檔未提及任何有關異常的內容。 可能僅是ValueError或用於錯誤文件指針的內容(由於打開失敗而導致的情況,此處不是這種情況)。

使IOError打開很容易。 只需在其他位置創建文件並打開以在其中寫入即可。 或者,您可以更改其權限,因此您無權訪問。

不過,您可能想在此處使用with語句,它會自行處理關閉操作。

在python 2.5中,您需要第一行。 在更高版本中,您不需要它。

from __future__ import with_statement # python 2.5 only

def write(self):
    with open(self.path, 'w') as f:
        self.config_parser.write(f)

如果open成功,則保證將調用write方法,如果open引發IOError ,則不會調用write方法。 我不知道為什么您需要測試以查看是否調用了write。 該代碼表明確實如此。 不要過度測試。 ;)

請記住,您不必測試open()或ConfigParser的工作-它們不是代碼的一部分-您只需要測試是否正確使用它們即可。 您可以像實例屬性一樣,使用自己的open()對該模塊進行猴子修補,並可以從中返回模擬內容來幫助您進行測試。

然而,單元測試是不是我唯一的工具,這是一個功能,這是很簡單的分析和“證明”†,它的作品。

我確定,嚴格程度不如數學家所希望,但對我來說足夠好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM