Maven整合JaCoCo和Sonar,看看你的測試寫夠了沒

来源:https://www.cnblogs.com/larrydpk/archive/2020/05/21/12927398.html
-Advertisement-
Play Games

1 簡介 單元測試是保證代碼質量的重要一環,而如何衡量單元測試寫得好不好呢? 是一個重要指標。而 則是專門為 提供的用於檢測測試覆蓋率的工具,英文全稱為 。 本文將講解如何在 項目中整合 ,併在 中展示。 的安裝可以參考這篇文章: 《 "Docker搭建代碼檢測平臺SonarQube並檢測maven ...


1 簡介

單元測試是保證代碼質量的重要一環,而如何衡量單元測試寫得好不好呢?覆蓋率(Coverage)是一個重要指標。而JaCoCo則是專門為Java提供的用於檢測測試覆蓋率的工具,英文全稱為Java Code Coverage

本文將講解如何在Maven項目中整合JaCoCo,併在SonarQube中展示。SonarQube的安裝可以參考這篇文章:

Docker搭建代碼檢測平臺SonarQube並檢測maven項目

2 基本概念

這裡所講的覆蓋率是指測試代碼的覆蓋率,這個指標有多種計算方式,如下是比較常用的有:

  • 行覆蓋率:執行代碼行數 / 總代碼行數,判斷有多少行代碼被測試執行;

  • 類覆蓋率:執行的類 / 代碼中類總個數;

  • 分支覆蓋率:執行的邏輯分支數 / 總的分支數,一般用於檢測是不是lf/else都有測試覆蓋;

  • 方法覆蓋率:執行的方法數 / 代碼總方法數,檢測是否有方法被遺漏,構造方法也看作為方法。

  • 圈複雜度:用於判斷代碼結構的複雜程式,JaCoCo不考慮異常處理的分支;一般認為圈複雜度大於10,就存在比較大的風險,嚴格要求不可大於15。

顏色標識:

JaCoCo會通過顏色來標識代碼覆蓋情況,使其一目瞭然。紅色表示沒有覆蓋,綠色表示已經覆蓋,黃色表示部分覆蓋。

執行方式:

執行JaCoCo有多種方式:

(1)直接通過命令執行:https://www.eclemma.org/jacoco/trunk/doc/agent.html

(2)Ant執行:https://www.eclemma.org/jacoco/trunk/doc/ant.html

(3)Maven執行:https://www.eclemma.org/jacoco/trunk/doc/maven.html

(4)集成IDE執行:https://www.eclemma.org/

我們接下來主要講解maven的方式。

3 maven整合

3.1 基礎整合

Maven整合JaCoCo也容易,配置如下:

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>${jacoco.version}</version>
  <configuration>
    <skip>${maven.test.skip}</skip>
    <destFile>${basedir}/target/coverage-reports/jacoco-unit.exec</destFile>
    <dataFile>${basedir}/target/coverage-reports/jacoco-unit.exec</dataFile>
    <output>file</output>
    <append>true</append>
    <excludes>
      <exclude>com/pkslow/basic/containsperformance/**</exclude>
      <exclude>com/pkslow/basic/ReadPropertiesFile</exclude>
    </excludes>

  </configuration>
  <executions>
    <execution>
      <id>jacoco-initialize</id>
      <goals>
        <goal>prepare-agent</goal>
      </goals>
      <phase>test-compile</phase>
    </execution>

    <execution>
      <id>jacoco-site</id>
      <phase>verify</phase>
      <goals>
        <goal>report</goal>
      </goals>
    </execution>
  </executions>
</plugin>

執行mvn clean test,則會生成報告target/coverage-reports/jacoco-unit.exec,但這是人不可讀的,Sonar可讀的。Intellij Idea也可以閱讀,按照Run--Show Code Coverage Data打開即可。

執行mvn clean verify,就會生成報告target/site/jacoco/,有多種格式,用瀏覽器打開index.html文件可以方便查看。如下圖所示:

SonarQube

3.2 選擇範圍

指定某些類不執行檢測:

<excludes>
  <exclude>com/pkslow/basic/containsperformance/**</exclude>
  <exclude>com/pkslow/basic/ReadPropertiesFile</exclude>
</excludes>

3.3 規則與閾值

Rules標簽可以指定檢查閾值,比如類覆蓋率必須為100%。在configuration裡面配置如下:

<rules>
  <rule implementation="org.jacoco.maven.RuleConfiguration">
    <element>BUNDLE</element>
    <limits>  
      <limit implementation="org.jacoco.report.check.Limit">
        <counter>METHOD</counter>
        <value>COVEREDRATIO</value>
        <minimum>0.50</minimum>
      </limit>
      <limit implementation="org.jacoco.report.check.Limit">
        <counter>BRANCH</counter>
        <value>COVEREDRATIO</value>
        <minimum>0.50</minimum>
      </limit>
      <limit implementation="org.jacoco.report.check.Limit">
        <counter>CLASS</counter>
        <value>MISSEDCOUNT</value>
        <maximum>0</maximum>
      </limit>
    </limits>
  </rule>
</rules>

這時需要有下麵的check才會執行這個規則校驗:

<execution>
  <id>check</id>
  <goals>
    <goal>check</goal>
  </goals>
</execution>

如果不滿足條件,maven build就會失敗。不過,如果我們集成了SonarQube,我們則會通過SonarQube來設置這個規則和閾值。

4 提交到Sonar

添加SonarQube配置信息如下,有三種配置方式:

(1)配置資料庫信息

<profiles>
  <profile>
    <id>sonar</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <sonar.jdbc.url>jdbc:postgresql://localhost/sonar</sonar.jdbc.url>
      <sonar.jdbc.driver>org.postgresql.Driver</sonar.jdbc.driver>
      <sonar.jdbc.username>user</sonar.jdbc.username>
      <sonar.jdbc.password>password</sonar.jdbc.password>
      <sonar.host.url>http://localhost:9000</sonar.host.url>
    </properties>
  </profile>
</profiles>

(2)配置用戶名密碼

<profiles>
  <profile>
    <id>sonar</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <sonar.host.url>http://localhost:9000</sonar.host.url>
      <sonar.login>admin</sonar.login>
      <sonar.password>admin</sonar.password>
    </properties>
  </profile>
</profiles>

(3)配置令牌

<profiles>
  <profile>
    <id>sonar</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <sonar.host.url>http://localhost:9000</sonar.host.url>
      <sonar.login>9656c84090b2481db6ea97b6d14d87d546bff619</sonar.login>
    </properties>
  </profile>
</profiles>

以上三種都可以,配置完成後,執行命令如下:

mvn clean verify sonar:sonar

如果不想添加配置,可以直接通過命令來指定,命令如下:

mvn clean verify sonar:sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.login=9656c84090b2481db6ea97b6d14d87d546bff619

5 總結

JaCoCo對項目質量管理作用重大,應該加以使用。最終的maven配置文件pom.xml行數太大,請到( https://www.pkslow.com/archives/maven-jacoco-sonar )參考。


歡迎訪問南瓜慢說 www.pkslow.com獲取更多精彩文章!

歡迎關註微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。


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

-Advertisement-
Play Games
更多相關文章
  • 作者: MarkLin 學習目標: 1. 原生 node 封裝 2. 中間件 3. 路由 Koa 原理 一個 nodejs 的入門級 http 服務代碼如下, koa 的目標是更簡單化、流程化、模塊化的方式實現回調,我們希望可以參照 koa 用如下方式來實現代碼: 所以我們需要創建一個 文件,該文件 ...
  • 仿阿裡雲的錯誤提示 dialog - 您當前的會話已超時,請重新登錄。 ...
  • 輸出Map 申請單號<span>[[${listMain.REQ_CODE}]]</span> 輸出List<Map> <tr th:each="listD, listDStat : ${listDetail}"> <td th:text="${listDStat.count}"></td> <td ...
  • 使用 akka 實現,服務註冊、發現、心跳 消息類: package org.examplecase class RegisterWorkerInfo(id: String, cpu: Int, ram: Int);case class WorkerInfo(val id: String, val ...
  • 3.字元型 字元型常見的方法如下所示: capitalize():字元串第一個英文單詞首字母大寫 title():如字元串有多個英文單詞,則每個單詞首字母大寫 split():對字元串指定的分隔符進行拆分,預設為空格符 find():返回匹配到的字元第一次出現的位置索引,找不到返回 1 replac ...
  • 簡介 最近花了兩天時間研究使用Flutter開發一個抖音國際版. 先上圖,個人感覺使用Flutter開發app快得不要不要的額. 兩天就基本可以開發個大概出來. 最主要是熱更新,太方便實時調整UI佈局了. 相應速度極快. 功能介紹 Flutter開發安卓、IOS app確實方便,還有熱更新可以實時查 ...
  • 2.Python數據類型 對於任何一種編程語言的學習,需要打好入門的基礎知識,在Python中常見的基礎知識有 基本數據類型 、 條件語句 、 迴圈語句 和 函數 ,更深層次需要掌握面向對象的知識。今天我們先來瞭解學習一下基礎知識,在Python常見的基本數據類型如下所示: 2.1 基本數據類型 2 ...
  • 從今天開始,我們開始溫習Python吧。 1.變數 1.1 變數定義 變數是編程中最基本的存儲單位,將會暫時存儲你放進去的數據。示意圖如下所示: 在Python中,定義一個變數並完成賦值非常簡單,如下所示: Python中的變數無需事先聲明變數數據類型,在運行時會自動根據變數值進行自行推斷 1.2 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...