無法測試的代碼真的讓我很煩惱。 下面的事情讓OO碼不可測:無法測試的代碼的警告標誌
- 全局狀態,例如,Singleton設計模式
- 是做一些花哨的工作,如數據庫訪問
- 深繼承樹
- 在構造函數中工作的靜態方法例如控制語句
- 類,違反了單一職責原則
是否有更多的警示標誌?
無法測試的代碼真的讓我很煩惱。 下面的事情讓OO碼不可測:無法測試的代碼的警告標誌
是否有更多的警示標誌?
請參閱MiškoHevery的以下博客文章:How to Write 3v1L, Untestable Code。
不編程接口是大一個在我看來。通過在內部接口後面放置依賴關係,可以在測試中嘲笑外部依賴關係。 – 2009-01-05 13:11:25
的那些東西沒有使代碼不可測。他們可能會讓找到邊緣案例更難,但是,如果您已經完全指定了測試的成功標準(並且測試驅動開發可以緩解此問題),那麼您所要做的就是通過標準。
TDD可以應用於特定部件的行爲以及整個項目,因此您可以輕鬆測試非常小的組件。但是,這意味着測試結果,而不是獲得這些結果的手段。
只要測試通過,您就滿足了要求。如果後面有錯誤,這是測試的問題,而不是正在測試的代碼(在這種情況下,應該修改測試以捕獲以前無法預料的問題)。
您不應該在乎(就功能的交付而言)您的某個構造函數中是否存在while語句。你應該問自己什麼業務需求要求?我強烈懷疑你的客戶將提交一份包括「繼承限於4個級別」的要求清單。他們可能會列出「無缺陷」作爲要求,但是您必須在這個問題上進行談判:-)。
儘管它們可能不會讓它無法測試,但像花哨的靜態方法之類的東西幾乎不可能嘲笑外部資源,這又可能導致運行單元測試花費更長的時間運行。在TDD中,單元測試不應該觸及外部資源。 – Erlend 2009-01-05 09:34:53
在與演示無關的GUI類中完成的工作。 GUI應該與底層模型完全分離。
只要您不能修改它,代碼就是無法測試的。如果你有可能重構項目,那麼代碼是不可測的。通常,只需要非常小的修改就可以使測試變得更容易。而且他們可以被證明是合理的,因爲他們提高了代碼的質量。
即使在您描述的情況下,代碼也不一定無法測試。測試更加困難。例如,如果您可以隔離數據庫訪問並在單元測試期間避免它們,則更容易測試代碼。但是如果必須的話,你可以建立一個專門用於運行測試的數據庫。
我會說沒有那些東西讓代碼無法測試。他們確實使單元測試困難,因爲它們中的每一個都會增加您實現中的耦合度。
在其他的煩惱,使單元測試困難:特別是(http://en.wikipedia.org/wiki/God_object)
一般來說,你可能聽到有關創建更好的代碼的任何建議也是一個建議便於單元測試代碼。
缺少分層,過度的耦合...即Y類已經寫入瞭解X,但它不應該,X是可重用的。可測試性和可重用性之間有着密切的關係。
數據庫!特別是那些觸發器!
我知道你可以模擬數據庫,但我總是發現我的代碼中的大多數錯誤(主要是CRUD應用程序)都是數據/映射問題,如果你模擬數據庫,你不會找到那種類型的bug。
MiškoHevery's Guide on Writing Testable Code詳細說明了使代碼難以測試的缺陷。他的名單與你的名單重疊,但進入了令人難以置信的細節。
是否有任何不是這些代碼味道? – 2010-05-17 01:15:31