2012-05-30 36 views
2

我有一些UNITEST正在做這樣的事情:蟒蛇 - 它是一個不好的做法,這樣做的I/O UNITEST

_files = ('test1.txt','test2.txt'......) 
setUp(){ 
    //create test files 

    for f in _files: 
     f = open(f, 'w') 
     f.close() 
} 
tearDown(){ 
    for f in _files: 
    if os.path.exists(f): 
     os.remove(f) 
} 

但有些人告訴我,這不是一個很好的做法,這樣做的I/O UNITEST ,這是真的嗎?

+0

嗯,這不是無可原諒的,但我會說你需要一個很好的理由。爲什麼要拉入整個I/O機制並使您的測試取決於非源文件的位置和內容? – delnan

+0

如果你在測試中不應該做I/O操作,那麼記錄就很難了。我會在@delnan中迴應說這實際上取決於您使用的I/O。 –

回答

7

但是有人告訴我,做I/O並不是一個好習慣,這是真的嗎?

我不認爲在單元測試中執行I/O不一定是壞事。

唯一需要注意的是,如果你的單元測試依賴於一些預先存在的數據文件來完成它的事情,那麼這些文件應該被認爲是單元測試的一部分(並且因此受版本控制等)。

P.S.你有沒有試過詢問那些因爲建議背後的具體原因而給你這個建議的人?

0

一般而言,編寫測試的最佳實踐是,只有在未產生預期行爲時纔會失敗。

如果您包含任何第三方代碼或測試方法以外的邏輯,即使測試方法正常工作,您也會添加測試失敗的原因。在單元測試中,您使用mock來替換其他對象或方法,因此可以替換您不想測試的任何邏輯。這有助於保持測試實際上僅覆蓋一個代碼單元。

如果您的測試連接到數據庫,讀取和寫入文件,從Web服務獲取GET等,那麼它可能真的是一個集成測試。集成測試非常有用,因爲您可以檢測到單元測試無法識別的問題。但是單元測試的好處是,如果一個寫得很好的單元測試失敗了,你已經知道哪部分代碼存在問題,預期的行爲是什麼以及發生了什麼。

當讀取輸入文件時,文件將成爲測試的一部分,所以現在您將測試分爲兩個位置。任何想要理解測試的人都需要打開文件並觀察它,需要將文件添加到源代碼控制等。如果文件很短,那麼最好只是模擬I/O函數在一個地方進行測試。