單元測試(模塊測試)是開發(fā)者編寫的一小段代碼,用于檢驗(yàn)被測代碼的一個(gè)很小的、很明確的功能是否正確。通常而言,一個(gè)單元測試是用于判斷某個(gè)特定條件(或者場景)下某個(gè)特定函數(shù)的行為。例如,你可能把一個(gè)很大的值放入一個(gè)有序list 中去,然后確認(rèn)該值出現(xiàn)在list 的尾部?;蛘撸憧赡軙?huì)從字符串中刪除匹配某種模式的字符,然后確認(rèn)字符串確實(shí)不再包含這些字符了。
單元測試是由程序員自己來完成,最終受益的也是程序員自己??梢赃@么說,程序員有責(zé)任編寫功能代碼,同時(shí)也就有責(zé)任為自己的代碼編寫單元測試。執(zhí)行單元測試,就是為了證明這段代碼的行為和我們期望的一致。
工廠在組裝一臺電視機(jī)之前,會(huì)對每個(gè)元件都進(jìn)行測試,這,就是單元測試。
其實(shí)我們每天都在做單元測試。你寫了一個(gè)函數(shù),除了極簡單的外,總是要執(zhí)行一下,看看功能是否正常,有時(shí)還要想辦法輸出些數(shù)據(jù),如彈出信息窗口什么的,這,也是單元測試,把這種單元測試稱為臨時(shí)單元測試。
只進(jìn)行了臨時(shí)單元測試的軟件,針對代碼的測試很不完整,代碼覆蓋率要超過70%都很困難,未覆蓋的代碼可能遺留大量的細(xì)小的錯(cuò)誤,這些錯(cuò)誤還會(huì)互相影響,當(dāng)BUG暴露出來的時(shí)候難于調(diào)試,大幅度提高后期測試和維護(hù)成本,也降低了開發(fā)商的競爭力??梢哉f,進(jìn)行充分的單元測試,是提高軟件質(zhì)量,降低開發(fā)成本的必由之路。
對于程序員來說,如果養(yǎng)成了對自己寫的代碼進(jìn)行單元測試的習(xí)慣,不但可以寫出高質(zhì)量的代碼,而且還能提高編程水平。
要進(jìn)行充分的單元測試,應(yīng)專門編寫測試代碼,并與產(chǎn)品代碼隔離。我認(rèn)為,比較簡單的辦法是為產(chǎn)品工程建立對應(yīng)的測試工程,為每個(gè)類建立對應(yīng)的測試類,為每個(gè)函數(shù)(很簡單的除外)建立測試函數(shù)。首先就幾個(gè)概念談?wù)勎业目捶ā?/p>
一般認(rèn)為,在結(jié)構(gòu)化程序時(shí)代,單元測試所說的單元是指函數(shù),在當(dāng)今的面向?qū)ο髸r(shí)代,單元測試所說的單元是指類。以我的實(shí)踐來看,以類作為測試單位,復(fù)雜度高,可操作性較差,因此仍然主張以函數(shù)作為單元測試的測試單位,但可以用一個(gè)測試類來組織某個(gè)類的所有測試函數(shù)。單元測試不應(yīng)過分強(qiáng)調(diào)面向?qū)ο螅驗(yàn)榫植看a依然是結(jié)構(gòu)化的。單元測試的工作量較大,簡單實(shí)用高效才是硬道理。
有一種看法是,只測試類的接口(公有函數(shù)),不測試其他函數(shù),從面向?qū)ο蠼嵌葋砜?,確實(shí)有其道理,但是,測試的目的是找錯(cuò)并最終排錯(cuò),因此,只要是包含錯(cuò)誤的可能性較大的函數(shù)都要測試,跟函數(shù)是否私有沒有關(guān)系。對于C++來說,可以用一種簡單的方法區(qū)隔需測試的函數(shù):簡單的函數(shù)如數(shù)據(jù)讀寫函數(shù)的實(shí)現(xiàn)在頭文件中編寫(inline函數(shù)),所有在源文件編寫實(shí)現(xiàn)的函數(shù)都要進(jìn)行測試(構(gòu)造函數(shù)和析構(gòu)函數(shù)除外)。
單元測試常用工具有哪些
測試管理工具:可以幫助完成測試計(jì)劃、跟蹤測試運(yùn)行結(jié)果等的工具。這類工具還包括有助于需求、設(shè)計(jì)、編碼測試及缺陷跟蹤的工具;
靜態(tài)分析工具:分析代碼而不執(zhí)行代碼。這種工具檢測某些缺陷比用其它方法更有效,開銷也更小。這種工具一般可以度量代碼的各種指標(biāo),如McCabe測定復(fù)雜度,Logiscope度量代碼和規(guī)范的復(fù)合度等等;
覆蓋率工具:這種工具評估通過一系列測試后,軟件被執(zhí)行的程度。這種工具大量的被應(yīng)用于單元測試中,如PureCoverage、TrueCoverage、Logiscope等;
動(dòng)態(tài)分析工具:這種工具評估正在運(yùn)行的系統(tǒng)。例如,檢查系統(tǒng)運(yùn)行過程中的內(nèi)存使用情況,是否有內(nèi)存越界、內(nèi)存泄露等等,這類工具有Purify、BoundChecker等;
測試執(zhí)行工具:這類工具可使測試能夠自動(dòng)化進(jìn)行,并且各個(gè)層次(單元測試、集成測試、系統(tǒng)測試)的執(zhí)行工具都有。例如系統(tǒng)測試階段有功能測試自動(dòng)化工具,如Robot、Winrunner、SilkTest等;還有性能測試工具,如Loadrunner、SilKPerformer等。
白盒測試工具主要有:
?。?)內(nèi)存資源泄漏檢查:Numega中的bouncechecker,Rational的Purify
(2)代碼覆蓋率檢查:Numega中的truecoverage,Rational的Purecoverage,Telelogic公司的logiscope,Macabe公司的Macabe
?。?)代碼性能檢查:Numega中的truetime,Rational的Quantify
(4)代碼靜態(tài)度量分析質(zhì)量檢查工具:logiscope和Macabe
黑盒測試工具主要有:
?。?)客戶端功能測試:MI公司的winrunner,compuware的qarun,Rational的robot
?。?)服務(wù)器端壓力性能測試:MI公司的winload,compuware的qaload,Rational的SQAload等等
?。?)Web測試工具:MI公司的Astra系列,rsw公司的e-testsuite
?。?)測試管理工具:rational的testmanager,compuware的qadirector等
(5)缺陷跟蹤工具:trackrecord,Testtrack
單元測試工具:
(1)測試框架:delphidunit
?。?)javajunit
?。?)c++cppunit
?。?)VisualBasicVBUnit
?。?)(.NETplatform)NUnit
評論