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