基于 jacoco 的功能測試代碼覆蓋率實踐

1. 基于 jacoco 的功能測試代碼覆蓋率實踐

1.1 目前主流代碼覆蓋率統計工具

考慮到方案實施的難度很大取決于工具是否仍保持維護更新,所以選擇 jacoco 來進行實踐。

Jacoco 是一個開源的覆蓋率工具。Jacoco 可以嵌入到 Ant 、Maven 中,并提供了 EclEmma Eclipse 插件,也可以使用 Java Agent 技術監控 Java 程序。很多第三方的工具提供了對 Jacoco 的集成,如 sonar、Jenkins、IDEA。

Jacoco 包含了多種尺度的覆蓋率計數器,包含指令級(Instructions,C0 coverage),分支(Branches,C1 coverage)、圈復雜度(Cyclomatic Complexity)、行(Lines)、方法(Non-abstract Methods)、類(Classes)。

? Instructions:Jacoco 計算的最小單位就是字節碼指令。指令覆蓋率表明了在所有的指令中,

哪些被指令過以及哪些沒有被執行。這項指數完全獨立于源碼格式并且在任何情況下有效,不需要類文件

的調試信息。

? Branches:Jacoco 對所有的 if 和 switch 指令計算了分支覆蓋率。這項指標會統計所有的分支數

量,并同時支出哪些分支被執行,哪些分支沒有被執行。這項指標也在任何情況都有效。異常處理不考慮在分支范圍內。

? Cyclomatic Complexity:Jacoco 為每個非抽象方法計算圈復雜度,并也會計算每個類,包,組的復雜度。根據 McCabe1996 的定義,圈復雜度可以理解為覆蓋所有的可能情況最少使用的測試用

例數。這項參數也在任何情況下有效。

? Lines:該項指數在有調試信息的情況下計算。

? Methods:每一個非抽象方法都至少有一條指令。若一個方法至少被執行了一條指令,就認為它被執行過。因為 JaCoco 直接對字節碼進行操作,所以有些方法沒有在源碼顯示(比如某些構造方法和由編

譯器自動生成的方法)也會被計入在內。

? Classes:每個類中只要有一個方法被執行,這個類就被認定為被執行。同 5 一樣,有些沒有在源碼聲明的方法被執行,也認定該類被執行。

1.2 jacoco 部署準備工作

?下載 jacoco.zip http://www.eclemma.org/jacoco/index.html

?下載安裝 ANT,具體可參考百度,需配置環境變量。

第 一 步 : 解 壓 下 載的 jacoco-0.7.9.zip 文 件 , 將 lib 文 件 夾 下 的 jacocoagent.jar 包拷貝放到對應 tomcat 服務器的 lib 目錄下

第二步: 修改 tomcat\bin 目錄下的 catalina.bat 文件,在 setlocal 后添加如下代碼:

set "JAVA_OPTS=-javaagent:%CATALINA_HOME%\lib\jacocoagent.jar=includes=com.thinkgem.

jeesite.*,output=tcpserver,port=8144,address=127.0.0.1 - Xverify:none"

(限 Windows 環境,其他系統略有不同,需先停掉 tomcat 服務)

配置完成后,可直接重啟 tomcat 服務,查看 logs 目錄下的 catalina 日志,查找 jacocoagent 字段,若有,則代表配置成功。

第三部:添加配置 ant build.xml 文件,隨便存儲在哪里都成,具體配置如下:

1.3 本地生成覆蓋率報告

以上配置完成后,可進行對應的功能測試操作,通過 ant dump 命令,可動態獲

取覆蓋率數據,不需要停止 tomcat 服務器。

備注: Jenkins 的 Jacoco plugin 可以根據.exec 文件直接生成覆蓋率報告,并在 Jenkins 中生成圖

表等等。那樣的話,ant report 這個任務就沒用了。可直接在 jenkins 中配置,在每次項目構建的時候自

動執行 report,這樣就不需要將項目源碼文件 checkout 到本地

?打開 cmd 命令行窗口,進入 build.xml? 所在目錄,執行 ant dump,

若成功,會輸出如下信息:

?在執行 ant report。jacoco 就會在你指定的路徑生成覆蓋率報告了

2. 基于 jacoco + SonarQube + sonar-scanner 的集成實踐

SonarQube 能夠提供對代碼的一整套檢查掃描和分析功能,可以通過 sonar-scanner 完成對各開發環境和軟件的支持。通過整合 jacoco 不僅可以展示代碼掃描結果,也能圖形化顯示測試覆蓋率情況。

2.1 SonarQube 準備工作

第一步:

?下載 SonarQube 和 sonar-scanner,并解壓 https://www.sonarqube.org/downloads/ 將 sonar-scanner\bin,路徑添加到環境變量

?安裝 MySql,并創建數據庫(也可使用內置數據庫,實際使用會很慢)

-- 創建數據庫:

CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; -- 創建SonarQube Server訪問數據庫的用戶:

CREATE USER 'sonar' IDENTIFIED BY 'sonar';

-- 配置SonarQube Server訪問數據庫用戶的權限

GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';

GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';

-- 更新權限:

flush privileges;

第二步:

?配置 SonarQube 配置文件,打開 SonarQube 下的 conf/sonar.properties

? 配 置 sonar-scanner 配 置 文 件 , 修 改 sonar-scanner-3.0.3.778-windows\conf\sonar-scanner.properties 文件

第三步:

?配置 SonarQube 系統

訪問 http://127.0.0.1:9000,如果不是本機就輸入 http://IP:9000

第四步:

對應項目工程添加 properties 配置文件,文件內容如下:

# 指定 SonarQube instance 必須是唯一的

sonar.projectKey=BR_CR2794_20170419

# 設置 SonarQube UI 顯示的名稱

sonar.projectName= hrms

sonar.projectVersion=1.0

sonar.language=java

# 指定 src 和 classes 文件夾位置,當可以是全路徑,如果是當前工程根目錄下用“.”表示也可以

sonar.sources=src

sonar.java.binaries=target

# 不參與分析的某個文件夾或者忽略某個文件夾

# sonar.inclusions=src1/**,src3/**

# sonar.exclusions=src2/**,src4/**

# 源碼編碼,默認是系統編碼

sonar.sourceEncoding=UTF-8

# Set jacoco Configuration

# 指定代碼覆蓋率工具

sonar.core.codeCoveragePlugin=jacoco

# 指定 exec 二進制文件存放路徑

sonar.jacoco.reportPaths=D:/covge/jacoco.exec

# 以下屬性非必須,具體含義參考百度

sonar.dynamicAnalysis=reuseReports

sonar.jacoco.reportMissing.force.zero=false

2.2 SonarQube 執行項目分析

以上配置完成后,打開 cmd 窗口,進入工程根目錄,執行 sonar-scanner 命

令,若報錯,可在命令后加上 -X 重新執行一遍,會顯示詳細報錯信息。成功應

有如下內容輸出:

重新訪問 http://127.0.0.1:9000 展示效果如下:


2.2SonarQube 集合 jenkins 和 maven 使用

? 在 Jenkins 中安裝和使用 SonarQube 的先決條件:安裝插件 SonarQube Plugin,并且 Jenkins 插件 SonarQube Plugin 在配置位置 Jenkins->Configuration->Configure System->SonarQube servers 中的選項 Server URL 要配置正確,使用已經安裝好的 SonarQube Server 的 URL

? 修 改 maven 配 置 setting.xml , 參 照 官 方 配 置 :

https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Ma ven

<settings>

<pluginGroups>

<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>

</pluginGroups>

<profiles>

<profile>

<id>sonar</id>

<activation>

<activeByDefault>true</activeByDefault>

</activation>

<properties>

<!-- Optional URL to server. Default value is http://localhost:9000 --> <sonar.host.url>

http://myserver:9000

</sonar.host.url>

</properties>

</profile>

</profiles>

</settings>

修改 Maven 配置之后,在 Maven 構建指令上加上一個 Goals 即可:

$SONAR_MAVEN_GOAL -Dsonar.host.url=$SONAR_HOST_URL

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容