(筆記)理解單元測試

理解概念

1、單元測試的概念理解

單元測試是指,對軟件中的最小可測試單元在與程序其他部分相隔離的情況下進行檢查和驗證的工作,這裏的最小可測試單元通常是指函數或者類。

一個工廠生產電視機的例子。如果把電視機的生產、測試和軟件的開發、測試進行類比,你可以發現:

  • 電子元器件就像是軟件中的單元,通常是函數或者類,對單個元器件的測試就像是軟件測試中的單元測試
  • 組裝完成的功能電路板就像是軟件中的模塊,對電路板的測試就像是軟件中的集成測試
  • 電視機全部組裝完成就像是軟件完成了預發佈版本,電視機全部組裝完成後的開機測試就像是軟件中的系統測試

2、單元測試對開發的好處

  1. 單元測試屬於最嚴格的軟件測試手段,是最接近代碼底層實現的驗證手段,可以在軟件開發的早期以最小的成本保證局部代碼的質量。
  2. 單元測試都是以自動化的方式執行,所以在大量回歸測試的場景下更能帶來高收益。
  3. 單元測試的實施過程還可以幫助開發工程師改善代碼的設計與實現,並能在單元測試代碼裏提供函數的使用示例,因爲單元測試的具體表現形式就是對函數以各種不同輸入參數組合進行調用,這些調用方法構成了函數的使用說明。

掌握方法

如何做好單元測試?你首先必須弄清楚單元測試的對象是代碼,以及代碼的基本特徵和產生錯誤的原因,然後你必須掌握單元測試的基本方法和主要技術手段。
1、代碼基本特徵與產生錯誤的原因

無論是開發語言還是腳本語言,都會有條件分支、循環處理和函數調用等最基本的邏輯控制,如果拋開代碼需要實現的具體業務邏輯,僅看代碼結構的話,你會發現所有的代碼都是在對數據進行分類處理,每一次條件判定都是一次分類處理,嵌套的條件判定或者循環執行,也是在做分類處理。

可見,要做到代碼功能邏輯正確,必須做到分類正確並且完備無遺漏,同時每個分類的處理邏輯必須正確。而在開發實踐的過程中,通常考慮從以下方面考慮

  • 如果要實現正確的功能邏輯,會有哪幾種正常的輸入
  • 是否有需要特殊處理的多種邊界輸入
  • 各種潛在非法輸入的可能性以及如何處理。

2、測試用例
單元測試的用例是一個輸入數據預計輸出的集合。
完整的輸入數據

被測試函數的輸入參數;
被測試函數內部需要讀取的全局靜態變量;
被測試函數內部需要讀取的成員變量;
函數內部調用子函數獲得的數據;
函數內部調用子函數改寫的數據;
嵌入式系統中,在中斷調用時改寫的數據

明確的預計輸出

被測試函數的返回值;
被測試函數的輸出參數;
被測試函數所改寫的成員變量;
被測試函數所改寫的全局變量;
被測試函數中進行的文件更新;
被測試函數中進行的數據庫更新;
被測試函數中進行的消息隊列更新;

3、驅動代碼樁代碼Mock代碼
驅動代碼樁代碼Mock代碼,是單元測試中最常出現的三個名詞

  • 驅動代碼,指調用被測函數的代碼,單元測試過程中,驅動模塊通常包括調用被測函數前的數據準備、調用被測函數以及驗證相關結果三個步驟。驅動代碼的結構,通常由單元測試的框架決定。
  • 樁代碼,是用來代替真實代碼的臨時代碼。 比如,某個函數 A 的內部實現中調用了一個尚未實現的函數 B,爲了對函數 A 的邏輯進行測試,那麼就需要模擬一個函數 B,這個模擬的函數 B 的實現就是所謂的樁代碼。
  • Mock,Mock 代碼和樁代碼非常類似,都是用來代替真實代碼的臨時代碼,起到隔離和補齊的作用。在使用 Mock 代碼的測試中,對於結果的驗證(也就是 assert),通常出現在 Mock 函數中。

實際流程

實際軟件項目中開展單元測試

  1. 並不是所有的代碼都要進行單元測試,通常只有底層模塊或者核心模塊的測試中才會採用單元測試。
  2. 你需要確定單元測試框架的選型,這和開發語言直接相關。
  3. 爲了能夠衡量單元測試的代碼覆蓋率,通常你還需要引入計算代碼覆蓋率的工具。
  4. 最後你需要把單元測試執行、代碼覆蓋率統計和持續集成流水線做集成,以確保每次代碼遞交,都會自動觸發單元測試,並在單元測試執行過程中自動統計代碼覆蓋率,最後以“單元測試通過率”和“代碼覆蓋率”爲標準來決定本次代碼遞交是否能夠被接受。

總結

全部筆記內容從茹炳晟的《軟件測試52講》整理。

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章