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