覆蓋率檢查工具:JaCoCo 食用指南

小二十七發表於2022-06-13
image-20220613092650006

一:概述

眾所周知,軟體的程式碼覆蓋率是衡量軟體質量的重要指標,

我們今天簡單介紹 JaCoCo 的實際使用示例,它是目前在大多數 Java 專案中應用最廣泛的覆蓋率檢測框架

更多資料參考:JaCoCo 官網

二:引入 Maven 依賴

在 Java 專案中為了方便使用 JaCoCo,我推薦使用它提供的這款 Maven Plngin,在你的 pom.xml 加入依賴:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>${lacoco-last-version}</version>
    <executions>
        <execution>
            <id>default-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>default-report</id>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

這裡使用 ${lacoco-last-version} 變數,推薦你儘量使用最新的 Maven 版本

三:生成覆蓋率報告

準備環境:

  • Maven 3.x+
  • 你的專案必須包含合理單元測試

在你專案在執行命令:

$ mvn clean install # 釋出構建到你的本地 Maven 倉庫

當專案編譯完成後,在專案目錄:target/site/jacoco/index.html 即可檢視到圖形化的測試報告,如下:

coverage 圖片來自 baeldung

點選連結,你可以檢視每個類的程式碼覆蓋情況,如下:

截圖來自 Baeldung

小知識:index.xml 只是覆蓋率的 UI 展示,覆蓋率的真正資料儲存在 target/site/jacoco/jacoco.xml 檔案中,jacoco.xml 結合 SonarQube 等工具使用會有更好的覆蓋率報告展示效果,不過這是後話,後面有機會再聊

我們簡單說明以上三種顏色是怎麼回事:

  • 紅色標記:表示程式碼塊沒有被測試的程式碼
  • 黃色標記:通常表示只有部分分支被覆蓋
  • 綠色標記:表示程式碼已經全部被單元測試執行過

以下是一個 100% 覆蓋率的示例:

截圖來自 Baeldung

覆蓋率詳細情況:

截圖來自 Baeldung

補充:JaCoCo 涉及的概念比較多,有興趣可以看官網對其他概念名詞的解釋,這裡不多贅述

四:最低覆蓋率限制

在真實專案開發中,我們會為專案設定一個覆蓋率指標,未達標的專案會無法通過構建,或者無法通過 CI 整合

那麼在專案中,我們可以這樣設定覆蓋率的最小值限制,如下:

<execution>
    <id>jacoco-check</id>
    <goals>
        <goal>check</goal>
    </goals>
    <configuration>
        <rules>
            <rule>
                <element>PACKAGE</element>
                <limits>
                    <limit>
                        <counter>LINE</counter>
                        <value>COVEREDRATIO</value>
                        <minimum>0.50</minimum>
                    </limit>
                </limits>
            </rule>
        </rules>
    </configuration>
</execution>

如上,當專案覆蓋率低於 50% 的時候,Maven 就會提示構建事情

五:總結

本文簡單介紹 JaCoCo 最基本使用和上手,希望你可以通過官網探索更多的高階功能

關於覆蓋率給你一些建議:

  • 覆蓋率指標大多數情況下僅作為參考,不要用它作為考核指標
  • 不要過於追求覆蓋率指標,100% 的覆蓋率也不能代表你的專案沒有 BUG

上文演示的專案原始碼可以在 GitHub Project 中找到,你可以自己拉下來跑跑看

相關文章