淺談GO語言程式碼覆蓋

在我們正式瞭解GO語言程式碼覆蓋率實現之前,我們有必要先來了解一下什麼是程式碼覆蓋率?

定義:程式碼覆蓋

是軟體測試中的一種度量手段,是一種白盒測試方法,描述程式中原始碼被測試的比例和程度,所得比例就稱之為

程式碼覆蓋率

。我們在做測試時,程式碼覆蓋率常常被用來作為衡量測試好壞的指標。甚至用程式碼覆蓋率來考核測試任務完成情況,比如,程式碼覆蓋率必須達到70%或 80%等。

淺談GO語言程式碼覆蓋

從覆蓋原始碼語句的詳盡程度分析,包括以下不同的覆蓋標準:

語句覆蓋、判定覆蓋、條件覆蓋和路徑覆蓋

語句覆蓋:

又稱行覆蓋(LineCoverage),段覆蓋(SegmentCoverage),基本塊覆蓋(BasicBlockCoverage),這是最常用也是最常見的一種覆蓋方式,就是度量被測程式碼中每個可執行語句是否被執行到了。選擇足夠多的測試資料,使被測程式中每條語句至少執行一次。語句覆蓋是很弱的邏輯覆蓋,它只管覆蓋程式碼中的執行語句,卻不考慮各種分支的組合等等。

淺談GO語言程式碼覆蓋

判定覆蓋:

又稱分支覆蓋(BranchCoverage),所有邊界覆蓋(All-EdgesCoverage),基本路徑覆蓋(BasicPathCoverage),判定路徑覆蓋(Decision-Decision-Path)。比語句覆蓋稍強的覆蓋標準,它度量程式中每一個判定的分支是否都被測試到了。設計足夠的測試用例,使得程式中的每個判定至少都獲得一次“真值”或“假值”,或者說使得程式中的每一個取“真”分支和取“假”分支至少經歷一次,因此判定覆蓋又稱為分支覆蓋。

淺談GO語言程式碼覆蓋

條件覆蓋:

它度量判定中的每個子表示式結果true和false是否被測試到了。在設計程式中,一個判定語句是由多個條件組合而成的複合判定。為了更徹底地實現邏輯覆蓋,可以採用條件覆蓋(Condition Coverage)的標準。條件覆蓋的含義是:構造一組測試用例,使得每一判定語句中每個邏輯條件的可能值至少滿足一次。條件覆蓋與判定覆蓋非常容易混淆,條件覆蓋不是將判定中的每個條件表示式的結果進行排列組合,而是隻要每個條件表示式的結果true和false測試到了就OK了。因此,我們可以這樣推論:完全的條件覆蓋並不能保證完全的判定覆蓋。

淺談GO語言程式碼覆蓋

路徑覆蓋:

又稱斷言覆蓋(PredicateCoverage)。它度量了是否函式的每一個分支都被執行了。就是所有可能的分支都執行一遍,有多個分支巢狀時,需要對多個分支進行排列組合,可想而知,測試路徑隨著分支的數量指數級別增加。路徑覆蓋被很多人認為是“最強的覆蓋”。

淺談GO語言程式碼覆蓋

程式碼覆蓋率又有什麼意義?我們為什麼要統計程式碼覆蓋率?

分析未覆蓋部分的程式碼,從而反推在前期測試設計是否充分,沒有覆蓋到的程式碼是否是測試設計的盲點,為什麼沒有考慮到?需求/設計不夠清晰,測試設計的理解有誤,工程方法應用後造成的策略性放棄等等,之後進行補充測試用例設計。

檢測出程式中的廢程式碼,可以逆向反推在程式碼設計中思維混亂點,提醒設計/開發人員理清程式碼邏輯關係,提升程式碼質量。

程式碼覆蓋率高不一定能說明測試質量就一定高,但是反過來看,程式碼覆蓋率低的,測試質量就一定是比較薄弱的,可以作為測試自我審視的重要工具之一。