什么是單元測試
如果你對單元測試已經有概念了,就請跳過本章。
簡單地說,單元測試是用代碼測試代碼。不同的語言有不同的庫,提供了多種測試工具。PHP有PHPUnit、SimpleTest;Java有JUnit;.NET框架則有NUnit等等。
使用這些工具編寫測試代碼后,你就可以非常方便地進行自動、重復的單元測試。通過編寫單元測試代碼,你可以保證所寫的代碼能夠得到預期的運行結果。即使日后代碼要做修改,只要重新運行單元測試并獲得通過,則能說明新的代碼是正確的。
Wikipedia上的一篇文章對單元測試作了非常好的定義,如果想深入了解的話可以去閱讀。
何時使用單元測試
簡單的回答是:永遠。
稍長一點的回答是:這取決于項目的復雜度和生命周期。
如果是一個非常小型的項目,那花在編寫單元測試上的時間更應該用在寫項目上。因為如果項目比較簡單,就可以在編寫代碼的時候進行手工測試,這應該是比較容易的。
如果項目的生命周期較短,你肯定也不愿花大把時間用來寫單元測試。因為生命周期較短的項目不會進行較大的改動,也不需要進行較多維護。這樣一來,單元測試的價值就體現不了了。
即便如此,如果你確實有時間和精力去為小型項目寫單元測試的話,也可能是個不錯的主意。這主要看實際情況如何,但是我上面提出的兩種情況還是有代表性的。
寫好單元測試
單元測試的目的是測試一段代碼的運行結果是否正確。這段代碼通常是某個類的某個方法。
通常來說應該給每個行為編寫一個測試:給出正確的參數時的運行結果、非法參數的運行結果,對這兩點的測試是一定要寫的。根據實際情況,也許需要編寫更多的測試。
代碼覆蓋率是用來衡量單元測試好壞的常用指標。也就是說,有多少代碼是被測試到的,各個分支結構和代碼塊是否都被運行過,各個函數是否都被調用過等等。
但是,代碼覆蓋率這個指標有時也會產生誤導,因為即使全部的代碼都被測試到了,也未必說明這些代碼所得到的運行結果是正確的。
下周我會給你一些例子來說明這個問題。
小結
單元測試可以很好地提高代碼質量,包括正確性以及模塊化程度。因為,它會促使你寫出可重用的、靈活的代碼,否則將很難進行測試。
下周我會舉具體的例子來說明如何進行代碼測試,敬請期待。