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






















