來(lái)源:51Testing軟件測(cè)試網(wǎng)
我曾經(jīng)是一個(gè)不測(cè)試主義者,因?yàn)槲铱床坏綔y(cè)試的價(jià)值。然后,我試了一段時(shí)間,變得對(duì)它深信不疑。我收集了一些經(jīng)驗(yàn),當(dāng)然還遠(yuǎn)遠(yuǎn)不夠。這篇文章總結(jié)了一些我知道的以及我認(rèn)為我知道的內(nèi)容。
“我不總測(cè)試我的代碼,但是當(dāng)我測(cè)試的時(shí)候,感覺(jué)更好?!?/span>—— 我
這是怎么一回事呢?
這,全是因?yàn)榇a:
本文主要關(guān)于單元測(cè)試,而不是集成測(cè)試或端至端的測(cè)試,但在某些方面也可用于其他測(cè)試。在實(shí)踐中,測(cè)試很少是單一的或非此即彼的,并且這也不是目的。
單元測(cè)試成本低廉,因此應(yīng)該成為測(cè)試工作中極大的組成部分。編寫和運(yùn)行單元測(cè)試都很便宜。因?yàn)樗徊榭创a的特定部分。集成測(cè)試則相反,它們包含的代碼更大。
為什么這很重要?
測(cè)試可幫助你對(duì)你的代碼放心。對(duì)一個(gè)稍復(fù)雜的問(wèn)題寫一個(gè)解決方案,然后手動(dòng)測(cè)試,你只需要這么做就可以了。有著一定經(jīng)驗(yàn)的你當(dāng)然可以自信地發(fā)布代碼,但是結(jié)果卻往往是拋棄了發(fā)現(xiàn)錯(cuò)誤的首次機(jī)會(huì)。
測(cè)試能讓你體驗(yàn)?zāi)愕拇a中在極端的條件下是什么樣的。要是傳遞的數(shù)字是負(fù)數(shù),會(huì)怎么樣,在我們總是假定數(shù)值為正的情況下?要是傳遞的根本就不是數(shù)字,會(huì)怎么樣?
“每個(gè)人都會(huì)寫出 bug,我們都寫過(guò) bug。因此,這不是“你能正確地編寫代碼或一次性寫出正確代碼?”的問(wèn)題,我們都寫過(guò)不正確的代碼。這就是我們所做的一切,我們寫的都是不正確的代碼?!?/span>——Joe Eames《JavaScript. Air 004》
編碼是辛苦,我們都應(yīng)該承認(rèn)這一點(diǎn)。其中的主要原因之一就是,你需要測(cè)試代碼,以獲得它能如期表現(xiàn)的信心,不管是什么代碼。
不相信?這里給出了一些附加參數(shù):
測(cè)試過(guò)的代碼更好
許多人會(huì)告訴你,代碼測(cè)試會(huì)導(dǎo)致更好的代碼質(zhì)量。這在使用單元測(cè)試,并且至少在測(cè)試驅(qū)動(dòng)開發(fā)上有所行動(dòng),即使這些行動(dòng)甚為草率時(shí),尤其如此。原因如下:
如果你的代碼難以測(cè)試,那么可能是你代碼沒(méi)有寫好。好代碼的定義是什么,這是一個(gè)大問(wèn)題,但這里要強(qiáng)調(diào)的一句話是一個(gè)很好的經(jīng)驗(yàn)法則,也是大多數(shù)人所贊同的,那就是,好的代碼會(huì)分離關(guān)注點(diǎn)。有經(jīng)驗(yàn)的程序員限制功能體以便于只做一件邏輯上的事情就是這個(gè)原因。
目標(biāo)對(duì)齊
代碼很難測(cè)試可能要么是因?yàn)橛刑嗟氖虑橐^續(xù),要么是因?yàn)橛刑嗟囊蕾嚕ɑ騼烧呓杂校???紤]將此視為協(xié)調(diào)利益的一個(gè)問(wèn)題:在編寫未經(jīng)測(cè)試的代碼時(shí),在速度(或懶惰)和關(guān)注點(diǎn)分離之間存在著利益沖突,并且短期內(nèi)你的代碼是如何被組織的并沒(méi)有那么重要。當(dāng)代碼必須測(cè)試時(shí),你的目標(biāo)更一致,因?yàn)閷?duì)于寫得好的代碼,更易于寫測(cè)試!
像消費(fèi)者一樣思考
當(dāng)你首次編寫測(cè)試時(shí),你首先要設(shè)計(jì)代碼的 API。測(cè)試讓你進(jìn)入代碼消費(fèi)模式,在這種模式下,你的代碼需要面對(duì)其他東西的接口。設(shè)計(jì) API,而不那么關(guān)注內(nèi)部運(yùn)作將導(dǎo)致一個(gè)更佳的 API 設(shè)計(jì),這會(huì)導(dǎo)致模塊的更易消耗,從而促進(jìn)項(xiàng)目代碼的更干凈。
靈感突現(xiàn)
測(cè)試會(huì)讓你靈機(jī)一現(xiàn)。通常情況下,因?yàn)樗仁鼓闳ニ伎歼吘壡闆r——零值,10 ^ 12,null 或 undefined。這使得你有機(jī)會(huì)來(lái)思考。去反省,以及了解在陌生的環(huán)境下會(huì)發(fā)生什么。僅僅是思考這些的過(guò)程,或代碼將面對(duì)的其他情況,都經(jīng)常會(huì)讓你意識(shí)到代碼可以簡(jiǎn)化(以及代碼需要如何保護(hù)自我)。
這些靈感突現(xiàn)的時(shí)刻也可能來(lái)自特別令人沮喪的情況之一:當(dāng)你的代碼和測(cè)試不一致的時(shí)候。你正處于不知道哪個(gè)才正確的兩難境地。如果你碰到這種情況,那么設(shè)計(jì)可能有問(wèn)題,或者你的前提假設(shè)發(fā)生了變化。把它看成是一個(gè)好兆頭!你的代碼將會(huì)更滿意。
測(cè)試可以說(shuō)明代碼做了什么
沒(méi)有人喜歡寫文檔,但當(dāng)你繼承(從一年前的自己,或其他人)或接口的模塊文檔齊全的時(shí)候,絕對(duì)是好的。測(cè)試可以成為這樣一種途徑,并且還有一個(gè)額外的好處是:測(cè)試用實(shí)際行動(dòng)證實(shí)代碼。就如同極佳的科學(xué)教師,他們不只是用嘴巴告訴你,氫氣易燃,而是充了一個(gè)氫氣球,讓它升到天花板上,然后在棍子上放一根點(diǎn)燃的火柴靠近氣球(這是我五年級(jí)時(shí)特別難忘的時(shí)刻之一)。
你知道所有 bug 的共同點(diǎn)嗎?那就是它們經(jīng)過(guò)了所有的測(cè)試。所以,當(dāng)你找到一個(gè) bug 的時(shí)候,就等于知道測(cè)試哪里還需要改進(jìn)。
測(cè)試可以使得更容易地加入項(xiàng)目,因?yàn)樗鼈兘沂玖舜a實(shí)際上應(yīng)該做什么。它們告訴你設(shè)計(jì)決策,以及初始的開發(fā)人員心里在想什么。
不要擔(dān)心,去重構(gòu)吧
也曾看到過(guò)烏七八糟的代碼,但不敢去清理干凈?我在這種情況下要做的首件事是創(chuàng)建測(cè)試來(lái)找出代碼要做什么。測(cè)試可以鎖定功能,用一種很好的方式,使得我們能夠?qū)W⒂凇按髵叱?,而不是?dān)心破壞什么東西。
我見過(guò)一些糟糕到讓人不知道它們是做什么的代碼片段。同樣的,人人避之唯恐不及,不但要擔(dān)心會(huì)破壞預(yù)期的功能,而且還要擔(dān)心破壞 bug。我認(rèn)為基于過(guò)去的I/ O 的大型測(cè)試集是非常值得的投資。
有趣的是,擔(dān)心和快樂(lè)的心情是成反比的??傊且环N此消彼長(zhǎng)的狀態(tài)。
自信地創(chuàng)造價(jià)值和正確的產(chǎn)品
正確的代碼比不正確的代碼更有價(jià)值。一切幫助你的代碼比以前更正確的東西都值得看一看,就這么簡(jiǎn)單。發(fā)布正確的代碼隨著時(shí)間的推移會(huì)構(gòu)建起信任,而信任是一筆寶貴的財(cái)富。
魚與熊掌不可得兼
這里有一個(gè)技巧:不要在試圖解決問(wèn)題的同時(shí),設(shè)計(jì)一個(gè)很好的解決方案。來(lái)自于 Ian Cooper 關(guān)于 TDD 演講中的秘訣是:
編寫紅色測(cè)試。解個(gè)問(wèn)題,盡快讓它變綠。設(shè)計(jì)一個(gè)很好的解決方案,重構(gòu)成你為之驕傲的一個(gè)東西。
這里要掌握的一個(gè)重要內(nèi)容是,在你的大腦中要分離關(guān)注點(diǎn)。不要試圖同時(shí)完成步驟 2 和步驟3。編程的主要限制之一是你的大腦一次能思考多少,并且在你敲代碼時(shí),你需要思考得越少,你寫的代碼越好。
在解決問(wèn)題時(shí),不要去想代碼實(shí)際上應(yīng)該如何。復(fù)制粘貼代碼,寫低效的循環(huán),重復(fù)內(nèi)容,不論是什么只要能盡快讓測(cè)試變綠就去做。然后再考慮如何改進(jìn)。
分離關(guān)注點(diǎn)是首先要測(cè)試的原因之一,這種方法有助于實(shí)踐中行為。當(dāng)你不擇手段地想要快速達(dá)成一個(gè)解決方案時(shí),你不必去考慮它看上去怎么樣或者運(yùn)行起來(lái)快不快。當(dāng)你進(jìn)行到完善設(shè)計(jì)和改善解決方案的時(shí)候,你就不必?fù)?dān)心解決方法行不通了。
詳詢:王萍老師18988787201
詳詢:小文老師18988787201
王萍老師 | 小文老師 |
《中華考試網(wǎng)軟件測(cè)試培訓(xùn)》
《教育軟件測(cè)試培訓(xùn)頻道》
《軟件測(cè)試培訓(xùn)課程——深圳川石》
《深圳川石軟件性能測(cè)試培訓(xùn)》
《深圳川石企業(yè)性能測(cè)試(PL&LR)提升班》
《持續(xù)集成自動(dòng)化測(cè)試UFT Selenium提升班》
《深圳源昊寶安軟件測(cè)試培訓(xùn)班》
《深圳凌岳軟件自動(dòng)化測(cè)試培訓(xùn)班》
《深圳博睿軟件安全測(cè)試培訓(xùn)》
《深圳達(dá)內(nèi)軟件測(cè)試培訓(xùn)學(xué)?!?/a>