天天看點

測試覆寫率工具之--01 Jacoco

  測試過程中根據需求文檔和設計文檔編寫測試用例、執行測試;為了更加全面的覆寫,我們可能還需要了解被測程式的邏輯,需要考慮到每個函數的輸入與輸出,邏輯分支代碼的執行情況,這個時候我們的測試執行情況就以代碼覆寫率來衡量。

  覆寫率是衡量測試效果的一個輔助名額。

1.1. 意義

  • 分析未覆寫部分的代碼,進而反推在前期測試設計是否充分,沒有覆寫到的代碼是否是測試設計的盲點,為什麼沒有考慮到?需求/設計不夠清晰,測試設計的了解有誤,工程方法應用後的造成的政策性放棄等等,之後進行補充測試用例設計。
  • 檢測出程式中的廢代碼,可以逆向反推在代碼設計中思維混亂點,提醒設計/開發人員理清代碼邏輯關系,提升代碼品質。
  • 代碼覆寫率高不能說明代碼品質高,但是反過來看,代碼覆寫率低,代碼品質不會高到哪裡去,可以作為測試自我審視的重要工具之一。

1.2. 工具比較

  市場上主流工具Emma,Cobertura,Jacoco,Clover(商用)

測試覆寫率工具之--01 Jacoco

2. Jacoco簡介

  Jacoco 是一個開源的覆寫率工具,針對的語言為java。它可以嵌入到 Ant 、Maven 中,也提供了 EclEmma Eclipse 插件。Jacoco 主要通過代碼注入(即 Java Agent)方式來實作覆寫率的功能。很多第三方的工具提供了對 Jacoco 的內建,如:Sonar、Jenkins、IDEA.

​​​下載下傳​​

2.1. 覆寫率相關概念

jacoco支援多種覆寫率的統計,包括:

  • 行覆寫率(Lines):度量被測程式的每行代碼是否被執行,判斷标準行中是否至少有一個指令被執行。
  • 類覆寫率(classes)):度量計算class類檔案是否被執行。
  • 分支覆寫率(Branches,C1coverage):度量if和switch語句的分支覆寫情況,計算一個方法裡面的總分支數,确定執行和不執行的 分支數量。
  • 方法覆寫率(non-abstract methods):度量被測程式的方法執行情況,是否執行取決于方法中是否有至少一個指令被執行。
  • 指令覆寫(Instructions,C0coverage):計數單元是單個java二進制代碼指令,指令覆寫率提供了代碼是否被執行的資訊,度量完全 獨立源碼格式。
  • 圈複雜度(CyclomaticComplexity):在(線性)組合中,計算在一個方法裡面所有可能路徑的最小數目,缺失的複雜度同樣表示測 試案例沒有完全覆寫到這個子產品。

2.2. 插樁及不同插樁模式

2.2.1. 什麼是插樁

  程式插樁,最早是由J.C. Huang 教授提出的,它是在保證被測程式原有邏輯完整性的基礎上在程式中插入一些探針(又稱為“探測儀”,本質上就是進行資訊采集的代碼段,可以是指派語句或采集覆寫資訊的函數調用),通過探針的執行并抛出程式運作的特征資料,通過對這些資料的分析,可以獲得程式的控制流和資料流資訊,進而得到邏輯覆寫等動态資訊,進而實作測試目的的方法。

2.2.2. On-The-Fly和Offine比較

  on-the-fly 模式是JVM通過 -javaagent參數指定jar檔案啟動代理程式,代理程式在ClassLoader裝載一個class前判斷是否修改class檔案,并将探針插入class檔案,探針不改變原有方法的行為,隻是記錄是否已經執行。

  offline 模式就是在測試之前先對檔案進行插樁,生成插過樁的class或jar包,測試插過樁的class和jar包,生成覆寫率資訊到檔案,最後統一處理,生成報告。

  Offline模式适用于以下場景:

  • 運作環境不支援java agent
  • 部署環境不允許設定JVM參數
  • 位元組碼需要被轉換成其他虛拟機位元組碼,如Android Dalvik VM
  • 動态修改位元組碼過程中和其他agent沖突
  • 無法自定義使用者加載類
  • 測試覆寫率工具之--01 Jacoco

官方文檔

【Quality】 Quality is the value to someone who matters。做測試,首先要找到這個someone是誰,以及這個 someone重視的 value是什麼。