2008-12-18 191 views
21

我剛開始進行了大量的代碼編寫測試。有一堆依賴於文件系統的類,也就是它們讀取CSV文件,讀/寫配置文件等等。最佳做法/集成測試

目前的測試文件被存儲在項目(這是一個Maven2的項目)的測試目錄,但由於多種原因該目錄不總是存在的,所以測試失敗。

你知道在單元/集成測試與文件系統的依賴應對最佳做法?

編輯:我不是在尋找上述具體問題的答案。那只是一個例子。我寧願一般建議如何處理依賴於文件系統/數據庫等

回答

0

通常情況下,文件系統測試是不是非常關鍵的:文件系統被很好地理解,易於設置,並保持穩定。此外,訪問通常非常快,所以本身沒有理由避開或嘲笑測試。

我建議你找出爲什麼目錄不存在,並確保它。例如,檢查setUp()中是否存在文件或目錄,並在檢查失敗時複製這些文件。這隻會發生一次,所以對性能的影響很小。

1

有針對需要從文件中讀取測試代碼兩種選擇:

  1. 保持與源控制單元測試(例如,在測試數據文件夾)的文件,所以任何人誰得到最新的並且運行測試總是將相關文件放在與測試二進制文件相關的已知文件夾中。這可能是「最佳做法」。

  2. 如果有問題的文件是巨大的,你可能不想讓他們在源代碼控制。在這種情況下,可以從所有開發人員和構建計算機訪問的網絡共享可能是合理的折衷方案。

很明顯,寫得最好的類首先不會對文件系統產生嚴重的依賴關係。

24

第一個應該嘗試保持單元測試遠離文件系統 - 請參閱Set of Unit Testing Rules。如果可能的話,你的代碼使用Streams,這些Streams是單元測試的緩衝區(即內存),生產代碼中的FileStream。

如果這不可行,您可以讓您的單元測試生成他們所需的文件。這使得測試易於閱讀,因爲一切都在一個文件中。這也可能會阻止權限問題。

你可以mock單元測試中的文件系統/數據庫/網絡訪問。

您可以將依賴於數據庫或文件系統的單元測試視爲集成測試。

2

依賴於文件系統有兩種形式在這裏:

  • 文件,你的測試取決於;如果您需要文件來運行測試,那麼您可以在測試中生成它們並將它們放入/tmp目錄中。
  • 您的代碼依賴於的文件:配置文件或輸入文件。

在此第二種情況下,它往往是可能重新結構的代碼,以除去上的文件相關,這可能不是可能的(例如java.io.File的可與java.io.InputStreamjava.io.OutputStream等代替)當然。

你可能還需要處理文件系統中的'非確定性'(我有一個工作的惡魔在NFS上調試一次)。在這種情況下,您應該將文件系統封裝在一個精簡的界面中。

簡單地說,這是需要一個文件並轉發呼叫到該文件只是輔助方法:

InputStream getInputStream(File file) throws IOException { 
    return new FileInputStream(file); 
} 

然後,您可以取代它,使用它可以直接拋出該異常的模擬,或返回一個ByteArrayInputStream,或其他。

對於URL和URI也是如此。

0

給出與結構上與單元測試名稱相似的名稱的測試文件。

在JUnit中,例如,我會使用:

File reportFile = new File("tests/output/" + getClass().getSimpleName() + "/" + getName() + ".report.html");