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

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

1.1 目前主流代碼覆蓋率統(tǒng)計工具

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

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

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

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

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

的調(diào)試信息。

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

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

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

例數(shù)。這項參數(shù)也在任何情況下有效。

? Lines:該項指數(shù)在有調(diào)試信息的情況下計算。

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

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

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

1.2 jacoco 部署準備工作

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

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

第 一 步 : 解 壓 下 載的 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 環(huán)境,其他系統(tǒng)略有不同,需先停掉 tomcat 服務)

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

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

1.3 本地生成覆蓋率報告

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

取覆蓋率數(shù)據(jù),不需要停止 tomcat 服務器。

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

表等等。那樣的話,ant report 這個任務就沒用了??芍苯釉?jenkins 中配置,在每次項目構(gòu)建的時候自

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

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

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

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

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

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

2.1 SonarQube 準備工作

第一步:

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

?安裝 MySql,并創(chuàng)建數(shù)據(jù)庫(也可使用內(nèi)置數(shù)據(jù)庫,實際使用會很慢)

-- 創(chuàng)建數(shù)據(jù)庫:

CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; -- 創(chuàng)建SonarQube Server訪問數(shù)據(jù)庫的用戶:

CREATE USER 'sonar' IDENTIFIED BY 'sonar';

-- 配置SonarQube Server訪問數(shù)據(jù)庫用戶的權(quán)限

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

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

-- 更新權(quán)限:

flush privileges;

第二步:

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

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

第三步:

?配置 SonarQube 系統(tǒng)

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

第四步:

對應項目工程添加 properties 配置文件,文件內(nèi)容如下:

# 指定 SonarQube instance 必須是唯一的

sonar.projectKey=BR_CR2794_20170419

# 設(shè)置 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/**

# 源碼編碼,默認是系統(tǒng)編碼

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 執(zhí)行項目分析

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

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

有如下內(nèi)容輸出:

重新訪問 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 要配置正確,使用已經(jīng)安裝好的 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 構(gòu)建指令上加上一個 Goals 即可:

$SONAR_MAVEN_GOAL -Dsonar.host.url=$SONAR_HOST_URL

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容