複製鏈接
請複製以下鏈接發送給好友

代碼覆蓋測試

鎖定
代碼覆蓋(Code coverage)是軟件測試中的一種度量,描述程式中源代碼被測試的比例和程度,所得比例稱為代碼覆蓋率。
中文名
代碼覆蓋測試
度量種類
類    別
軟件測試中的一種度量
標    準
達到80%或 90%
作    用
衡量測試質量的一個重要指標
可信度
不要過於相信覆蓋率數據

代碼覆蓋測試基本信息

在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標,甚至,用代碼覆蓋率來考核測試任務完成情況,比如,代碼覆蓋率必須達到80%或90%。於是乎,測試人員費盡心思設計案例覆蓋代碼。用代碼覆蓋率來衡量,有利也有弊。
代碼覆蓋是由系統化軟件測試所衍生的方式。第一份出版的相關參考資料是Miller及Maloney1963年在ACM通訊上發表的論文 。
覆蓋測試是衡量測試質量的一個重要指標。在對一個軟件產品進行了單元測試組裝測試集成測試以及接口測試等繁多的測試之後,我們能不能就此對軟件的質量產生一定的信心呢?這就需要我們對測試的質量進行考察。如果測試僅覆蓋了代碼的一小部分,那麼不管我們寫了多少測試用例,我們也不能相信軟件質量是有保證的。相反,如果測試覆蓋到了軟件的絕大部分代碼,我們就能對軟件的質量有一個合理的信心。

代碼覆蓋測試度量方式

代碼覆蓋測試函數覆蓋

函數覆蓋(Function Coverage),執行到程序中的每一個函數(或副程式)。

代碼覆蓋測試語句覆蓋

語句覆蓋(Statement Coverage),又稱行覆蓋(Line Coverage),段覆蓋(Segment Coverage),基本塊覆蓋(Basic Block Coverage),這是最常用也是最常見的一種覆蓋方式,就是度量被測代碼中每個可執行語句是否被執行到了。這裏説的是“可執行語句”,因此就不會包括像C++的頭文件聲明,代碼註釋,空行,等等。非常好理解,只統計能夠執行的代碼被執行了多少行。需要注意的是,單獨一行的花括號{}也常常被統計進去。語句覆蓋常常被人指責為“最弱的覆蓋”,它只管覆蓋代碼中的執行語句,卻不考慮各種分支的組合等等。假如你的上司只要求你達到語句覆蓋,那麼你可以省下很多功夫,但是,換來的確實測試效果的不明顯,很難更多地發現代碼中的問題。

代碼覆蓋測試判斷覆蓋

判斷覆蓋(Decision Coverage),又稱分支覆蓋(Branch Coverage),所有邊界覆蓋(All-Edges Coverage),基本路徑覆蓋(Basic Path Coverage),判定路徑覆蓋(Decision-Decision-Path)。它度量程序中每一個判定的分支是否都被測試到了。這句話是需要進一步理解的,應該非常容易和下面説到的條件覆蓋混淆。因此我們直接介紹第三種覆蓋方式,然後和判定覆蓋一起來對比,就明白兩者是怎麼回事了。

代碼覆蓋測試條件覆蓋

條件覆蓋(Condition Coverage),它度量判定中的每個子表達式結果true和false是否被測試到了。

代碼覆蓋測試路徑覆蓋

路徑覆蓋(Path Coverage),又稱斷言覆蓋(Predicate Coverage)。它度量了是否函數的每一個分支都被執行了。 這句話也非常好理解,就是所有可能的分支都執行一遍,有多個分支嵌套時,需要對多個分支進行排列組合,可想而知,測試路徑隨着分支的數量指數級別增加。

代碼覆蓋測試總結

通過上面的學習,我們再回頭想想,覆蓋率數據到底有多大意義。總結如下幾個觀點:
  1. 覆蓋率數據只能代表你測試過哪些代碼,不能代表你是否測試好這些代碼。
  2. 不要過於相信覆蓋率數據。
  3. 不要只拿語句覆蓋率(行覆蓋率)來考核你的測試人員。
  4. 路徑覆蓋率 > 判定覆蓋 > 語句覆蓋
  5. 測試人員不能盲目追求代碼覆蓋率,而應該想辦法設計更多更好的案例,哪怕多設計出來的案例對覆蓋率一點影響也沒有。