測試覆蓋率

(test coverage)是衡量軟體測試

完整性

的一個重要指標。掌握測試覆蓋率資料,有利於客觀認識軟體質量,正確瞭解測試狀態,有效改進測試工作。

當然,要發揮這些作用,前提是我們掌握了真實的測試覆蓋率資料。通常這並不是一件很直接的事情。那麼,如何

度量

測試覆蓋率呢?

在度量測試覆蓋率之前,我們需要明確測試覆蓋率的

定義

。畢竟,不同的定義會產生完全不同的覆蓋率資料。這裡,我基於個人認知和經驗,總結

三種

最常見的測試覆蓋率定義及度量方法。

最著名的測試覆蓋率就是程式碼覆蓋率

。這是一種

面向軟體開發和實現

的定義。它關注的是在執行測試用例時,有哪些軟體程式碼被執行到了,有哪些軟體程式碼沒有被執行到。

被執行的程式碼數量與程式碼總數量之間的比值,就是程式碼覆蓋率

這裡,根據

程式碼粒度

的不同,程式碼覆蓋率可以進一步分為原始檔覆蓋率,類覆蓋率,函式覆蓋率,分支覆蓋率,語句覆蓋率等。它們形式各異,但本質是相同的。

如何度量程式碼覆蓋率呢?一般可以透過

第三方工具

完成。不同程式語言,有不同的工具。例如Java語言有Jacoco,Go語言有GoCov,Python語言有Coverage。py。

這些度量工具有個特點,那就是它們一般只適用於白盒測試,尤其是

單元測試

。對於黑盒測試(例如功能測試/系統測試)來說,度量它們的程式碼覆蓋率則相對困難多了。

主流程式語言一般都有現成的單元測試工具,拿過來稍作配置即可使用。但是,如果想更進一步去了解這些工具背後的實現原理,就需要花費一些功夫了。

以Python覆蓋率工具Coverage。py為例,它包括執行,分析和生成報告三大模組。

最核心

的執行模組依賴Python內建的trace函式。這是一個由Python直譯器提供的,當每一行Python程式碼被執行時所啟用的函式。

基於trace函式,我們可以得到每一行被執行的程式碼所在的檔案和行數。然後,結合軟體原始碼,我們就可以分析出測試的程式碼覆蓋情況,最後生成覆蓋報告。

對於黑盒測試,例如功能測試/整合測試/系統測試等來說,測試用例通常是

基於軟體需求而不是軟體實現

所設計的。因此,度量這類測試完整性的手段一般是

需求覆蓋率

,即

測試所覆蓋的需求數量與總需求數量的比值

需求粒度

的不同,需求覆蓋率的具體表現也有不同。例如,系統測試針對的是比較粗的需求,而功能測試針對的是比較細的需求。當然,它們的本質是一致的。

如何度量需求覆蓋率呢?通常沒有現成的工具可以使用,而需要

依賴人工計算

,尤其是需要依賴人工去

標記

每個測試用例和需求之間的

對映關係

對於黑盒測試來說,由於測試是基於使用者場景而不是軟體實現設計的。因此,這個時候去度量軟體程式碼覆蓋率,其意義並不顯著,至少是不如需求覆蓋率的。

程式碼覆蓋率和需求覆蓋率有一個共同點,即它們都是

面向測試過程

的指標。因此有個不足之處,即

覆蓋率資料可能無法完全反映真實的測試狀態和水平

對於程式碼覆蓋率來說,

廣為詬病

的一點就是100%的程式碼覆蓋率並不能說明程式碼就被完全覆蓋沒有遺漏了。因為程式碼的執行順序和函式的引數值,都可能是千變萬化的。一種情況被覆蓋到,不代表所有情況被覆蓋到。

對於需求覆蓋率來說,100%的覆蓋率也不能說“萬事大吉”。因為需求可能有遺漏或存在缺陷,測試用例與需求之間的對映關係,尤其是用例是否真正能夠覆蓋對應的測試需求,也可能是存在疑問的。

測試的目的是發現軟體缺陷。因此,衡量測試完整性的

終極指標

應該是

面向測試結果的缺陷覆蓋率

,即

測試所實際發現的缺陷數量與測試所應該發現的缺陷總量的比值

軟體測試一般是分為多個測試階段的。每個階段有每個階段的任務。對於當前測試階段來說,在後續階段發現的缺陷中,屬於當前階段(而不是更早階段)

遺漏

出去的缺陷是我們需要重點關注的。

雖然討論缺陷覆蓋率有一種“事後諸葛亮”的感覺,但是它的意義是不容忽視的。一方面它提供了評價某一階段測試工作成效的重要指標,另一方面它為我們改進測試工作提供了重要參考。例如,針對每一個遺漏缺陷深入挖掘,舉一反三,可以避免同類問題在未來再次發生。

總結一下,這裡介紹了三種常見的測試覆蓋率的定義和度量方法,分別是

程式碼覆蓋率,需求覆蓋率和缺陷覆蓋率

。它們適用於不同的場景,有各自的優勢與不足。需要注意的是,它們不是互相排斥,而是

相互補充

的。

關於測試覆蓋率,最重要的一點應該是邁出第一步,即

有意識地去收集這種資料

。沒有覆蓋率資料,測試工作會有點像在“黑燈瞎火”中走路。有了覆蓋率資料,並持續監測,利用和改進這個資料,才是一條讓測試工作越來越好的光明大道。

我是肖哥shelwin,一個高質量軟體工程實踐者和推動者。歡迎新增我的個人公眾號測試不將就或關注同名部落格,謝謝,獲得更多

自動化測試, 持續整合, 軟體工程實踐, Python程式設計

等領域原創文章。