0%

測試驅動開發TDD

測試驅動開發,英文全稱Test-Driven Development,簡稱TDD,是一種不同于傳統軟件開發流程的新型的開發方法。它要求在編寫某個功能的代碼之前先編寫測試代碼,然后只編寫使測試通過的功能代碼,通過測試來推動整個開發的進行。這有助于編寫簡潔可用和高質量的代碼,并加速開發過程。

Kent Beck先生最早在其極限編程(XP)方法論中,向大家推薦“測試驅動”這一最佳實踐,還專門撰寫了《測試驅動開發》一書,詳細說明如何實現。經過幾年的迅猛發展,測試驅動開發已經成長為一門獨立的軟件開發技術,其名氣甚至蓋過了極限編程。

基本原理

測試驅動開發的基本思想就是在開發功能代碼之前,先編寫測試代碼,然后只編寫使測試通過的功能代碼,從而以測試來驅動整個開發過程的進行。這有助于編寫簡潔可用和高質量的代碼,有很高的靈活性和健壯性,能快速響應變化,并加速開發過程。

測試驅動開發的基本過程如下:

① 快速新增一個測試

② 運行所有的測試(有時候只需要運行一個或一部分),發現新增的測試不能通過

③ 做一些小小的改動,盡快地讓測試程序可運行,為此可以在程序中使用一些不合情理的方法

④ 運行所有的測試,并且全部通過

⑤ 重構代碼,以消除重復設計,優化設計結構

簡單來說,就是不可運行/可運行/重構——這正是測試驅動開發的口號。

一個生動比喻,舉個比較生動的例子,這個例子你一定已經在很多關于TDD的文獻資料上都看到過,但它確實是一個不錯的比喻。在此我進行了一些加工和擴展。

蓋房子的時候,工人師傅砌墻,會先用樁子拉上線,以使磚能夠壘的筆直,因為壘磚的時候都是以這根線為基準的。TDD就像這樣,先寫測試代碼,就像工人師傅先用樁子拉上線,然后編碼的時候以此為基準,只編寫符合這個測試的功能代碼。

而一個新手或菜鳥級的小師傅,卻可能不知道拉線,而是直接把磚往上壘,壘了一些之后再看是否筆直,這時候可能會用一根線,量一下砌好的墻是否筆直,如果不直再進行校正,敲敲打打。使用傳統的軟件開發過程就像這樣,我們先編碼,編碼完成之后才寫測試程序,以此檢驗已寫的代碼是否正確,如果有錯誤再一點點修改。

你是希望先砌墻再拉線,還是希望先拉線再砌墻呢?如果你喜歡前者,那就算了,而如果你喜歡后者,那就轉入TDD陣營吧!

本質和優勢

或許只有了解了測試驅動開發的本質和優勢之后,你才會領略到她的無窮魅力。 測試驅動開發不是一種測試技術,它是一種分析技術、設計技術,更是一種組織所有開發活動的技術。相對于傳統的結構化開發過程方法,它具有以下優勢:

1) TDD根據客戶需求編寫測試用例,對功能的過程和接口都進行了設計,而且這種從使用者角度對代碼進行的設計通常更符合后期開發的需求。因為關注用戶反饋,可以及時響應需求變更,同時因為從使用者角度出發的簡單設計,也可以更快地適應變化。

2) 出于易測試和測試獨立性的要求,將促使我們實現松耦合的設計,并更多地依賴于接口而非具體的類,提高系統的可擴展性和抗變性。而且TDD明顯地縮短了設計決策的反饋循環,使我們幾秒或幾分鐘之內就能獲得反饋。

3) 將測試工作提到編碼之前,并頻繁地運行所有測試,可以盡量地避免和盡早地發現錯誤,極大地降低了后續測試及修復的成本,提高了代碼的質量。在測試的保護下,不斷重構代碼,以消除重復設計,優化設計結構,提高了代碼的重用性,從而提高了軟件產品的質量。

4) TDD提供了持續的回歸測試,使我們擁有重構的勇氣,因為代碼的改動導致系統其他部分產生任何異常,測試都會立刻通知我們。完整的測試會幫助我們持續地跟蹤整個系統的狀態,因此我們就不需要擔心會產生什么不可預知的副作用了。

5) TDD所產生的單元測試代碼就是最完美的開發者文檔,它們展示了所有的API該如何使用以及是如何運作的,而且它們與工作代碼保持同步,永遠是最新的。

6) TDD可以減輕壓力、降低憂慮、提高我們對代碼的信心、使我們擁有重構的勇氣,這些都是快樂工作的重要前提。

7) 快速的提高了開發效率。

現狀和前景

測試驅動開發的技術已得到越來越廣泛的重視,但由于發展時間不長,相關應用并不是很成熟。現今越來越多的公司都在嘗試實踐測試驅動開發,但由于測試驅動開發對開發人員要求比較高,更與開發人員的傳統思維習慣相違背,因此實踐起來有一定困難。 美國不少著名軟件公司如IBM很早就開始向敏捷轉型,在此過程中,TDD通常是最重要也最艱難的一個,正如IBM開發轉型部門副總裁Sue Mckinney所言:測試驅動開發前景非常誘人,但是“在這個過程中我們的付出可能也是最多的。”Forrester的高級分析師Dave West認為,測試驅動開發(TDD)就像是“圣杯”,但是“如果能達到這個目標,付出再多的辛苦也是值得的。”

我想,測試驅動開發的推廣過程中,首要的問題是將開發人員長期以來形成的思維觀念和意識形態轉變過來,開發人員只喜歡編碼,不喜歡測試,更無法理解為什么沒有產品代碼的時候就先寫單元測試;其次是相關的技術支持,測試驅動開發對開發人員提出了更高的要求,不僅要掌握測試和重構,還要懂得設計模式等設計方面的知識。

正像每種革命性的產物剛剛產生之初所必然要經歷的艱難歷程,測試驅動開發也正在經歷著,但她正在逐漸走向成熟,前途一片光明。相信未來幾年內,國內的一定會越來越多的軟件企業開始普及測試驅動開發。

layicr 微信支付

微信支付

layicr 支付寶

支付寶