為什么要進(jìn)行單元測(cè)試?
單元測(cè)試保證局部代碼的質(zhì)量
單元測(cè)試改良項(xiàng)目代碼的整體結(jié)構(gòu)
單元測(cè)試降低測(cè)試、維護(hù)升級(jí)的成本
單元測(cè)試使開發(fā)過(guò)程適應(yīng)頻繁變化的需求
單元測(cè)試有助于提升程序員的能力
由誰(shuí)進(jìn)行測(cè)試?開發(fā)部門還是測(cè)試部門?
應(yīng)該由開發(fā)部門進(jìn)行單元測(cè)試!
由測(cè)試部門進(jìn)行單元測(cè)試的問(wèn)題:代價(jià)高,人手不足,耽誤了測(cè)試部門對(duì)其他測(cè)試的準(zhǔn)備工作。
由開發(fā)部門進(jìn)行單元測(cè)試的問(wèn)題:擔(dān)心影響開發(fā)進(jìn)度,程序員不習(xí)慣做單元測(cè)試,測(cè)試自己編寫的代碼,難于保證測(cè)試的效果。
無(wú)論由哪個(gè)部門做單元測(cè)試,都要面對(duì)一些問(wèn)題,但開發(fā)部門所面對(duì)的問(wèn)題可以借助工具來(lái)解決,而由測(cè)試部門進(jìn)行單元測(cè)試,要么無(wú)法真正實(shí)施,要么代價(jià)昂貴。
由測(cè)試部門進(jìn)行單元測(cè)試為什么成本昂貴?
需多次重復(fù)理解程序
反復(fù)溝通需要大量時(shí)間成本
不利于發(fā)揮單元測(cè)試對(duì)代碼結(jié)構(gòu)的約束機(jī)制
耽誤測(cè)試部門對(duì)其他測(cè)試的準(zhǔn)備工作
即使測(cè)試部門人手充裕,僅僅從效益來(lái)考慮,也不應(yīng)該由測(cè)試部門進(jìn)行單元測(cè)試。如果測(cè)試部門本來(lái)就人力不充裕(進(jìn)行單元測(cè)試的人員需具備編碼能力),勉強(qiáng)由測(cè)試部門進(jìn)行單元測(cè)試,結(jié)果往往是----沒(méi)有結(jié)果。
由開發(fā)部門進(jìn)行單元測(cè)試能保證測(cè)試效果嗎?
程序員測(cè)試自己編寫的代碼,往往只考慮“正常狀況”,這當(dāng)然會(huì)影響測(cè)試效果。但如果所用的單元測(cè)試工具能夠統(tǒng)計(jì)各種白盒覆蓋率,就能檢查測(cè)試效果。當(dāng)然,只做到這一點(diǎn)還是不夠的,因?yàn)榘缀懈采w具有逾后逾難的特點(diǎn),達(dá)到一定的覆蓋率后,覆蓋率的提升會(huì)很困難。如果測(cè)試工具功能足夠強(qiáng)大,能提供工具幫助用戶快速地設(shè)計(jì)測(cè)試用例,達(dá)到完整的白盒覆蓋,那么測(cè)試效果就能得到完全的保證。
實(shí)際上,如果沒(méi)有充分的統(tǒng)計(jì)數(shù)據(jù),沒(méi)有達(dá)到足夠的測(cè)試完整性,那么由誰(shuí)做單元測(cè)試,效果都不能保證。
邊編碼邊測(cè)試會(huì)影響編碼進(jìn)度嗎?
傳統(tǒng)的單元測(cè)試是很費(fèi)時(shí)費(fèi)力的工作,主要時(shí)間消耗在于:編寫測(cè)試代碼、設(shè)計(jì)測(cè)試用例,如果開發(fā)工具能自動(dòng)生成測(cè)試代碼,并且具有快速設(shè)計(jì)測(cè)試用例的功能,那么測(cè)試費(fèi)時(shí)就很少;另一方面,如果測(cè)試工具還能提供數(shù)據(jù),幫助程序員整理編程思路、快速發(fā)現(xiàn)錯(cuò)誤,更高效地調(diào)試,那么就能大量提高開發(fā)效率,抵銷測(cè)試所消耗的時(shí)間,不但不會(huì)影響編碼進(jìn)度,甚至加快編碼進(jìn)度。
實(shí)施單元測(cè)試需要改變開發(fā)流程嗎?
邊開發(fā)邊測(cè)試,單元測(cè)試是編碼行為而不是測(cè)試行為,測(cè)試代碼看作是項(xiàng)目代碼的一部分,程序員提交產(chǎn)品代碼時(shí)也要提交測(cè)試代碼和測(cè)試報(bào)告,其他流程可以不作任何改變。
另一方面,在充分單元測(cè)試的基礎(chǔ)上,由于具有高質(zhì)量的局部代碼,良好的整體代碼結(jié)構(gòu),保證了代碼的可擴(kuò)展性和可復(fù)用性,同時(shí),自動(dòng)回歸測(cè)試支持對(duì)代碼的頻繁修改而不用擔(dān)心引入新的錯(cuò)誤,因此,開發(fā)流程自然會(huì)變得敏捷,可以適應(yīng)頻繁變化的需求,使系統(tǒng)分析、架構(gòu)設(shè)計(jì)和后期測(cè)試的壓力減輕,自然而有效地改進(jìn)了開發(fā)流程。
單元測(cè)試測(cè)試哪些代碼?
單元測(cè)試通常不測(cè)試很簡(jiǎn)單的代碼,一般也不測(cè)試“邊界代碼”。很簡(jiǎn)單的代碼容易理解,例如Get/Set函數(shù),這里解釋一下“邊界代碼”。“邊界代碼”是指用于與外部系統(tǒng)交互的代碼,例如用于處理用戶界面的代碼。數(shù)據(jù)庫(kù)、文件、網(wǎng)絡(luò)都可以看作是外部系統(tǒng),用于讀寫數(shù)據(jù)庫(kù)或文件、或訪問(wèn)網(wǎng)絡(luò)的代碼也可以看作是“邊界代碼”,這類代碼應(yīng)該獨(dú)立出來(lái),可以進(jìn)行單元測(cè)試,但對(duì)這些代碼的單元測(cè)試通常不能自動(dòng)驗(yàn)證預(yù)期輸出,而是需要人工察看。編程時(shí),不要把普通代碼與“邊界代碼”混在一起,例如,不要把各種運(yùn)算直接寫在界面類中,做到了這一點(diǎn),絕大多數(shù)代碼都可以進(jìn)行單元測(cè)試。
實(shí)際工作中,單元測(cè)試能實(shí)現(xiàn)什么程度的測(cè)試覆蓋?
單元測(cè)試的最低要求是100%語(yǔ)句覆蓋,這個(gè)覆蓋率還是不夠的,最好實(shí)現(xiàn)多種覆蓋的組全,比較理想的覆蓋率組合是:100%的語(yǔ)句、條件、分支、路徑覆蓋,另外,測(cè)試工具最好還能自動(dòng)生成邊界測(cè)試用例捕捉未處理特殊輸入形成的錯(cuò)誤。在達(dá)到這種覆蓋之后,殘留的編碼錯(cuò)誤可以幾乎說(shuō)沒(méi)有了(設(shè)計(jì)方面的錯(cuò)誤除外,這些屬于集成或系統(tǒng)測(cè)試的范疇)。
單元測(cè)試如何改良項(xiàng)目代碼的整體結(jié)構(gòu)?
具有良好整體結(jié)構(gòu)的代碼,應(yīng)該符合“低耦合”的特性,即具有“可測(cè)性”。測(cè)試不具有“可測(cè)性”的代碼時(shí)一般會(huì)產(chǎn)生編譯錯(cuò)誤,或者需要打樁才能測(cè)試,從而將問(wèn)題暴露出來(lái)。發(fā)現(xiàn)問(wèn)題后,重構(gòu)代碼、消除不當(dāng)耦合一般不難,這種簡(jiǎn)單的重構(gòu)將有效地改良代碼的整體結(jié)構(gòu)。
我希望依賴全自動(dòng)的工具來(lái)完成單元測(cè)試,這一想法現(xiàn)實(shí)嗎?
完全自動(dòng)化是一個(gè)美妙的愿望,但由于單元測(cè)試的基本特性,完全自動(dòng)化的單元測(cè)試是不現(xiàn)實(shí)的。
與其他不同,單元測(cè)試是“隔離”的測(cè)試,要求代碼具有可測(cè)性,一個(gè)項(xiàng)目甚至一個(gè)文件中,難免會(huì)有些影響可測(cè)性的代碼,編譯到這些代碼時(shí)常常會(huì)產(chǎn)生編譯錯(cuò)誤,因此,全自動(dòng)的單元測(cè)試工具往往只能測(cè)試小部分代碼,即使使用某種技術(shù)手段屏蔽掉編譯錯(cuò)誤,也得不償失,因?yàn)橥瑫r(shí)也屏蔽掉了改良代碼整體結(jié)構(gòu)的寶貴機(jī)會(huì)。如果采用自底向上的方式,一個(gè)一個(gè)文件測(cè)試,測(cè)試一個(gè)文件前,先將該文件加入測(cè)試工程并編譯,沒(méi)有編譯錯(cuò)誤時(shí)再測(cè)試,這樣可以及時(shí)發(fā)現(xiàn)并消除不當(dāng)耦合,使代碼具有可測(cè)性,這種非全自動(dòng)的方式,可以測(cè)試絕大多數(shù)代碼,也保證了代碼具有良好的整體結(jié)構(gòu)。
另一方面,主要由測(cè)試工具自動(dòng)生成測(cè)試用例來(lái)進(jìn)行測(cè)試往往沒(méi)有實(shí)際意義,因?yàn)闇y(cè)試工具無(wú)法自動(dòng)了解程序的功能,因此,自動(dòng)測(cè)試用例通常只能發(fā)現(xiàn)異常之類的極端錯(cuò)誤,大多數(shù)一般錯(cuò)誤都是無(wú)法發(fā)現(xiàn)的。測(cè)試工具最重要的不是自動(dòng)生成測(cè)試用例,而是能提供快速建立和編輯測(cè)試用例的工具。
如果由開發(fā)部門實(shí)施單元測(cè)試,那么測(cè)試部門要做哪些工作?
推動(dòng)、組織單元測(cè)試的實(shí)施。單元測(cè)試既然叫做“測(cè)試”,開發(fā)部門常常認(rèn)識(shí)不到其重要性和必要性,需要由測(cè)試部門推動(dòng)和協(xié)助組織實(shí)施。
制定單元測(cè)試規(guī)范,培訓(xùn)單元測(cè)試技術(shù)。
檢查、審核單元測(cè)試結(jié)果,保證單元測(cè)試的有效性。
新聞熱點(diǎn)
疑難解答