重構(gòu)——構(gòu)筑測試體系
構(gòu)筑測試體系
如果你想進(jìn)行重構(gòu),首要前提就是要擁有一個(gè)可靠的測試環(huán)境。
“編寫優(yōu)良的測試程序,可以極大的提高我的編程速度,即使不進(jìn)行重構(gòu)也是如此。”
1、自我測試代碼(Self-testing Code )的價(jià)值
“Class 應(yīng)該包含他們自己的測試代碼。”
“每個(gè)Class 都有一個(gè)測試函數(shù),并用它測試自己這個(gè) Class 。”
確保所有的測試都完全自動(dòng)化,讓它們檢查自己的測試結(jié)果。
只要寫好一點(diǎn)功能,就立即添加測試。
一整組(a suite of )測試就是一個(gè)強(qiáng)大的“臭蟲”偵測器,能夠大大縮減查找“臭蟲”所需要的時(shí)間。
“實(shí)際上,編寫測試代碼的最有用時(shí)機(jī)是在開始編程之前。當(dāng)你需要添加特性的時(shí)候,先寫相應(yīng)的測試代碼。聽起來離經(jīng)叛道,其實(shí)不然。填寫測試代碼其實(shí)就是問自己:添加這個(gè)功能需要做什么。編寫測試代碼還能使你把注意力集中于接口而非實(shí)現(xiàn)上頭(永遠(yuǎn)是件好事)。預(yù)先寫好的測試代碼也為你的工作按上一個(gè)明確的結(jié)束標(biāo)志:一旦測試代碼運(yùn)行正常,工作就可以結(jié)束了。”
構(gòu)建自我測試的代碼。
2、JUnit測試框架( Testing Framew )
頻繁的運(yùn)行測試,每次編譯請(qǐng)把測試也考慮進(jìn)去,每天至少執(zhí)行每個(gè)測試一次。
“每當(dāng)你接獲臭蟲提報(bào),請(qǐng)先撰寫一個(gè)單元測試來揭發(fā)這只臭蟲。”——如何揭發(fā)?這里需要根據(jù)報(bào)告準(zhǔn)確定位。單元測試會(huì)對(duì)此有幫助嗎?
3、添加更多的測試
“觀察Class 該做的所有事情,然后針對(duì)任何一項(xiàng)功能的任何一種可能失敗的情況,進(jìn)行測試。”
“測試應(yīng)該是一種風(fēng)險(xiǎn)驅(qū)動(dòng)(risk driven )行為,測試的目的是希望找出現(xiàn)在或未來的可能出現(xiàn)的錯(cuò)誤。”
“測試的訣竅是:測試你最擔(dān)心的部分。”
這點(diǎn)和我目前的想法不大相同。我目前的想法是,測試要對(duì)程序做100% 的保證,所以,要測試程序可能行為的每一種情況,保證其正確性。按照我的想法,值域的設(shè)置和訪問函數(shù)也是要測試的。作者的意思是,測試代碼要用最低的成本,獲取最大的收益。這一點(diǎn),要我在實(shí)際的環(huán)境中進(jìn)行抉擇。
“編寫不是十分完美的測試并實(shí)際運(yùn)行,好過對(duì)完美測試的無盡等待。”——我持懷疑態(tài)度。
運(yùn)用測試用例前后執(zhí)行的函數(shù):tearDown 和 setUp,保證測試用例之間相互隔離,而非相互影響。
做一個(gè)懶惰的程序員。
考慮可能出錯(cuò)的邊界條件,把測試火力集中在那兒。
“測試(優(yōu)先)可以調(diào)高編程速度”,這一點(diǎn)我要在實(shí)踐中驗(yàn)證一下,如果真是這樣,那我就要嘗試在我們部門推行這種方法。
“當(dāng)測試達(dá)到一定的程度后,測試效益會(huì)呈現(xiàn)遞減態(tài)勢。”所以,你不要期望通過測試找出所有的bug ,而是要通過測試,找出絕大多數(shù)的 bug 。
這個(gè)地方其實(shí)也符合“二八定律”:即20% 的測試可以找出 80% 的 bug,其余的 80% 的測試可以找出剩下的 20% 的 bug 。我們要做的,就是寫這 20% 的測試,而非 100% 的測試。
posted on 2011-12-05 14:24 順其自然EVO 閱讀(179) 評(píng)論(0) 編輯 收藏