單元測(cè)試之誤解與困境
認(rèn)為單元測(cè)試影響開(kāi)發(fā)進(jìn)度,一是借口,拒絕對(duì)單元測(cè)試相關(guān)知識(shí)進(jìn)行學(xué)習(xí)(單元測(cè)試,代碼重構(gòu),版本管理是開(kāi)發(fā)人員的必備);二是單元測(cè)試是“先苦后甜”,剛開(kāi)始搭建環(huán)境,引入額外工作,看似“影響進(jìn)度”,但長(zhǎng)遠(yuǎn)來(lái)看,由于程序質(zhì)量提升、代碼返工減少、后期維護(hù)工作量縮小、項(xiàng)目風(fēng)險(xiǎn)降低,從而在整體上贏了回來(lái)。
誤解一:影響開(kāi)發(fā)進(jìn)度
一旦編碼完成,開(kāi)發(fā)人員總是會(huì)迫切希望進(jìn)行軟件的集成工作,這樣他們就能夠看到系統(tǒng)實(shí)際運(yùn)行效果。這在外表上看來(lái)好像加快進(jìn)度,而像單元測(cè)試這樣的活動(dòng)被看作是影響進(jìn)度原因之一,推遲了對(duì)整個(gè)系統(tǒng)進(jìn)行集成測(cè)試的時(shí)間。
在實(shí)踐中,這種開(kāi)發(fā)步驟常常會(huì)導(dǎo)致這樣的結(jié)果:軟件甚至無(wú)法運(yùn)行。更進(jìn)一步的結(jié)果是大量的時(shí)間將被花費(fèi)在跟蹤那些包含在獨(dú)立單元里的簡(jiǎn)單Bug上面,在個(gè)別情況下,這些Bug也許是瑣碎和微不足道的,但是總的來(lái)說(shuō),它們會(huì)導(dǎo)致推遲軟件產(chǎn)品交付的時(shí)間,而且也無(wú)法確保它能夠可靠運(yùn)行。
在實(shí)際工作中,進(jìn)行了完整計(jì)劃的單元測(cè)試和編寫實(shí)際的代碼所花費(fèi)的精力大致上是相同的。一旦完成了這些單元測(cè)試工作,很多Bug將被糾正,開(kāi)發(fā)人員能夠進(jìn)行更高效的系統(tǒng)集成工作。這才是真實(shí)意義上的進(jìn)步,所以說(shuō)完整計(jì)劃下的單元測(cè)試是對(duì)時(shí)間的更高效利用。
誤解二:增加開(kāi)發(fā)成本
如果不重視程序中那些未被發(fā)現(xiàn)的Bug可能帶來(lái)的后果。這種后果的嚴(yán)重程度可以從一個(gè)Bug引起的用戶使用不便到系統(tǒng)崩潰。這種后果可能常常會(huì)被軟件的開(kāi)發(fā)人員所忽視,這種情況會(huì)長(zhǎng)期損害軟件開(kāi)發(fā)商的聲譽(yù),并且會(huì)對(duì)未來(lái)的市場(chǎng)產(chǎn)生負(fù)面影響。相反地,一個(gè)可靠的軟件系統(tǒng)的良好的聲譽(yù)將有助于一個(gè)軟件開(kāi)發(fā)商獲取未來(lái)的市場(chǎng)。
很多研究成果表明,無(wú)論什么時(shí)候作出修改都要進(jìn)行完整的回歸測(cè)試,在生命周期中盡早地對(duì)軟件產(chǎn)品進(jìn)行測(cè)試將使效率和質(zhì)量得到最好的保證。Bug發(fā)現(xiàn)得越晚,修改它所需的費(fèi)用就越高,因此從經(jīng)濟(jì)角度來(lái)看,應(yīng)該盡可能早地查找和修改Bug。而單元測(cè)試就是一個(gè)在早期抓住Bug的機(jī)會(huì)。
相比后階段的測(cè)試,單元測(cè)試的創(chuàng)建更簡(jiǎn)單,且維護(hù)更容易,同時(shí)可以更方便地進(jìn)行重構(gòu)。從全程的費(fèi)用來(lái)考慮,相比起那些復(fù)雜且曠日持久的集成測(cè)試,或是不穩(wěn)定的軟件系統(tǒng)來(lái)說(shuō),單元測(cè)試所需的費(fèi)用是很低的。
誤解三:我是個(gè)編程高手,無(wú)須進(jìn)行單元測(cè)試
在每個(gè)開(kāi)發(fā)團(tuán)隊(duì)中都至少有一個(gè)這樣的開(kāi)發(fā)人員,他非常擅長(zhǎng)于編程,他開(kāi)發(fā)的軟件總是在第一時(shí)間就可以正常運(yùn)行,因此不需要進(jìn)行測(cè)試。你是否經(jīng)常聽(tīng)到這樣的借口?在現(xiàn)實(shí)世界里,每個(gè)人都會(huì)犯錯(cuò)誤。即使某個(gè)開(kāi)發(fā)人員可以抱著這種態(tài)度在很少的一些簡(jiǎn)單程序中應(yīng)付過(guò)去,但真正的軟件系統(tǒng)是非常復(fù)雜的。真正的軟件系統(tǒng)不可以寄希望于沒(méi)有進(jìn)行廣泛的測(cè)試和Bug修改過(guò)程就可以正常工作。編碼不是一個(gè)可以一次性通過(guò)的過(guò)程。在現(xiàn)實(shí)世界中,軟件產(chǎn)品必須進(jìn)行維護(hù)以對(duì)功能需求的改變作出及時(shí)響應(yīng),并且要對(duì)最初的開(kāi)發(fā)工作遺留下來(lái)的Bug進(jìn)行修改。你希望依靠那些原始作者進(jìn)行修改嗎?這些制造出未經(jīng)測(cè)試的代碼的資深工程師們還會(huì)繼續(xù)在其他地方制造這樣的代碼。在開(kāi)發(fā)人員做出修改后進(jìn)行可重復(fù)的單元測(cè)試,可以避免產(chǎn)生那些令人不快的負(fù)作用。
誤解四:測(cè)試人員會(huì)測(cè)出所有Bug
一旦軟件可以運(yùn)行了,開(kāi)發(fā)人員又要面對(duì)這樣的問(wèn)題:在考慮軟件全局復(fù)雜性的前提下對(duì)每個(gè)單元進(jìn)行全面的測(cè)試。這是一件非常困難的事情,甚至在創(chuàng)造一種單元調(diào)用的測(cè)試條件時(shí),要全面考慮單元被調(diào)用時(shí)的各種入口參數(shù)。在軟件集成階段,對(duì)單元功能全面測(cè)試的復(fù)雜程度遠(yuǎn)遠(yuǎn)超過(guò)獨(dú)立進(jìn)行的單元測(cè)試過(guò)程。
最后的結(jié)果是測(cè)試將無(wú)法達(dá)到它所應(yīng)該有的全面性。一些缺陷將被遺漏,并且很多Bug將被忽略過(guò)去。讓我們類比一下,假設(shè)我們要清理一臺(tái)電腦主機(jī)中的灰塵,如果沒(méi)有把主機(jī)中各個(gè)部件(顯卡、內(nèi)存等)拆開(kāi),無(wú)論你用什么工具,一些灰塵還會(huì)隱藏在主機(jī)的某些角落無(wú)法清理。但我們換個(gè)角度想想,如果把主機(jī)每個(gè)部件一一拆開(kāi),這些死角中的灰塵就容易被發(fā)現(xiàn)和接觸到了,并且每一部件的灰塵都可以毫不費(fèi)力地進(jìn)行清理。
單元測(cè)試之困境
測(cè)試在軟件開(kāi)發(fā)過(guò)程中一直都是備受關(guān)注的,測(cè)試不僅僅局限于軟件開(kāi)發(fā)中的一個(gè)階段,它已經(jīng)開(kāi)始貫穿于整個(gè)軟件開(kāi)發(fā)過(guò)程。大家普遍認(rèn)識(shí)到,如果測(cè)試能在開(kāi)發(fā)階段進(jìn)行有效執(zhí)行,程序的Bug就會(huì)被及早發(fā)現(xiàn),其質(zhì)量就能得到有效的保證,從而減少軟件開(kāi)發(fā)總成本。但是,相對(duì)于測(cè)試這個(gè)詞的流行程度而言,大家對(duì)單元測(cè)試的認(rèn)知普遍存在一些偏差,特別是一些程序員很容易陷入一些誤區(qū),導(dǎo)致了測(cè)試并沒(méi)有在他們所在的開(kāi)發(fā)項(xiàng)目中起到有效的作用。下面對(duì)一些比較具有代表性的誤區(qū)困境進(jìn)行剖析,并對(duì)于測(cè)試背后所蘊(yùn)含的一些設(shè)計(jì)思考進(jìn)行闡述,希望能夠起到拋磚引玉的作用。
誤區(qū)、困境一:使用System.out.print跟蹤和運(yùn)行程序就夠了
這個(gè)誤區(qū)可以說(shuō)是程序員的一種通病,認(rèn)為使用System.out.print就可以確保編寫代碼的正確性,無(wú)須編寫測(cè)試用例,他們覺(jué)得編寫用例是在“浪費(fèi)時(shí)間”。使用System.out.print輸出結(jié)果,以肉眼觀察這種刀耕火種的方式進(jìn)行測(cè)試,不僅效率低下,而且容易出錯(cuò)。
誤區(qū)、困境二:存在太多無(wú)法測(cè)試的東西
在編碼的時(shí)候,確實(shí)存在一些看起來(lái)比較難測(cè)試的代碼,但是并非無(wú)法測(cè)試。并且在大多數(shù)情況下,還是由于被測(cè)試的代碼在設(shè)計(jì)時(shí)沒(méi)有考慮到可測(cè)試性的問(wèn)題。編寫程序不僅與第三方一些框架耦合過(guò)緊,而且過(guò)于依賴其運(yùn)行環(huán)境,從而表現(xiàn)出被測(cè)試的代碼本身很難測(cè)試。
誤區(qū)、困境三:測(cè)試代碼可以隨意寫
編寫測(cè)試代碼時(shí)抱著一種隨意的態(tài)度,沒(méi)有弄清測(cè)試的真正意圖。編寫測(cè)試代碼只是為了應(yīng)付任務(wù)而已,先編寫程序?qū)崿F(xiàn)代碼,然后才去編寫一些單元測(cè)試。表現(xiàn)出來(lái)的結(jié)果是測(cè)試過(guò)于簡(jiǎn)單,只走形式和花架,將大量Bug傳遞給系統(tǒng)測(cè)試人員。
誤區(qū)、困境四:不關(guān)心測(cè)試環(huán)境
手工搭建測(cè)試環(huán)境,測(cè)試數(shù)據(jù),造成維護(hù)困難,占據(jù)了大量時(shí)間,嚴(yán)重影響效率。對(duì)測(cè)試產(chǎn)生的“垃圾”不清除,不處理。造成測(cè)試不能重復(fù)進(jìn)行,導(dǎo)致脆弱的測(cè)試,需要維護(hù)好測(cè)試環(huán)境,做一個(gè)“低碳環(huán)保”的測(cè)試者。
誤區(qū)、困境五:測(cè)試環(huán)境依賴性大
測(cè)試環(huán)境依賴性大,沒(méi)有有效隔離測(cè)試目標(biāo)及其依賴環(huán)境,一是使測(cè)試不聚焦;二是常因依賴環(huán)境的影響造成失敗;三是因依賴環(huán)境太厚重從而降低測(cè)試的效率(如依賴數(shù)據(jù)庫(kù)或依賴網(wǎng)絡(luò)資源,如郵件系統(tǒng)、Web服務(wù))。
posted on 2012-05-03 09:53 順其自然EVO 閱讀(209) 評(píng)論(0) 編輯 收藏 所屬分類: 測(cè)試學(xué)習(xí)專欄