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