第二部分 實(shí)踐
第六章 測(cè)試驅(qū)動(dòng)設(shè)計(jì)
單元測(cè)試是一項(xiàng)提升代碼質(zhì)量的極佳實(shí)踐 。經(jīng)過(guò)測(cè)試的代碼能更好地保證編碼的意圖和實(shí)際結(jié)果相符。測(cè)試驅(qū)動(dòng)開(kāi)發(fā),因?yàn)閳?jiān)持先寫測(cè)試后寫代碼的方式,帶來(lái)了更多的好處。當(dāng)把軟件工程和其他的工程科學(xué)進(jìn)行比較的時(shí)候(我需要一些隱喻的表達(dá))他們之間的重要差異就會(huì)顯現(xiàn)。
嚴(yán)格遵守TDD(測(cè)試驅(qū)動(dòng)開(kāi)發(fā))的方式還回帶來(lái)非常多的好處!TDD建立了一種消費(fèi)意識(shí):當(dāng)你編寫一個(gè)單元測(cè)試的時(shí)候,其實(shí)你正在創(chuàng)建待開(kāi)發(fā)代碼的第一個(gè)消費(fèi)者。這讓你思考,在測(cè)試之外,我們會(huì)如何使用這個(gè)類。
很多開(kāi)發(fā)人員都有這樣的經(jīng)歷:在寫一個(gè)大類的過(guò)程中,一路伴隨著很多的假設(shè)或者臆斷。然而當(dāng)你真的開(kāi)始使用這個(gè)類時(shí),你才認(rèn)識(shí)到一些假設(shè)是錯(cuò)誤的。然后,你只好去重構(gòu)代碼。TDD要求你在寫代碼之前先創(chuàng)建它的第一個(gè)消費(fèi)者,這會(huì)讓你去思考其他代碼最終會(huì)如何使用這些待開(kāi)發(fā)的代碼。
恩,從自己經(jīng)手的幾個(gè)項(xiàng)目來(lái)看,單元測(cè)試的確都是非常非常重要的。首先你需要保證的是你寫的是100%正確的。。(這雖然不太可能)但起碼當(dāng)用戶需求不變的時(shí)候,你的這個(gè)是正確的。把寫代碼和測(cè)試代碼搞成一個(gè)螺旋開(kāi)發(fā)的事實(shí)。。不斷調(diào)整進(jìn)度。。其實(shí)這樣子才是最省時(shí)省力的方法。
對(duì)設(shè)計(jì)的影響。TDD通過(guò)以下形式,來(lái)改進(jìn)代碼的設(shè)計(jì):
1 它幫你養(yǎng)成了很好的代碼“消費(fèi)意識(shí)”,因?yàn)樵陂_(kāi)始寫代碼之前,就需要?jiǎng)?chuàng)建第一個(gè)消費(fèi)者。
2 保持對(duì)及其簡(jiǎn)單的一些情況進(jìn)行測(cè)試(以及持續(xù)不斷地測(cè)試),能在你不小心把至關(guān)重要的基礎(chǔ)設(shè)施破壞了之后及時(shí)的發(fā)出警告。
3 對(duì)邊界情況的測(cè)試是必不可少的。那些難以被測(cè)試的代碼,可以把它們重構(gòu)得更加簡(jiǎn)單,而如果真的無(wú)法簡(jiǎn)化他們的話,也應(yīng)該想辦法嚴(yán)格測(cè)試它們,不管多么困難。因?yàn)閺?fù)雜的事情更需要測(cè)試
4 永遠(yuǎn)保持把測(cè)試作為構(gòu)建過(guò)程的一部分。軟件中最奇怪的事情,莫過(guò)于在修改一塊完全不相關(guān)的代碼時(shí),不小心出發(fā)的“副作用”。有了單元測(cè)試這張安全網(wǎng),確實(shí)能替你節(jié)省很多的時(shí)間和力氣。
5 有一套健壯的單元測(cè)試,允許你進(jìn)行一些異想天開(kāi)的重構(gòu)游戲(進(jìn)行大量的修改,然后運(yùn)行測(cè)試來(lái)看看這些修改所帶來(lái)的影響)。記得第一次和一些已經(jīng)習(xí)慣于單元測(cè)試的開(kāi)發(fā)人員一起動(dòng)手修改代碼時(shí),我也是非常緊張,因?yàn)榇罅康男薷耐鶗?huì)破壞很多東西,但他們看起來(lái)絲毫沒(méi)有猶豫。逐漸地,我也放下心來(lái),因?yàn)槲衣恼J(rèn)識(shí)到:有了測(cè)試的保證,完全可以發(fā)信大膽地去修改代碼。
以上幾條,的確是金玉良言??!往往開(kāi)發(fā)的成敗與否,都在如此細(xì)節(jié)與習(xí)慣當(dāng)中。