Java代碼覆蓋率工具(Sonar+Jacoco)部署

分類:編程 時間:2017-01-28


方法局限

代碼覆蓋率的定義:對某一段代碼或者代碼的某一種屬性做測試,其測試達到的程度被稱為是覆蓋率,比如對語句的覆蓋,對分支或者條件的覆蓋,等等。
計算方法:把現有的測試與可能執行的測試做比較,現有測試能夠占總的可能執行的測試的多少比例。
覆蓋率的經典定義沒有考慮到一些情況,比如:
1. 輸入特定的某個值或者某組值:邊界值或者特殊的值;
2. 在編碼中遺漏的代碼:在代碼中沒有實現需求卻要求的功能;
3. 中斷,以及其他並行操作的情況。

Cem Kaner在他的著作“software Negligence & Testing Coverage”裏列舉了101種這樣的例子。
盡管覆蓋率有一定的缺陷,但是還是需要量化的衡量維度(可擴充)。

工具調研

信息收集工具

市場上主要代碼覆蓋率工具:Emma、cobertura、jacoco、Clover(商用)。
覆蓋粒度的具體意義?分支覆蓋是指 if else的覆蓋。
HUDSON:Java開發的一種持續集成工具。

具體見下表:

- jacoco emma cobertura 原理 使用ASM修改字節碼 修改jar文件,class文件字節碼文件 基於jcoverage,基於asm框架對class文件插樁 覆蓋粒度 行,類,方法,指令,分支 行,類,方法,基本塊,指令,無分支覆蓋 項目,包,類,方法的語句覆蓋/分支覆蓋 插樁 on the fly、offline on the fly、offline offline,把統計代碼插入編譯好的class文件中 生成結果 在tomcat的catalina.sh配置javaangent參數,指出需要收集覆蓋率的文件,shutdown時才收集,只能使用kill命令關閉tomcat,不要使用kill -9 html,xml,txt,二進制格式報表 html,xml 缺點 需要源代碼 1、需要debug版本,並打來build.xml中的debug編譯項; 2、需要源代碼,且必須與插樁的代碼完全一致 1、不能捕獲測試用例中未考慮的異常; 2、關閉服務器才能輸出覆蓋率信息(已有修改源代碼的解決方案,定時輸出結果;輸出結果之前設置了hook,會與某些服務器的hook沖突,web測試中需要將cobertura.ser文件來回copy 性能 快 小巧 插入的字節碼信息更多 執行方式 maven,ant,命令行 命令行 maven,ant jenkins集成 生成html報告,直接與hudson集成,展示報告,無趨勢圖 無法與hudson集成 有集成的插件,美觀的報告,有趨勢圖 報告實時性 默認關閉,可以動態從jvm dump出數據 可以不關閉服務器 默認是在關閉服務器時才寫結果 維護狀態 持續更新中 停止維護(2005 http://www.eclemma.org/jacoco /trunk/doc/mission.html) 停止維護

更多工具對比參考:https://confluence.atlassian.com/display/CLOVER/Comparison+of+code+coverage+tools

結果展示的工具

Jekins:代碼集成工具,其中的插件Jacoco plugin可以根據.exec文件直接生成覆蓋率報告,並在Jenkins中生成圖表等。
Sonar:一個管理代碼質量的開放式平臺,可以用於做覆蓋結果展示,可以具體看到覆蓋到哪些源代碼,做用例調整參考。
EclEmma:Eclipse的插件,可以用於做覆蓋結果展示,可以具體看到覆蓋到哪些源代碼,做用例調整參考。它嚴格要求執行時的class文件與展示用的class文件一模一樣,比較適合白盒用例測試。

ECLEmma與EMMA的關系
EclEmma 1.X 是基於Emma的eclipse圖形版本,可以自動生成圖片。2.X已經更換為基於jacoco,白盒測試覆蓋工具。

Originally EclEmma was inspired by and technically based on the great EMMA library developed by Vlad Roubtsov.

調研結果

采用Sonar:覆蓋結果展示;Jacoco:用於在服務器端產生覆蓋數據;命令行方式處理匹配結果;
這裏寫圖片描述

由於Jacoco在0.7.3之後有較大變動,為了在測試過程中不出現異常,在構建測試環境時需特備註意軟件版本之間的關聯,以下為典型的兩種版本方案:
- 方案一:Jacoco0.7.4、 SonarQube -5.1.2、Javaplugin 3.1(sonar) 、Java 1.7+、SonarQube Scanner 2.6.1+
- 方案二:Jacoco0.7.5+、SonarQube-5.2+、Javaplugin 3.4(sonar)+ 、Java8+、SonarQube Scanner 2.6.1+

備註:版本號+為此版本以後的都可以兼容,Jacoco目前截止目前版本為0.7.7,SonarQube截止目前版本為5.6, SonarQube Scanner截止目前版本為2.6.1

實現方案

1.下載Jacoco並解壓上傳至服務器
http://www.eclemma.org/jacoco/index.html

2.在tomcat的catalina.sh文件中(圖中位置)加上下面一段代碼:指定javaangent的安裝位置,指定結果文件jacoco.exec(運行後生成此文件)的位置。

if [ "$1" = "run" ]; then
 JAVA_OPTS="-javaagent:XX/lib/jacocoagent.jar=destfile=XX/jacoco.exec"
elif [ "$1" = "start" ]; then
 JAVA_OPTS="-javaagent:XX/lib/jacocoagent.jar=destfile=XX/jacoco.exec "
fi
export JAVA_OPTS

將jacoco的文件路徑替換上文中的XX。如下圖所示:
這裏寫圖片描述

3.檢驗是否部署成功:
啟動tomcat
在命令行輸入ps -ef|grep tomcat,查看對應tomcat是否帶有-javaagent參數,如下圖,則配置成功。
這裏寫圖片描述
刷新為jacoco安裝目錄,查看是否生成了jacoco.exec文件。如果有此文件,則部署成功。
這裏寫圖片描述

4.做功能測試時,需要關閉tomcat獲取結果文件jacoco.exec,不能使用用kill -9,否則不能生成結果,使用kill [進程號]

5.下載SonarQube並解壓到本機。
http://www.sonarqube.org/downloads/

6.開啟SonarQube:進入本地操作系統所對應的目錄,比如本機操作系統為Windows64位的,則進入sonarqube-5.1.2\bin\windows-x86-64目錄,雙擊StartSonar.bat啟動SonarQube。
這裏寫圖片描述

7.驗證SonarQube是否正常運作:瀏覽器訪問http://localhost:9000/ ,然後登陸,用戶名:admin,密碼:admin。
這裏寫圖片描述

8.從SVN下載對應項目的源碼包(包含Java文件及其他三方庫等),源碼包中需包含已經編譯好的Class文件,如圖所示。如果沒有Class文件則可以從伺服服務器中將對應的Class文件下載到對應文件夾。
這裏寫圖片描述

9.在項目文件中新增Sonar項目配置文件:sonar-project.properties,並在文件中設置項目的參數,供Sonar讀取,以及Class文件的地址和結果文件的地址,供Sonar-Runner讀取:
這裏寫圖片描述

腳本代碼參考:

# must be unique in a given SonarQube instance
sonar.projectKey=projectName
# this is the name displayed in the SonarQube UI
sonar.projectName= projectName
#sonar.language=java
sonar.projectversion=1.0

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# Since SonarQube 4.2, this property is optional if sonar.modules is set.
# If not set, SonarQube starts looking for source code from the directory containing
# the sonar-project.properties file.
sonar.sources=.
#sonar.binaries=C:/Users/Administrator/Desktop/codes/web/yyxw/WebRoot/WEB-INF/classes/com
sonar.java.binaries=C:/Users/Administrator/Desktop/codes/web/yyxw/WebRoot/WEB-INF/classes/com
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8

#Set jacoco Configuration
#Code coverage tool
sonar.java.coveragePlugin=jacoco
#Path to the JaCoCo report file containing coverage data by unit tests. The path may be absolute or relative to the project base directory
sonar.jacoco.reportPath=jacoco.exec
#Path to the JaCoCo report file containing coverage data by integration tests. The path may be absolute or relative to the project base directory
sonar.jacoco.itReportPath=jacoco.exec
#sonar.jacoco.reportMissing.force.zero
sonar.jacoco.reportMissing.force.zero=false

10.下載SonarQube Scanner:Sonar插件,讀取sonar-project.properties用於掃描源碼,將Jacoco數據結果文件對應到源碼中去。
http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

11.安裝SonarQube Scanner:將壓縮包解壓,粘貼復制到SonarQube所在文件夾,將文件合並即可。
這裏寫圖片描述

12.將Sonar的bin文件目錄加到系統環境變量中
這裏寫圖片描述

13.驗證環境變量是否加入成功:打開cmd,直接輸入sonar-runner.bat出現圖中界面即成功。
這裏寫圖片描述

14.命令行cmd執行匹配結果
1)打開項目及sonar-project.properties文件所在目錄
cd [工程代碼文件路徑],並在此路徑下啟動sonar,執行sonar-runner.bat即可。
這裏寫圖片描述

2)註意查看dos界面打印信息,如果有錯誤信息,需要及時改正後重試。
這裏寫圖片描述

15.瀏覽器再次打開sonar出現剛剛匹配過的項目,點擊preoject的黑色浮框,可以看到不同的顏色對應了不同的覆蓋程度,顏色越紅覆蓋得越少,顏色越綠,覆蓋得越多,點擊不同的版塊,可以看到版塊內部的覆蓋情況。
這裏寫圖片描述

這裏寫圖片描述

遺留問題

1) Sonar+Jacoco為白盒測試提供參考。
2) 實踐方面,如何融入到開發流程中。
3) 開發流程中需要註意的問題:單功能整體開發。
4) 數據庫相關,Sonar使用的為默認內置的數據庫,如果需要將Sonar配置在其他主機上,則要重新寫配置文件和安裝其他數據庫,詳細文檔見官網。
5) Jacoco的數據結果每次都要手動去服務器下載,要自動下載結果需重新寫配置文件。

擴展閱讀

[1]. Jacoco官網 http://www.eclemma.org/jacoco/index.html
[2]. Sonar官網 http://www.sonarqube.org/
[3]. Cem Kaner .“Software Negligence & Testing Coverage”


Tags: Software 計算方法 覆蓋率 Java 經典

文章來源:


ads
ads

相關文章
ads

相關文章

ad