單元測(cè)試
單元測(cè)試(Unit Testing)又稱為模塊測(cè)試,是針對(duì)程序模塊來(lái)進(jìn)行正確性檢驗(yàn)的測(cè)試工作。單元就是單個(gè)程序、函數(shù)、過(guò)程等,編寫程序的過(guò)程中前后很可能要進(jìn)行多次單元測(cè)試。
然而在工作中,一般都是追求快速迭代上線,基本很難做到有時(shí)間來(lái)寫測(cè)試用例。雖然大家都知道單元測(cè)試的優(yōu)點(diǎn),也非常認(rèn)同,然而現(xiàn)實(shí)中確很難推行下去。
然而單元測(cè)試也是敏捷開發(fā)的一個(gè)環(huán)節(jié),既然是敏捷,是否是我們對(duì)單元測(cè)試的認(rèn)知還不夠,或者沒(méi)有切合實(shí)際推行單元測(cè)試,導(dǎo)致無(wú)法在項(xiàng)目中推行。
TDD與BDD
- 測(cè)試驅(qū)動(dòng)開發(fā)(Test-Driven Development)
- 行為驅(qū)動(dòng)開發(fā) (Behavior-Driven Development)
一般的開發(fā)模式更偏向于BDD,以往開發(fā)需求,測(cè)試同事編寫需求的測(cè)試用例,然后拉上產(chǎn)品、開發(fā)會(huì)進(jìn)行用例評(píng)審,通過(guò)后,開發(fā)同事根據(jù)需求文檔來(lái)開發(fā)需求,最后按照評(píng)定的測(cè)試用例冒煙測(cè)試和進(jìn)行簡(jiǎn)單功能點(diǎn)測(cè)試就提測(cè)了。
BDD的重點(diǎn)在于可以使用自然語(yǔ)言來(lái)寫測(cè)試用例,常見的測(cè)試用例一般是假定一個(gè)場(chǎng)景、條件,然后在特定場(chǎng)景,應(yīng)該輸出一個(gè)符合預(yù)期的結(jié)果。
而TDD就是使用開發(fā)語(yǔ)言來(lái)寫測(cè)試用例,這個(gè)工作由基本都是由開發(fā)同事完成。
提高認(rèn)知
需要明確一點(diǎn)的就是,TDD 很容易讓人誤解為就是先寫測(cè)試后寫代碼。測(cè)試驅(qū)動(dòng)開發(fā),驅(qū)動(dòng)的意思是由先進(jìn)行軟件方案設(shè)計(jì),再寫測(cè)試用例,最后寫功能性的業(yè)務(wù)代碼。這時(shí)候的測(cè)試用例可能就是一個(gè)方案設(shè)計(jì)的一個(gè)功能點(diǎn),使用開發(fā)環(huán)境運(yùn)行測(cè)試用例是失敗的,因?yàn)楣δ艽a還沒(méi)開始實(shí)現(xiàn)。
所以,我們就不用再糾結(jié)先寫測(cè)試用例有如何困難,理解上有偏差,我們可以把測(cè)試驅(qū)動(dòng)開發(fā)更改為設(shè)計(jì)驅(qū)動(dòng)開發(fā)。重點(diǎn)在軟件方案的設(shè)計(jì)。
TDD開發(fā)流程
TDD的開發(fā)流程簡(jiǎn)單總結(jié)為以下幾點(diǎn)
- 先分解任務(wù),大需求拆分小需求,復(fù)雜邏輯細(xì)分,降低粒度。
- 寫測(cè)試用例,聚焦于用例的注釋和功能說(shuō)明。
- 實(shí)現(xiàn)每個(gè)細(xì)分需求的功能代碼。
- 完善單元測(cè)試用例,運(yùn)行測(cè)試用例。
- 串聯(lián)所有測(cè)試用例,通過(guò)集成測(cè)試。
- 重構(gòu)并review代碼。
以下我畫了一個(gè)簡(jiǎn)單的流程圖,梳理一下開發(fā)流程
Demo
使用一個(gè)用戶登錄模塊的TDD開發(fā)過(guò)程來(lái)演示。
先拆分功能點(diǎn),然后設(shè)計(jì)出軟件方案和流程圖來(lái)。
TDD的用例編寫如下
以上用例寫完第一次運(yùn)行肯定是fail的,因?yàn)槟艽a還沒(méi)開始實(shí)現(xiàn),接下來(lái)的步驟就是完善功能代碼,串聯(lián),集成測(cè)試,重構(gòu)上線。
highlight
- TDD的重點(diǎn)在于軟件方案設(shè)計(jì),功能點(diǎn)細(xì)分,然后使用測(cè)試用例來(lái)記錄下來(lái)。
- 測(cè)試用例即是開發(fā)文檔
- 注重重構(gòu),有測(cè)試用例的前提下,重構(gòu)是成本最低的。