詳細介紹單元測試
單元測試是對軟件基本組成單元/模塊進行的測試,又稱為模塊測試?;締卧?模塊可以是函數(shù)、類實例、方法、存儲過程,也可以是任何具有明確功能、規(guī)格定義、明確接口定義、并且其規(guī)模是一般比較小的程序代碼模塊的組合體。
1、概述
單元測試是對軟件基本組成單元/模塊進行的測試,又稱為模塊測試?;締卧?模塊可以是函數(shù)、類實例、方法、存儲過程,也可以是任何具有明確功能、規(guī)格定義、明確接口定義、并且其規(guī)模是一般比較小的程序代碼模塊的組合體。
單元測試的重點在于發(fā)現(xiàn)程序設(shè)計或?qū)崿F(xiàn)的邏輯錯誤,使問題及早暴露,便于問題的定位解決。
單元測試中多采用白盒測試和黑盒測試相結(jié)合的方法,既關(guān)注單元功能,也關(guān)注程序模塊的邏輯結(jié)構(gòu)。兩者結(jié)合起來,既可以避免由于過多關(guān)注路徑而導(dǎo)致測試工作量很大的問題,又可以避免因從外部設(shè)計測試用例而可能丟失一些路徑的問題。
現(xiàn)今,更多觀點認為單元測試應(yīng)該由編碼人員實施,筆者認為這種觀點是有道理的。畢竟由測試人員實施單元測試比編碼人員實施的工作量更大。當然,如果對于測試航空、航天、醫(yī)療等關(guān)系重大生命、財產(chǎn)的軟件系統(tǒng)來說,需要投入大量的資源來保證系統(tǒng)質(zhì)量時,則可以采用測試人員實施單元測試的策略。
單元測試的重點應(yīng)該以功能測試為主,同時統(tǒng)計測試的覆蓋率,并且測試模塊的輸入/輸出接口是否正確,內(nèi)部的數(shù)據(jù)流是否正確等。
功能測試主要測試模塊是否正確實現(xiàn)了設(shè)計要求的功能,以及有無遺漏的功能。這里有一個功能覆蓋的概念。因為被測試模塊可能包括多個功能點,在做測試時,設(shè)計測試用例要覆蓋這些功能點,以保證這些功能點經(jīng)過測試。一般要求功能覆蓋100%。
覆蓋率一般要求進行語句覆蓋率和分支覆蓋率,同時要求測試所有的關(guān)鍵路徑。關(guān)鍵路徑的表達不是很明確,但是如果要求做基本路徑集覆蓋測試,即使是一個比較小的模塊也是很難做到的。如果使用單元測試工具(如CppUnit、Junit等),則可以統(tǒng)計覆蓋率。
單元測試結(jié)束后,如果有些分支由于各種條件無法覆蓋,則需要給出原因說明。
2、單元測試的步驟
單元測試過程包括計劃、設(shè)計、執(zhí)行、評審等幾個步驟,分別如下所述。
① 計劃:確定測試需求,制訂測試策略,確定測試所用資源(如人員、設(shè)備等),創(chuàng)建測試任務(wù)的時間表。這部分工作可以簡單描述。
② 設(shè)計:設(shè)計單元測試模型,制訂測試方案,制訂具體的測試用例,創(chuàng)建可重用的測試腳本。
③ 執(zhí)行:執(zhí)行測試用例,對單元模塊進行測試,驗證測試的結(jié)果并記錄測試過程中出現(xiàn)的缺陷。
④ 評審:對單元測試的結(jié)果進行評審。主要進行測試完備性評估。
由于單元模塊往往不是一個獨立的程序,在設(shè)計時,要考慮單元模塊同其他模塊的聯(lián)系,用樁模塊和驅(qū)動模塊模擬所測模塊相聯(lián)系的其他模塊。由被測試模塊、驅(qū)動模塊和樁模塊共同構(gòu)成可運行的程序。
驅(qū)動模塊和樁模塊的定義如下所述。
驅(qū)動模塊:相當于被測試模塊的主程序,用于接收數(shù)據(jù)或產(chǎn)生數(shù)據(jù),把數(shù)據(jù)傳遞給被測試模塊,再輸出實測結(jié)果,或把實測結(jié)果同預(yù)期結(jié)果進行比對。
樁模塊:也稱為存根模塊。用以代替被測試模塊調(diào)用的子模塊。樁模塊可以用做數(shù)據(jù)處理,不需要把模塊的所有功能都模擬,可以簡單地返回一個值。
3、單元測試的內(nèi)容
1)單元功能測試
單元功能測試的內(nèi)容如下:
- 單元設(shè)計的功能點是否全部實現(xiàn)。
- 運算的優(yōu)先級和先后執(zhí)行順序是否正確。
- 計算中精度的處理是否正確。
- 計算中的誤差是否會無限放大。
2)模塊接口測試
在單元測試的開始,應(yīng)對所測模塊的數(shù)據(jù)流進行測試。如果數(shù)據(jù)不能正確地輸入和輸出,就不能進行其他測試。
對模塊接口可能需要進行下面的測試外包項目:
- 調(diào)用所測模塊時的輸入?yún)?shù)與模塊的形式參數(shù)在個數(shù)、屬性、順序上是否匹配。
- 所測模塊調(diào)用子模塊時,它輸入給子模塊的參數(shù)與子模塊的形式參數(shù)在個數(shù)、屬性、順序上是否匹配。
- 是否修改了只做輸入用的形式參數(shù)。
- 輸出給標準函數(shù)的參數(shù)在個數(shù)、屬性、順序上是否正確。
- 全局變量的定義在各模塊中是否一致。
- 限制是否通過形式參數(shù)來傳送。
- 模塊對外部文件、數(shù)據(jù)庫進行輸入/輸出時,必須對文件操作進行測試。例如,緩沖區(qū)的大小、是否在讀寫文件前打開文件,在結(jié)束前關(guān)閉文件等。
3)內(nèi)部數(shù)據(jù)流測試
內(nèi)部數(shù)據(jù)流測試包括以下幾點:
- 不正確或不一致的數(shù)據(jù)類型說明。
- 使用尚未賦值或尚未初始化的變量。
- 錯誤的初始值或錯誤的默認值。
- 變量名拼寫錯誤或書寫錯誤。
- 不一致的數(shù)據(jù)類型。
- 全局變量對模塊是否產(chǎn)生影響。
4)邏輯路徑測試
邏輯路徑測試包括以下幾點:
- 是否到達重要的功能點路徑。
- 邏輯判斷的邊界點是否正確。
- 異常/錯誤處理。
- 比較完善的模塊設(shè)計要求能預(yù)見異?;虺鲥e的條件,并設(shè)置適當?shù)漠惓L幚砗统鲥e處理,以便在程序出現(xiàn)異常或錯誤時,能對出錯程序重新進行安排,保證邏輯上的正確性。重點應(yīng)該考慮下面幾個問題:
- 異常或出錯的描述是否可以理解。
- 異常處理是否合理、出錯后對錯誤的定位是否準確。
- 提示的錯誤與實際的錯誤是否一致。
- 對錯誤條件的處理是否正確。
以上提到的很多內(nèi)容在編碼規(guī)范或代碼檢查單中大多已經(jīng)包含,如果模塊在進入單元測試之前,已經(jīng)進行了桌前檢查和同行評審,則模塊中潛在的缺陷就可能比較少。
4、單元測試用例設(shè)計
單元測試中幾乎可以運用所有測試用例設(shè)計方法。
單元測試過程如下所述。
① 單元模塊運行設(shè)計第一個測試用例。第一個測試用例一般是使用最簡單的方法執(zhí)行被測單元。當這個用例可以執(zhí)行時,就能確定測試環(huán)境和測試單元是可用的。
② 設(shè)計被測試單元測試用例。閱讀相關(guān)的設(shè)計說明,每一個測試用例就是通過有針對性地測試說明書中的一項或者多項內(nèi)容,用以驗證設(shè)計說明書所對應(yīng)的功能是否實現(xiàn)。
③ 設(shè)計測試功能異常處理方面的測試用例。用可能導(dǎo)致模塊功能失效的無效數(shù)據(jù),測試模塊對無效數(shù)據(jù)的反應(yīng)是否合理,以及對異?;蝈e誤的處理后模塊的反應(yīng)如何,驗證模塊有沒有做不應(yīng)該做的工作。
④ 設(shè)計其他的測試用例,驗證設(shè)計對模塊的要求。例如計算精度、性能、可恢復(fù)性、安全性等。
⑤ 加載測試用例運行程序,需要查看和記錄測試結(jié)果,尤其是測試結(jié)果與預(yù)期結(jié)果不一致的情況。
⑥ 補充測試用例,執(zhí)行前面測試用例運行沒有覆蓋到的主要分支和 語句。
⑦ 重復(fù)上面的1~6步,直到功能覆蓋、主要邏輯覆蓋、異常條件和邊界覆蓋等。
希望通過本文對單元測試的介紹,能夠給你帶來幫助。
【編輯推薦】