什么是TDD?
TDD 有廣義和狹義之分,常說的是狹義的 TDD,也就是 UTDD(Unit Test Driven Development)。廣義的 TDD 是 ATDD(Acceptance Test Driven Development),包括 BDD(Behavior Driven Development)和 Consumer-Driven Contracts Development 等。
本文所說的 TDD 指狹義上的 TDD,也就是「單元測(cè)試驅(qū)動(dòng)開發(fā)」。
TDD 是敏捷開發(fā)中的一項(xiàng)核心實(shí)踐和技術(shù),也是一種設(shè)計(jì)方法論。TDD的原理是在開發(fā)功能代碼之前,先編寫單元測(cè)試用例代碼,測(cè)試代碼確定需要編寫什么產(chǎn)品代碼。TDD 是 XP(Extreme Programming)的核心實(shí)踐。它的主要推動(dòng)者是 Kent Beck。
TDD 有三層含義:
- Test-Driven Development,測(cè)試驅(qū)動(dòng)開發(fā)。
- Task-Driven Development,任務(wù)驅(qū)動(dòng)開發(fā),要對(duì)問題進(jìn)行分析并進(jìn)行任務(wù)分解。
- Test-Driven Design,測(cè)試保護(hù)下的設(shè)計(jì)改善。TDD 并不能直接提高設(shè)計(jì)能力,它只是給你更多機(jī)會(huì)和保障去改善設(shè)計(jì)。
TDD 編碼方式
- 先分解任務(wù),分離關(guān)注點(diǎn)(后面有演示)
- 列 Example,用實(shí)例化需求,澄清需求細(xì)節(jié)
- 寫測(cè)試,只關(guān)注需求,程序的輸入輸出,不關(guān)心中間過程
- 寫實(shí)現(xiàn),不考慮別的需求,用最簡(jiǎn)單的方式滿足當(dāng)前這個(gè)小需求即可
- 重構(gòu),用手法消除代碼里的壞味道
- 寫完,手動(dòng)測(cè)試一下,基本沒什么問題,有問題補(bǔ)個(gè)用例,修復(fù)
- 轉(zhuǎn)測(cè)試,小問題,補(bǔ)用例,修復(fù)
- 代碼整潔且用例齊全,信心滿滿地提交
TDD 的好處
降低開發(fā)者負(fù)擔(dān)
通過明確的流程,讓我們一次只關(guān)注一個(gè)點(diǎn),思維負(fù)擔(dān)更小。
保護(hù)網(wǎng)
TDD 的好處是覆蓋完全的單元測(cè)試,對(duì)產(chǎn)品代碼提供了一個(gè)保護(hù)網(wǎng),讓我們可以輕松地迎接需求變化或改善代碼的設(shè)計(jì)。
所以如果你的項(xiàng)目需求穩(wěn)定,一次性做完,后續(xù)沒有任何改動(dòng)的話,能享受到 TDD 的好處就比較少了。
提前澄清需求
先寫測(cè)試可以幫助我們?nèi)ニ伎夹枨螅⑻崆俺吻逍枨蠹?xì)節(jié),而不是代碼寫到一半才發(fā)現(xiàn)不明確的需求。
快速反饋
有很多人說 TDD 時(shí),我的代碼量增加了,所以開發(fā)效率降低了。但是,如果沒有單元測(cè)試,你就要手工測(cè)試,你要花很多時(shí)間去準(zhǔn)備數(shù)據(jù),啟動(dòng)應(yīng)用,跳轉(zhuǎn)界面等,反饋是很慢的。準(zhǔn)確說,快速反饋是單元測(cè)試的好處。
TDD 的基本流程是:紅,綠,重構(gòu)。
更詳細(xì)的流程是:
- 寫一個(gè)測(cè)試用例
- 運(yùn)行測(cè)試
- 寫剛好能讓測(cè)試通過的實(shí)現(xiàn)
- 運(yùn)行測(cè)試
- 識(shí)別壞味道,用手法修改代碼
- 運(yùn)行測(cè)試