1.2 單元測試的目標和方法
單元測試的目標是什麼呢?就是完整檢測代碼單元的功能邏輯。找出代碼單元本身的所有功能邏輯錯誤,具體來說,就是檢測對資料的各種分類是否考慮全面,處理是否正確。單元測試並不是用來代替系統測試、效能測試的,它的目標相當明確,就是檢測代碼單元本身的功能邏輯錯誤。
如果時間緊張,應該優先測試哪些代碼呢?代碼的功能邏輯越複雜,也就是演算法密集度越高,可能的錯誤越多,越需要全面的測試,測試效益越大。所以,如果時間不夠,應該優先測試演算法密集的代碼。80-20規則在軟體開發中同樣存在,也就是80%的代碼錯誤可能存在於20%的代碼中,20%的代碼可能佔用了80%的開發調試時間。這20%就是演算法密集的代碼,即使只對這些代碼進行單元測試,也可以產生巨大的效益。代碼複雜度和測試價值可以用工具來統計。
測試方法主要有兩種:靜態和動態。靜態方法主要由工具掃描和分析代碼。動態方法則需要執行代碼。
靜態方法能發現哪些錯誤呢?從靜態測試的角度來看,代碼錯誤可分為代碼缺失,語義錯誤,一般錯誤。代碼缺失是分類遺漏造成的,也就是程式員沒有考慮到某些輸入,沒有編寫相應代碼。語義錯誤就是通過分析代碼的文法含義,有可能判斷的錯誤,例如,條件陳述式中將等於操作符寫成了賦值操作符、數組越界、除零錯。其他錯誤就是一般錯誤。對於語義錯誤,靜態測試可能能夠發現。對於代碼缺失,靜態測試無法發現,因為代碼不存在,也就無從分析。其他錯誤,靜態測試不能發現,因為工具不瞭解代碼的設計功能。很顯然,靜態測試並沒有真正檢測代碼的功能邏輯,根本不知道這個代碼是幹什麼的,實現什麼功能才對,只是通過分析代碼的自然特性來檢測錯誤,所以作用是很有限的。
動態方法是這麼做的:首先,依資料的分類列出輸入,這個分類是跟程式功能緊密相關的,一個分類,相當於是一個功能點。然後,執行被測試代碼,然後,判斷輸出是不是符合預期,如果不符合,就報告錯誤。只要測試資料是完整的,就可以完整覆蓋代碼的功能邏輯,
發現所有功能邏輯錯誤。靜態測試所能發現的錯誤,如條件陳述式中將等於操作符寫成了賦值操作符,數組越界,除零錯,都會表現為功能不正確,動態測試當然也能發現。因此,要想達到基本的測試效果,要依靠動態方法。我們說的單元測試,主要是指動態方法,也就是動態測試。