文章目錄
- 測試驅動開發的目標和目的
- 促進測試驅動開發
- 測試驅動開發的好處
通過之前檔案關於單元測試的介紹,我們學會了如何減少代碼的缺陷,通過迴歸測試抓取bug,減少對公用測試的依賴提高開發效率。本章我們的關注點將會放在測試驅動開發(TDD)上,他是測試先行、開發置後的開發模式。他有很多的好處,例如:更好的可測試代碼、更簡潔的介面和可以提高開發人員信心的代碼品質。
測試驅動開發的目標和目的
測試驅動開發的目標是簡潔的代碼。TDD是一種迭代的開發過程,每個迭代式以寫單元測試開始,單元測試可以作為將要開發功能的規範文檔。短期迭代對代碼的反饋是及時的,這樣可以更容易發現我們不好的設計。編寫開發代碼之前,先寫單元測試還可以提高單元測試覆蓋率。
1.開發置後
傳統的開發模式中,問題知道代碼全部編寫完才得以解決。理想情況下,代碼會有整體的架構考慮,但是很多情況下,特別是JavaScript開發的過程中,情況往往不是這樣。這種解決方案,通過去猜什麼樣的代碼能解決問題,導致的結果是代碼腫脹和緊耦合。如果沒有單元測試,產品代碼中可能會包含一些沒有啟動並執行代碼,例如異常處理邏輯。還有就是邊界值可能沒有被測試到。
TDD把開發順序顛倒了,首先做的不是編寫功能實現代碼,而是考慮目標的制定,要實現什麼功能和如何?。單元測試在這裡起到規範和文檔的作用。TDD的目標不是測試,所以他不能保證在邊界值的處理上做的更好。TDD雖然產生了額外的單元測試代碼,但是他提高了系統的健壯性,而且保證系統不包含不執行的代碼。
2.在TDD中做設計
TDD的特點是“沒有大的預先設計”,並不是“沒有預先設計”。為了寫出整潔的代碼,我們需要衡量整個項目的期間和考慮開發的生命週期,所以我們需要制定計劃。TDD不會無中生有的自動產生好的設計,但是他會協助我們進化我們的設計。通過對單元測試的依賴,TDD更多的把關注點放在了相互獨立的、隔離的組件上。這種方式可以幫我們我們寫出接偶的代碼,代碼遵循單一職責和避免不必要的膨脹。TDD提供了嚴格控制,可以將很多設計的決定時間延遲到直到真正需要的時候。他可以很好的應對需求的變化,因為我們很少設計不需要的功能,或者不需要按照預先期望開發。
TDD驅使我們去處理設計,當有了新功能的時候,我們需要以單元測試的形式制定合理的用例。寫單元測試時需要思考的,我們需要描述我們在解決什麼樣的問題。只有完成這個工作,才能開始編碼。換句話說,TDD要求我們在提供解決方案之前,要先想想結果。
促進測試驅動開發
測試驅動開發最關鍵的是運行測試,測試需要能快速而容易的運行。如果不是這樣的話,開發人員就會忽略測試,當開發了新功能之後也不會運行測試。這樣會讓開發變得一團糟。最糟糕的是,我們花費額外的時候使用TDD的開發模式,卻沒有起到我們期望的作用,我們開發的代碼還是一團糟。所以,順利的運行測試是相當重要的。
推薦的方案是使用自動化的測試(autotest),每個測試儲存在獨立的檔案中,可以單獨運行。他能在螢幕上顯示測試結果,告訴我們哪些測試通過了(顯示綠色),哪些測試正在運行,和哪些測試失敗了(顯示紅色)。這樣可以提高我們開發的效率,協助我們重構代碼,我們只需要關注測試失敗的情況。
測試驅動開發的好處 1.能夠工作的代碼
TDD最大的好處就是生產可以工作的代碼。一個基本的單元測試可以確保一段代碼的穩定。可再生的單元測試在JavaScript中特別有用,我們需要在很多瀏覽器平台上進行測試。測試代碼只需要寫一次,通過測試可以很快找到不能工作的代碼,發現bug。
2.遵循單一職責原則
在隔離的條件下描述和開發組件,能更容易的寫出解耦和符合單一職責原則的代碼。TDD的單元測試不需要測試組件的依賴,他們需要能用mock或stub的方式替換。另外,單元測試也可以協助我們找到程式中緊耦合的代碼。
3.迫使有意識的開發
因為在每次迭代之前,我們都是先寫描述特定功能的測試,TDD就迫使我們在編寫代碼之前先進行思考。在解決問題之前先進行思考,有助於我們找到一個更可靠的解決方案。通過用例對功能進行描述,也有助於我們開發出更簡明的代碼。這樣也會避免我們引入不必要的功能。
4.提高生產效率
如果你是第一次接觸TDD,你會覺得所有的測試和步驟都需要你花費更多的時間。使用TDD從一開始也不是那麼簡單的事情,寫出好的單元測試需要不斷的練習,本系列課程會通過很多例子教會你如何完成這個工作。當你養成了好的TDD開發習慣的時候,他確實能提高你的開發效率。他可能需要你多花點時間去完成功能代碼和測試代碼的編寫,但是他能減少你手工測試的時間,取而代之的是運行單元測試。最重要的是,你開發出了有單元測試保障的、能工作的代碼,代碼重構的工作將不會變得那麼荊棘。你的工作會變得更快速、壓力更少和更快樂。