這裏是我的高層次,一般的問題:Java的斷言,在比較/對比單元測試和異常
一個爲什麼要使用斷言,而不是單元測試和異常處理?
爲了澄清我的疑惑並限定我的顧慮,我會談一談我對Java斷言和我的背景的瞭解,因爲它與這一問題相關。所以,要開始,在本週之前,我真的不知道Java框架的斷言,也不知道它們的功能,所以我絕對承認我很可能沒有得到全部圖像。話雖如此,我近十年來一直是Web開發,數據和API開發方面的專家,所以我並不完全天真。
從我讀過的和討論過的內容來看,斷言通常在開發過程中使用,(幾乎)在生產中總是關閉,並檢查後期條件和類不變值;他們可以被用於其他事情,但這兩件事似乎是他們當前的主要用法。它們構建在Java異常之上,是Error
的子類型,並在違反時引發。關閉時,它們不會增加運行時間開銷。但是,對我而言,它們看起來是多餘的,特別是在考慮良好的異常處理技術和良好的單元測試實踐時。我沒有看到任何情況下,斷言會提醒程序員注意異常處理或單元測試無法解決的錯誤或問題。
遵循這一思路,他們似乎在創造代碼混亂。如果他們不打算在生產環境中運行並充當開發援助,那麼他們在生產代碼中的存在就有點反模式:你有單獨的源文件夾用於測試和測試資源,而你編寫可測試的代碼,而是而不是代碼嚴格的測試。每當我發現自己編寫的代碼只是爲了測試,就會提醒我設計不佳,然後我退後一步,重新設計我正在做的事情,以便我的代碼可以測試。在我看來,這是這種範例被侵犯的一個例子。無論存在什麼斷言,它都可以被try/catch塊取代,如果/ then/else拋出了適當的異常,或者通過一組單元測試 - 至少,這就是我認爲的方式。在生產代碼中聲明不會在生產過程中運行,這是令人困惑的。它也會干擾代碼的目的和代碼的功能。我發現一個測試可以評估相同的條件,斷言會更加可讀,因爲它會被包含在一個測試中,該測試可以爲該確切場景命名和記錄。
其他人可以增加洞察這一思路?也許你同意 - 添加例子爲什麼或闡述我的推理。再說一遍,也許你認爲我錯了 - 陳述原因並提供例子來支持你的推理,或者提供反面的觀點來看待我的觀點。
謝謝大家!
資源我請教,供大家參考:
- http://c2.com/cgi/wiki?DoNotUseAssertions
- http://geekexplains.blogspot.com/2008/06/asserions-in-java-assertions-vs.html
- http://www.javapractices.com/topic/TopicAction.do?Id=102
- http://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html
一般來說,你可能是對的。你可以爲每個「testing」assert編寫一個JUnit測試,並且你可以用try-catch或者throw來代替每個「functional」assert。但是對於快速代碼抽樣,編寫'assert'比編寫完整的測試用例要容易。也許這就是Java'assert'關鍵字的利基...... – Turing85
「用於快速代碼抽樣,比編寫完整的測試用例更容易編寫斷言」 - 比另一個更爲正確,或者它們是否有不同/補充用例?在我看來,從測試和生產代碼明顯分離的角度來看,單元測試會更加正確,並且明確地拋出一個詳細且恰當命名的異常會更清晰和更具可讀性。在這一點上我只是在qu?? – liltitus27
這正是我所說的*快速代碼抽樣*。單元測試更精細,代碼更昂貴,以及'try-catch'塊和propper異常處理。 – Turing85