首先說一下名詞解釋,TDD,英文名稱Test-Driven Development,中文名稱測試驅動開發,簡單的斷下句「測試/驅動/開發」,簡單的理解一下,就是測試驅動着開發,大白話就是說用一邊測試一邊來推進着項目的開發,相似咱們平時說的一步一個腳印,作一件事就把他給作好,每一步都要認真的走下去,保質保量的完成項目。html
TDD是敏捷開發中的一項核心實踐和技術,也是一種設計方法論。編程
TDD開發的優勢:安全
一、能夠保證代碼的質量。能夠對本身的所須要的業務功能的每一步設計進行驗證,並獲得正確的結果,減小bug的出現的,特別對於複雜業務邏輯的項目,以小步慢走的方式,避免後期繁重的測試和維護工做。函數
二、找到了重構的信心,必要時候你還能夠痛痛快快的而且滿懷信心的對代碼作一場大的變革。這樣咱們的代碼變得乾淨了,擴展性、能夠維護性以及易理解性紛至沓來。學習
三、在團隊建設中可以進行分工,以可執行的形式文檔化你的需求,迫使你分清職責隔離依賴以驅動你的設計,編織安全網以便將Bug扼殺在在搖籃狀態,防止其逃逸。不一樣於傳統開發(傳統的開發人員開發的軟件的測試是爲了找出已經逃逸得bug,可能這個bug已經長成了毒瘤)。注:這兩種活動都是必要的,並且絕不衝突,互爲補充。測試
四、幫助你養成一個新的思惟習慣,不光在你編程的道路上,在你的工做和生活中,你慢慢的會把本身的需求進行分析設計並不斷地驗證,最終更好去實現本身的人生目標。編碼
TDD開發的缺點:url
一、對於測試驅動不熟練或者喜歡偷懶的的人員,加大了代碼的編寫量,測試代碼是系統代碼的兩倍或更多。.net
二、可能不適合時間很緊的軟件開發,更適合於產品和平臺的開發。設計
TDD原則:
獨立測試:不一樣代碼的測試應該相互獨立,一個類對應一個測試類(對於C代碼或C++全局函數,則一個文件對應一個測試文件),一個函數對應一個測試函數。用例也應各自獨立,每一個用例不能使用其餘用例的結果數據,結果也不能依賴於用例執行順序。 一個角色:開發過程包含多種工做,如:編寫測試代碼、編寫產品代碼、代碼重構等。作不一樣的工做時,應專一於當前的角色,不要過多考慮其餘方面的細節。
測試列表:代碼的功能點可能不少,而且需求多是陸續出現的,任何階段想添加功能時,應把相關功能點加到測試列表中,而後才能繼續手頭工做,避免疏漏。
測試驅動:即利用測試來驅動開發,是TDD的核心。要實現某個功能,要編寫某個類或某個函數,應首先編寫測試代碼,明確這個類、這個函數如何使用,如何測試,而後在對其進行設計、編碼。
先寫斷言:編寫測試代碼時,應該首先編寫判斷代碼功能的斷言語句,而後編寫必要的輔助語句。
可測試性:產品代碼設計、開發時的應儘量提升可測試性。每一個代碼單元的功能應該比較單純,「各家自掃門前雪」,每一個類、每一個函數應該只作它該作的事,不要弄成大雜燴。尤爲是增長新功能時,不要爲了圖一時之便,隨便在原有代碼中添加功能,對於C++編程,應多考慮使用子類、繼承、重載等OO方法。
及時重構:對結構不合理,重複等「味道」很差的代碼,在測試經過後,應及時進行重構。
小步前進:軟件開發是複雜性很是高的工做,小步前進是下降複雜性的好辦法。
怎麼作TDD(關鍵5步)
加入一個新的測試
運行下新加的測試,看到它失敗(由於你還沒寫功能代碼)
對開發代碼作很小的修改,目的就是讓新加的測試經過 (注意這裏的目的)
運行全部的測試(test case),而後看到全部測試都經過了 (看到測試都變成綠色,通常都會小開心一下)
移掉重複的代碼,對代碼進行重構 (既包括功能代碼,也包括測試代碼。特別注意紅色的字串 通常會有重複,還有一些代碼能夠抽出來變成公用方法,測試代碼中一樣的初始化和還原測試環境的代碼,能夠放到intilize和cleanup中去)
而外還有一些步驟也是能夠加入的,比方
在寫測試代碼前,先從需求出發,準備一個Test list (須要測到的功能的列表)。忘掉你該怎麼實現,那是後面的事情
每測完一個就用橫線劃掉
若是發現有漏掉的test 就加到這個列表中(列表測完你的功能也就完成了)
總結:
經過一上午的學習,對TDD(測試驅動開發)有了基本的理解,對TDD的帶來的優勢有了初步的認識,接下來的學習中,我會轉變思想,以「測試先行」的原則來開發穩定高質量的代碼,把寫測試像寫代碼註釋同樣,深刻骨髓。
參考資料:
由衷向如下博客表示感謝,也以便之後查詢方便
http://www.cnblogs.com/xiadao521/p/4092846.html
http://blog.csdn.net/m13666368773/article/details/7006912
http://baike.baidu.com/link?url=pbvA3Y5wTfaUMJKHgKtSd3pNuWB08imkCRW0BTVAOc_9TZ5Z7mOn4T6No1Crxvb-Jmp1Wg4xr2uvRyi4cY3OoSqwgVNPkwqzJf-DrxTKQ9e