maven 多模塊項目的測試覆蓋率分析 - jacoco 聚合分析

来源:https://www.cnblogs.com/xiao2shiqi/archive/2023/03/09/17201756.html
-Advertisement-
Play Games

前言 對於大多數 maven 多模塊化工程,可以使用 Jacoco 這款工具,關於 Jacoco 這款工具,ChatGPT 對它的描述是這樣的: JaCoCo(Java Code Coverage)是一個開源的測試覆蓋率工具,它可以用於幫助開發人員衡量其軟體測試的有效性。它支持多種語言,包括 Jav ...


前言

對於大多數 maven 多模塊化工程,可以使用 Jacoco 這款工具,關於 Jacoco 這款工具,ChatGPT 對它的描述是這樣的:

JaCoCo(Java Code Coverage)是一個開源的測試覆蓋率工具,它可以用於幫助開發人員衡量其軟體測試的有效性。它支持多種語言,包括 Java 和 Kotlin 等,並且可以與多個構建工具和集成開發環境(IDE)一起使用。

JaCoCo 可以收集測試覆蓋率數據,並生成可視化的測試覆蓋率報告,幫助開發人員更好地理解其代碼的測試覆蓋率情況。它提供了多種測試覆蓋率指標,例如行覆蓋率、分支覆蓋率、方法覆蓋率、類覆蓋率等,可以幫助開發人員瞭解其測試覆蓋率情況的具體細節。

JaCoCo 還可以與多種構建工具集成,例如 Maven、Gradle 等。它可以通過 Maven 或 Gradle 的插件來收集測試覆蓋率數據,併在構建過程中生成測試覆蓋率報告

Jacoco 可以很好的支持對 Maven 多模塊進行聚合分析測試覆蓋率,可以從項目整體輸出覆蓋率報告非常方便。

下麵展示一下具體的使用方法

一:創建根項目

先創建一個多模塊的 Maven 項目,大致的結構如下:

├── parent-project
├── pom.xml
├── business-module1
│   ├── pom.xml
│   └── src
│       ├── main
│       └── test
├── business-module2
│   ├── pom.xml
│   └── src
│       ├── main
│       └── test
└── test-module
    ├── pom.xml
    └── src
        ├── main
        └── test

在一個空白的目錄,一個的 Maven 的根項目:

mvn archetype:generate \
-DgroupId=org.example \
-DartifactId=jacoco-multi-module-example \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false

然後進入目錄:

cd jacoco-multi-module-example

把根目錄 pom.xmlpackaging 屬性改為 pom,從而將根目錄設置為一個聚合模塊,用來管理多個子模塊的依賴關係

<packaging>pom</packaging>

二:創建子模塊

根據上面的結構,在根目錄下,分別創建:

  • business-module1
  • business-module2
  • test-module

在根目錄的路徑下,輸入以下命令,創建 business-module1 模塊:

mvn archetype:generate \
-DgroupId=org.example \
-DartifactId=business-module1 \
-DarchetypeArtifactId=maven-archetype-quickstart  \
-DinteractiveMode=false

創建 business-module2 模塊:

mvn archetype:generate \
-DgroupId=org.example \
-DartifactId=business-module2 \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false

創建 test-module 單元測試模塊:

mvn archetype:generate \
-DgroupId=org.example \
-DartifactId=test-module \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false

然後模擬實際的開發,分別在模塊1,模塊2中添加一些業務代碼,

business-module1 中我添加一個簡單的數學運算 IntegerSimpleCompute 類:

// business-module1\src\main\java\org\example\IntegerSimpleCompute.java
package org.example;

public class IntegerSimpleCompute {

    public int add(int i, int j) {
        return i + j;
    }

    public int subtract(int i, int j) {
        return i - j;
    }

    public int multiply(int i, int j) {
        return i * j;
    }

    public int divide(int i, int j) {
        return i / j;
    }
}

business-module2 中我添加一個簡單的邏輯運算 IntegerLogicCompute 類:

// business-module2\src\main\java\org\example\IntegerLogicCompute.java
package org.example;

public class IntegerLogicCompute {

    public int increment(Integer i) {
        return i + 1;
    }

    public int decrement(Integer i) {
        return i- 1;
    }

    // 存在條件分支的語句,需要滿足所有條件分支判斷才能達到 100% 的覆蓋率
    public boolean equals(Integer i, Integer j) {
        if (i < 127 && j < 127) {
            return i == j;
        }
        return i.equals(j);
    }
}

三:創建測試模塊

我們將 test-module 作為測試模塊,在該模塊的 pom.xml 文件中,我們引入上面的測試模塊,方便對他們進行集成測試

<dependencies>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>business-module1</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <dependency>
        <groupId>org.example</groupId>
        <artifactId>business-module2</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

然後在 src/test/java 目錄下創建測試類:

// test-module\src\test\java\org\example\IntegrationTest.java
package org.example;

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class IntegrationTest {

    private IntegerSimpleCompute simpleCompute;
    private IntegerLogicCompute logicCompute;

    @Before
    public void init() {
        simpleCompute = new IntegerSimpleCompute();
        logicCompute = new IntegerLogicCompute();
    }

    @Test
    public void simpleComputeTest() throws Throwable {
        assertEquals(7, simpleCompute.add(3, 4));
        assertEquals(4, simpleCompute.subtract(7, 3));
        assertEquals(12, simpleCompute.multiply(3, 4));
        assertEquals(3, simpleCompute.divide(12, 4));
    }

    @Test
    public void logicComputeTest() throws Throwable {
        assertEquals(8, logicCompute.increment(7));
        assertEquals(6, logicCompute.decrement(7));
        assertEquals(true, logicCompute.equals(125, 125));
        assertEquals(false, logicCompute.equals(123, 125));
        assertEquals(false, logicCompute.equals(123, 130));
        assertEquals(false, logicCompute.equals(133, 125));
        assertEquals(true, logicCompute.equals(140, 140));
        assertEquals(false, logicCompute.equals(140, 141));
    }
}

到可以,你可以通過:

mvn test

執行單元測試,maven 的 maven-surefire-plugin 插件也會簡單的輸出如下測試報告:

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

四:生成覆蓋率報告

首先在根目錄的 pom.xml 引入 jacoco 插件並且啟動代理:

<build>
    <plugins>
        <!-- 指定 Java 編譯版本 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>11</source>
                <target>11</target>
            </configuration>
        </plugin>

        <!-- jacoco 插件 -->
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.8</version>
            <executions>
                <!--  執行 prepare-agent 目標,它會啟動 JaCoCo 代理 -->
                <execution>
                    <id>default-prepare-agent</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>

                <!-- 執行 mvn verify 時,生成測試覆蓋率報告 -->
                <execution>
                    <id>report</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

然後在 test-module 模塊中引入 jacoco 插件,聲明一個聚合分析任務:

<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.8</version>
            <executions>
                <!--  在執行 mvn verify 時,生成聚合測試覆蓋率報告,所有 Maven 子模塊的測試覆蓋率數據 -->
                <execution>
                    <id>report-aggregate</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>report-aggregate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

最後在根目錄執行指令,運行所有測試:

$ mvn clean verify

構建成功後可以在 test-module 模塊下的 target/site/jacoco-aggregate/index.html 查看覆蓋率報告:

image-20230309142038873

點擊對應模塊可以看到包內部所有類,方法還有每一行的測試覆蓋率情況,這裡具體不再展開,自己可以嘗試以下

示例代碼:jacoco-module-sample

參考資料:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這篇文章主要描述如何解決消息重發的問題,目前主流的消息隊列產品都採用了At least once的服務質量,這就導致了很難避免消息重發的情況,我們可以將消費者業務邏輯設計成冪等服務來解決消息重發問題。 ...
  • 1. 減少記憶體使用 1.1. 減少堆記憶體的使用 1.1.1. 使用更少的記憶體意味著堆被填滿的頻率會降低,需要的GC周期會更少,其效果也可以成倍增強 1.1.2. 更少的新生代回收意味著對象的晉升年齡增加的頻率降低 1.1.3. 對象晉升到老年代的可能性也降低了 1.1.4. Full GC周期(或者 ...
  • Qt 學習筆記全系列傳送門: Qt 學習筆記 - 第一章 - 快速開始、信號與槽 Qt 學習筆記 - 第二章 - 添加圖片、佈局、界面切換 【本章】Qt 學習筆記 - 第三章 - Qt的三駕馬車之一 - 串口編程 + 程式打包成Windows軟體 1、創建項目 實現串口助手 創建 Qt Widget ...
  • find,grep,sed,awk find:常用在目錄下精確查找文件(最擅長找文件) grep:常用來做全局數據的查詢定位(最擅長文本過濾) sed:常用來做行數據增刪改查(最擅長取行) awk:常用來做列數據切分與提取(最擅長取列) 1.find【擅長在目錄下找文件】 find 命令用來在指定目 ...
  • 先看如下一個DEMO示例代碼:(其中doBatchGet被子類重寫了1次) public abstract class BaseDemoService<T> { public String batchGet(T... ints) { T one=ints[0]; System.out.println ...
  • 前置知識: Web 伺服器:可以指硬體上的,也可以指軟體上的。從硬體的角度來說, Web 伺服器指的就是一臺存儲了網路服務軟體的電腦;從軟體的角度來說, Web 伺服器指的是一種軟體,比如 Tomcat。 Servlet 容器:目前主流的 Servlet 容器軟體包括 Tomcat、Jetty、J... ...
  • SpringBoot Controller 控制器 SpringBoot提供了@Controller和@RestController兩種註解來標識此類負責接收和處理HTTP請求。 如果請求的是頁面和數據,使用@Controller註解即可;如果只是請求數據,則可以使用@RestController註 ...
  • 1.學習目標 2.簡介 技術論壇:http://bbs.chinaunix.net/forum-240-1.html 資源地址:https://sourceforge.net/projects/fastdfs/ 源碼地址:https://github.com/happyfish100 FastDFS ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...