在我的辦公室裏,除了主要負責與文件系統(DB等)交互的類的集成測試之外,我們對單元測試的必要性還有爭議。除了數據庫,文件系統等的集成測試之外,還需要進行單元測試嗎?
我們的集成測試幾乎是單元測試,因爲測試對象根本不與其他對象交互。爲什麼我們稱之爲測試集成的唯一原因是真正的文件系統用於測試。並建議使測試類使用文件系統層組件,然後在測試中模擬它(因此我們將它們稱爲單元測試),並檢查與此組件的交互,而不是真正的文件系統結果。這種改變的必要性就是我們所討論的。來看
有一點我們有,就是單元測試是必需的,因爲:
- 編寫單元測試使代碼更好
- 有單元測試,你並不需要關心關於真正的文件系統和文件的副作用,出現在錯誤的位置
- 開發人員可以通過使測試的類使用文件系統模擬並設置適當的模擬預期來充分測試結果
- 可以e對被測試類的特定內部算法的模擬期望,因爲我們使用單元測試進行白盒測試
因此,必須始終爲這樣一個測試類寫入單元測試。爲了測試目的,文件系統層組件必須總是被該類使用。
另一個角度來看,是不需要的單元測試的那些專門文件系統交互的類特定邊緣的情況下,這是因爲:
- 這是不能夠適當地驗證,即一個測試只是通過簡單的模擬而不是真正的文件系統(或其完整的模擬)來實現。文件系統是如此復雜的組件,即:
- 被測試的類可以以許多不同的方式工作,以實現成功的結果。模擬期望僅涵蓋了兩種可能的情況,所以單元測試錯誤地顯示了一個類能正確實現好的算法的錯誤,這與預期的不同。
- 被測試的類可以以某種方式工作,通過模擬將其檢測爲成功的場景,而類仍然不會產生正確的結果。這可能是因爲在真正的文件系統中有相當複雜的原因。所有這些原因都不可能通過模擬來實現。
- 帶有模擬和期望的單元測試非常脆弱,因爲它與測試類的內部算法非常相關。並且測試在算法的正確變化上錯誤地失敗。
- 當類只有1-2個公用方法,並且只有依賴項是文件系統時,集成測試纔是適用於單元測試的完全替代方案。集成測試爲這種情況提供了與單元測試相同的好處 - 清晰的依賴關係,更易讀的代碼等。
因此,我們不需要使用文件系統嘲諷進行單元測試。它是脆弱的,對於這種特殊的課程來說並不準確。
所以,概括起來講,問題是:
是集成測試完全足夠具有不復雜的類,它有主要責任與文件系統(DB等工作的邊緣情況)?
集成和單元測試這個類之間的唯一區別是,在單元測試文件系統模擬,將使用(類將是完全隔離的),而與集成測試中使用的真正的文件系統。
我將不勝感激,如果你可以添加引用經典書籍,或者可能的知名業內人的文章/演示,所以我們可以有一個非常強地支持所產生的結論。
http://www.growing-object-oriented-software.com/這是我參考TDD的書籍之一,也許這會有所幫助。順便說一句,單元測試不需要測試每個分支,而是專注於測試行爲。 – 2013-03-26 05:42:14
http://stackoverflow.com/questions/129036/unit-testing-code-with-a-file-system-dependency這是類似於這個SO的問題之一。 – 2013-03-26 05:45:33
謝謝@NarendraPathai。我見過那張票,但是我也在尋找一些對一般採用的來源(書籍,文章等)的參考。 – 2013-03-26 16:48:39