單元測試之難

自動化單元測試需要基於一些成熟的單元測試框架。主流的編程語言都有:Java的JUnit,C++的CppUnit等等。以C++爲例,編程人員編寫代碼時,需要同時編寫測試套,通過C++宏來控制基於真實代碼編譯/運行,或只是單元測試。
單元測試的一個難點是測試覆蓋率,要達到100%的語句覆蓋率是很難,同時也是沒必要的。因爲一些異常保護的分支是很難運行得到的,例如分配內存失敗的異常保護分支。
另外一種觀點是:100%的語句覆蓋率還不足以保證代碼的正確邏輯,語句覆蓋之上,還有條件覆蓋、路徑覆蓋。條件覆蓋是指:如果一個條件判斷語句由三個表達式組成,那麼最多要有6個用例才能達到對所有真假條件的判斷。因爲代碼由多個分支組成,以兩個條件判斷、每個條件判斷兩個分支爲例,要4個用例才能達到路徑覆蓋。這是一種理想化的要求,這是非常困難的,同時也是沒有自動化評估手段的,只能靠人工檢查。
單元測試的另外一個問題是:很多的代碼都依賴於外部的運行環境,如數據庫連接、外部文件操作等,因此需要大量的條件宏判斷來區分真實環境運行或單元測試環境運行。當然,這也體現了單元測試的定位和侷限性:它只是用來驗證代碼的內部正確性的,至於和外部的接口,必須通過集成或系統測試才能完成。這個侷限性也一定程度上影響了開發人員努力設計、執行更多單元測試用例,並提高測試覆蓋率的積極性。因爲再全面的單元測試覆蓋率也不能完全說明代碼的運行正確性,何不把更多的精力放在集成和系統測試上?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章