什麼是測試覆蓋率?

顧名思義,軟體測試對被測程式的測試範圍的度量指標,用以評價測試的完全程度。最常用的測試覆蓋率評測方法是基於需求的測試覆蓋率和基於程式碼的測試覆蓋率。

基於需求的測試覆蓋率,不難理解就是指一條設計需求至少有一個測試用例對其進行驗證。實際評測中有兩種方法,一種是設計需求所對應的測試用例執行後即認定獲得對該條需求的測試覆蓋,也可以只將執行通過了的測試用例所對應的需求認定為被覆蓋,通常二者均可被接受。基於需求的測試覆蓋率的高低主要取決於,測試人員是否對每一條設計需求都有針對性地創建和執行測試用例。

基於程式碼的測試覆蓋率,則是從程式碼層面度量測試執行範圍的指標,通過統計有多少/哪些程式碼在測試中被執行到了來衡量測試的完全度。按照統計的準則的不一樣,往往分為語句覆蓋、分支覆蓋、修正的條件/分支覆蓋(MC/DC)、函數覆蓋和函式呼叫覆蓋等多種測試覆蓋率類型。基於程式碼的測試覆蓋率提供了對測試完全度更精確的量化指標。

為什麼要統計測試覆蓋率? 

簡言之,測試覆蓋率是通過量化“軟體哪裡有被測試過,哪裡沒有被測試過”來保證測試的完全性。誠然,沒有完美的軟體,也沒有100%充分的測試用例,但用戶至少可以通過測試覆蓋率指標來評價測試的完全度是否達到了預期––很顯然,測試工作結束後,若是依然有為數眾多的需求或者程式碼都未被測試覆蓋到,將是一件需要被謹慎對待的事情。

所以,對於有較高可靠性或安全性的軟體系統來說,通過評價測試覆蓋率來提高測試的品質是非常有效且有必要的手段。

另一方面,無論是功能安全SIL/ASIL,還是適航認證,所執行的IEC 61508/ En5018/ ISO 26262/DO-178B, DO-178C標準中都對軟體的測試覆蓋率做了明確的要求。如下圖SIL認證要求所示:

測試覆蓋率-1

-- HR: Highly Recommended

-- R: Recommended

Entry Points Coverage: 入口點覆蓋。最基本的測試覆蓋率類型,現在在很多行業中更多地被以‘函數覆蓋’和‘函式呼叫覆蓋’的標準被執行,要求軟體中所包含的函數至少有被執行和調用到,避免測試的明顯遺漏或出現榮譽程式碼。 

Statement Coverage: 語句覆蓋。SIL Level 2, ASIL Level B, DO-178B, DO-178C Level C以上等級的認證都要求軟體測試達到語句覆蓋,以保證每個可執行的程式碼行在測試中至少被執行了一次。比如下面的語句只要一個測試用例即可以滿足該語句被測試覆蓋到。

if((a || b) && c)

Brach Coverage: 分支覆蓋。 SIL Level 3, ASIL Level C, DO-178B, DO-178C Level B及以上等級要求測試的分支覆蓋,集中在每個分支判定語句 --判定結果可以是TRUE或FALSE,以保證每個分支至少被遍歷一次。還是下麵的if語句為例:

if((a || b) && c)

為了滿足該語句的分支覆蓋率,至少需要2個測試用例來分別覆蓋它的TRUE和FALSE這兩個分支。所以我們在設計測試用例的時候需要考慮if語句中的判定條件,創造符合要求的測試輸入參數。

MC/DC Coverage: 修正的條件/分支覆蓋率。SIL Level 4, ASIL Level D, DO-178B, DO-178C Level A或核安全級等最高安全等級的標準,除了要求以上測試覆蓋率以外,還會要求MC/DC覆蓋率。它是要求更高的測試覆蓋率,更苛刻的覆蓋條件。MC/DC覆蓋率要求條件判定語句中的每個子條件都獨立地影響條件判定結果。換句話說,條件判定語句中的每個子條件都在其它條件不變的情況下改變了條件判定結果。舉個例子,

if((a || b) && c)

為了滿足上面的包含a, b, c三個子條件的if條件判定語句的MC/DC覆蓋率,我們需要設計至少4個(n+1)個測試用例,組成3對測試用例,讓a, b, c分別獨立地影響判定結果。如下圖所示。

測試覆蓋率-2

                                                                                                                圖:MC/DC條件對

即便是最有經驗的測試工程師,要完成這個任務都是不容易的。所以MC/DC覆蓋率一般只會在最高安全等級要求的專案,即軟體錯誤可能造成眾多人員死亡且發生概率不低的系統中被強制要求。


難點和挑戰

  • 統計程式碼測試覆蓋率勢必要對測試程式碼進行插裝,而插裝膨脹率太大、或者編譯器不相容、或者插裝演算法不成熟,都會導致插裝後無法正常編譯或者運行

  • 只能統計上位機軟體的測試覆蓋率,無法支援嵌入式環境

  • 只能統計單一測試環節的測試覆蓋率,比如僅支援單元測試的覆蓋率,無法統計系統測試覆蓋率

  • 多次測試執行的測試覆蓋率無法累加,需要重複集中執行

  • 測試覆蓋率報告不直觀、不易理解

解决方案

  • 基於需求的測試覆蓋率和追溯關係。通過建立設計需求與測試用例的追溯管理來保證,“基於需求的測試”用例對需求的完整覆蓋

  • 自動統計單元測試、集成測試等模組級別的測試覆蓋率

  • 自動統計系統功能測試的測試覆蓋率

  • 支持不同級別的測試環節之間的測試覆蓋率疊加及增量分析

  • 完美支持各種嵌入式目的機環境和上位機平臺

  • 統計語句覆蓋、分支覆蓋、MC/DC覆蓋、函數覆蓋和函式呼叫覆蓋等常用的測試覆蓋率類型

  • 運行時的動態測試覆蓋率統計

  • 動畫重播測試覆蓋過程

  • 完全符合適航和功能安全等高可靠性行業認證標準的解決方案

相關資源

  • 白皮書

  • 新聞資訊

  • 通過確保測試的完整性控制產品品質_白皮書

    點擊下載

  • 如何評估嵌入式軟體測試工具_白皮書

    點擊下載

  • 如何開發高品質的軟體_白皮書

    點擊下載

  • 人工分析覆蓋率_白皮書

    點擊下載

  • 利用Wind River VxWorks7實現自動化軟體測試_白皮書

    點擊下載

  • 2015軟體測試技術報告_白皮書

    點擊下載

RELATED RESOURCES

下載申請

是否需要技術支持

驗證碼

溫馨提示:

我們將通過電子郵件向您發送下載地址,請核對您填寫的工作郵箱是否正確。

提 交