Clean Code 無(wú)瑕的程式碼 第9章 單元測(cè)試
? ? ? ?第九章是非常重要的一章!作者提到了測(cè)試驅(qū)動(dòng)程式開(kāi)發(fā)(Test Driven Development)。說(shuō)到「測(cè)試」兩字,給人的印象是重要性不如正式的產(chǎn)品程式,通常測(cè)試程式寫完立刻就會(huì)被丟棄。測(cè)試驅(qū)動(dòng)程式開(kāi)發(fā)的寫法產(chǎn)品程式與測(cè)試程式的關(guān)係如同太極圖的陰與陽(yáng)同樣重要,兩者是對(duì)立又相依的關(guān)係。
TDD的三大法則
第一法則:在寫一個(gè)單元測(cè)試前,不寫產(chǎn)品程式。
第二法則:只寫剛好無(wú)法通過(guò)的單元測(cè)試。
第三法則:只寫剛好能通過(guò)測(cè)試失敗的產(chǎn)品程式。
說(shuō)人話吧!傳統(tǒng)軟體開(kāi)發(fā)方法是先寫產(chǎn)品程式,再寫測(cè)試程式。測(cè)試驅(qū)動(dòng)程式開(kāi)發(fā)先寫測(cè)試程式,再寫產(chǎn)品程式。
此處的測(cè)試程式是每的小單元都有測(cè)試程式,測(cè)試程式只比產(chǎn)品程式早幾秒寫,幾乎是兩者同時(shí)開(kāi)發(fā)。
讓測(cè)試程式整潔
作者分享自己的工作經(jīng)驗(yàn),測(cè)試程式依然要保持整潔,不然到最後雜亂無(wú)章的測(cè)試程式也會(huì)被拋棄。沒(méi)有測(cè)試程式之後就會(huì)出現(xiàn)惡性循環(huán),變成不敢修改產(chǎn)品程式導(dǎo)致軟體品質(zhì)下降。
作者認(rèn)為測(cè)試程式與產(chǎn)品程式一樣重要。
測(cè)試帶來(lái)更多的好處
測(cè)試程式讓產(chǎn)品程式保持?jǐn)U充性、可維護(hù)性。有測(cè)試程式讓人不怕修改軟體程式。
整潔的測(cè)試
可讀性最重要,測(cè)試程式要寫得簡(jiǎn)單明瞭。
9-1是錯(cuò)誤示範(fàn),寫得太複雜。
9-2是重構(gòu)之後簡(jiǎn)潔的範(fàn)例。
每個(gè)測(cè)試程式單元呈現(xiàn)了建造、操作、檢查三個(gè)部分。
範(fàn)例中assert開(kāi)頭的函數(shù)是測(cè)試程式
特定領(lǐng)域的測(cè)試語(yǔ)言
測(cè)試程式寫多了可以演化出測(cè)試API。
雙重標(biāo)準(zhǔn)
測(cè)試程式注重可讀性,可以犧牲效率。
一個(gè)測(cè)試一次斷言(Assert)
斷言數(shù)量越少越好。
一個(gè)測(cè)試一個(gè)概念
相當(dāng)於一個(gè)測(cè)試不要測(cè)試太多項(xiàng)目。
FIRST
整潔的測(cè)試遵循五個(gè)法則
Fast
測(cè)試程式執(zhí)行快速
Independent
每個(gè)測(cè)試程式能夠獨(dú)立運(yùn)行,不用管其他測(cè)試程式
Repeatable
任何系統(tǒng)環(huán)境都能夠執(zhí)行測(cè)試程式
Self-Validating?
測(cè)試程式的輸出是對(duì)或錯(cuò)(true or false)
Timely
測(cè)試程式要在產(chǎn)品程式「之前不久」撰寫
總結(jié)
測(cè)試程式與產(chǎn)品程式同等重要,甚至更重要。測(cè)試程式腐化會(huì)導(dǎo)致產(chǎn)品程式接著腐化,引發(fā)惡性循環(huán)。
我覺(jué)得測(cè)試驅(qū)動(dòng)程式開(kāi)發(fā)(Test Driven Development)是好東西,無(wú)奈要實(shí)際運(yùn)作有很大的困難,通常軟體公司的每個(gè)人進(jìn)度都被安排好,不可能再安排時(shí)間再寫詳盡的測(cè)試程式,更何況做到本章節(jié)所言測(cè)試先行、測(cè)試程式與產(chǎn)品程式同時(shí)開(kāi)發(fā)。
雖然如此有機(jī)會(huì)「制度環(huán)境許可」的情況下,還是試試看測(cè)試驅(qū)動(dòng)程式開(kāi)發(fā)(Test Driven Development)的寫作方法。