我最近從事一些相當廣泛的單元測試,收集了多年努力堅持多年編寫更好單元的指導方針。記住,不好的測試頹廢功夫,問題靡遺。請將這些方針牢記在心將大有裨益!分享給堅持不懈做單元測試的朋友們。

優秀單元測試的定義?

測試是開發的一個非常重要的方面,可以在很大程度上決定一個應用程序的命運。良好的測試可以在早期捕獲導致應用程序崩潰的問題,但較差的測試往往總是導致故障和停機。

雖然有三種主要類型的軟體測試:單元測試,功能測試和集成測試,但今天,我們將討論開發人員級單元測試,首先讓我們先回顧一下這三種測試的具體內容吧。

軟體開發測試的類型

單元測試用於測試各個代碼組件,並確保代碼按照預期的方式工作。單元測試由開發人員編寫和執行。大多數情況下,使用JUnit或TestNG之類的測試框架。測試用例通常是在方法級別寫入並通過自動化執行。

集成測試檢查系統是否作為一個整體而工作。集成測試也由開發人員完成,但不是測試單個組件,而是旨在跨組件測試。系統由許多單獨的組件組成,如代碼,資料庫,Web伺服器等。集成測試能夠發現如組件布線,網路訪問,資料庫問題等問題。

功能測試通過將給定輸入的結果與規範進行比較來檢查每個功能是否正確實現。通常,這不是在開發人員級別的。功能測試由單獨的測試團隊執行。測試用例基於規範編寫,並且實際結果與預期結果進行比較。有若干工具可用於自動化的功能測試,如Selenium和QTP。

編寫單元測試的原因

1. 不要讓客戶發現難堪的bug。在bug進入產品生產環節前編寫足夠的測試場景來捕獲它們。

2. 對於複雜的場景,快速測試它,不必在程序中手動地重現去它們。

3. 經常測試,在你離開的時候程序便不會出錯。你不可能總能瞭解你所編寫代碼的各種可能情況,尤其最初的程序並不一定是由你編寫的。

4. 儘早測試,就不需要編寫一些不必要的代碼,而可只關注關鍵部分。這可以使得代碼庫精簡且易於維護。同樣可以節約開發時間。

5. 同一代碼不必兩番調試。一旦你測試發現可能的bug後,你便可以快速地修正它。

6. 可以確保可讀性。單元測試可使代碼的意圖易於理解。

7. 確保可維護性。進行單元測試可迫使你更好地實現封裝功能,從而使代碼易於維護而且方便增加新功能。

8. 重構時無需擔心。運行測試可確保一切功能如預期實現。

9. 節省測試時間。你可以將整個CPU用來執行單元測試。

10. 更安全。對於增加一個新功能或者修改部分程序內核後你是否經常會感到擔心呢?(進行單元測試後)這一切不再了。

11. 中獎:確切知道哪裡出問題了。取代盲目的發現bug,測試可以告訴你問題及原因所在。舉例:程序會告訴你什麼時候cart中增加了一個條目而cart顯示仍然是空的。它也會告訴你某個試圖增加的條目失敗了。

如何編寫高質量的單元測試?

1.運行快速

單元測試有兩個好處:

· 確定什麼正常工作;

· 檢測什麼停止了工作。

測試是用來運行的,每次運行,都能夠反饋你代碼的狀況。測試運行的越快,你就越早能注意到 bug,也不容易讓人覺得運行測試是一件很麻煩的事情,不會只在每次發布之前或者每天結束的時候才運行。

要想測試運行得快,也就意味著必須:

· 運行在 JVM 中而不是設備上;

· 只測試獨立的業務邏輯塊;

· 不要在你的主要測試中涉及到 UI、資料庫或網路測試;

· 測試中不要使用 wait/sleep 語句。

2.小而專註

在編寫測試時,心裡應時刻明確每個測試是用來檢測什麼錯誤的。

比如出現一個 bug,哪種情況你更喜歡:

· 一個 bug -> 多個測試失敗

· 一個 bug -> 一個測試失敗

相信大多數人都會選擇第二種情況,因為這意味著你的測試重複度低,這樣的測試通常你看一眼名字就知道是哪裡錯了。比如:

@Test

public void logInShouldFailWithWrongPassword() throws Exception {

// Test code

}

也就是對於每一個錯誤,正好一個測試失敗,並且測試名就描述了錯誤產生的原因。

也就意味著你應當:

· 測試是多而小,而不是少而大的;

· 每個測試只測試一個功能點;

· 用測試的名稱準確描述錯誤產生的原因。

3.100%可靠

測試是你的安全帶,要想100%發揮測試的威力,那就要120%的認真對待測試,保證測試自己是完全可靠的。

最浪費時間和令人泄氣的事情,莫過於出現了一個bug,所有的測試還都運行通過了。

因此對於測試來講,最最重要的事情莫過於保證測試自己的正確可靠了。

總結:

我也是最近才開始寫單元測試的,雖然很無腦,但是我個人還是覺得有必要的,一些很低級的錯誤至少能找出來(如果你稍微認真的寫,而不是敷衍)。這樣總比在Code Review的時候被指出來要好很多吧。而且寫單元測試也算是一種休息吧!


推薦閱讀:
相關文章