無論是否在項目中起着持續、有效的做用,代碼覆蓋率統計已經成爲各產品組必備的工具。憑藉豐富的覆蓋率度量維度、靈活的數據管理與報告過濾方案和良好的工具支持,Jacoco成爲部門內部技術成熟,使用普遍的工具。java
Jacoco能夠嵌入到Ant、Maven中,提供了EclEmma Eclipse插件,也能夠使用Java Agent技術監控Java程序;另外還有不少第三方工具支持Jacoco集成,如sonar、Jenkins、IDEA。Jacoco用法並不複雜但其靈活的應用方式,想要與不斷更新的項目環境良好的適配工做,仍是須要咱們花一些時間來了解它,找到最佳使用方式。git
下面介紹一個基於當前內部主流技術平臺(omad、jenkins、sonar)的代碼覆蓋率統計實施方案:<NetJaco>web
NetJaco是一個集成工具包,採用Jacoco Ant Tasks+Java Agent的工做方式,工具包含下面幾個部分:tomcat
圖1.NetJaco工具包服務器
【Java Agent】爲了有更好的可用性和獨立性,NetJaco選擇Java Agent插樁的工做方式與源碼解耦,而且不依賴第3方工具,下降了維護成本。maven
【ant】如今大部分Java項目經過maven管理,Jacoco的maven plug-in一樣能夠很好支持maven項目,可是其配置相對複雜,而且須要須要修改源代碼的pom.xml,這可能會招致開發同事的反對,也使沒有源碼權限的測試難行步履維艱。因此須要ant架包爲Jacoco Ant Tasks提供支持。tcp
【Jacocoant】、【Sonar-ant-task】、【Jacocoagent】架包。工具
【build-jacoco.xml】基於ant tasks的jacoco執行腳本,默認已提供了merge,backup,delete,dump等功能已經能知足大部分使用場景。測試
【build-sonar.xml】sonar條用腳本,基於ant tasks。代碼覆蓋率統計分析,上傳到sonar服務器並展現。ui
圖2.NetJaco工做示例
如何實施?
1.將Java Agent上傳到應用服務器
NetJaco包含了Java Agent,能夠用命令 git clone https://git.hz.netease.com/git/hzdingweiwei/NetJaco.git 將工具包下載到應用服務器上。
Jacoco有兩大模塊,Jacocoagent和Jacocoant。測試服務器上開啓tcp端口,Jacocoagent 注入 JAVA_OPTS, 監聽整個測試過程, 記錄測試覆蓋的數據。
而Jacocoant做爲客戶端能夠配置在本地, 經過發送請求,將jacocoagent 監控到的數據,都寫入.exec 文件, 而對源碼與class文件進行分析比較,生成測試覆蓋率文件、映射源碼得出測試報告等。
2.修改tomcat啓動參數,重啓服務讓jacocoagent開始工做
修改應用對應tomcat的啓動文件:
JAVA_OPTS="$JAVA_OPTS -javaagent:/home/print/ wwwroot/ jacoco/lib /jacocoagent.jar=includes=com.netease.*,output= tcpserver,port=21005,address=*"
經過omad部署的項目則修改實例的JVM參數,示例以下:
增長jacocoagent.jar在服務器上的實際路徑,includes指項目應用所在的包路徑,output選擇tcpserver。address用*號則能夠用ip和服務器名來訪問,最後同一臺服務器上的應用須要注意port的惟一性。
重啓該服務,經過檢查端口是否被調用來檢查jacoco是否在工做:
至此Jacoco已經開始經過agent來監控文件執行的覆蓋率數據,這些數據被保存在各服務的內存中,JVM退出時數據釋放,咱們須要在tomcat中止或重啓前將監控的數據dump出來。
3.配置build-jacoco.xml,收集代碼覆蓋率監控數據
如圖2所示,覆蓋率統計任務觸發以及與sonar平臺的對接工做由jenkins來執行。將NetJaco工具包下載到jenkins slave上,同時該機器上須要一份項目的源碼用於覆蓋率分析。
前面提到build-jacoco.xml已經默認提供jacoco merge,dump,delete,backup功能,針對項目的個性化配置須要關注下面幾個值:
< project name =" jacoco" basedir= "/home/qafunc/ jenkins/workspace/vstore_Jacoco_collection" ... > # basedir指向jenkins job的workspace目錄
< property name= "tool_dir" value= "${basedir }/coverage/tools" /> #tool_dir指向NetJaco工具包
源碼、代碼編輯後文件以及應用所在服務器和port口配置示例以下:
mainsite_web = {"codedir":"/****/mainsite-web",\ #該應用源碼所在的路徑
"webroot_dir":"/home/qafunc/coderepo/*****/mainsite-web/target/vstore",\ #該應用源碼編譯後,class文件所在的路徑
"server_ip":"classb-*****.server.163.org",\ #該應用實例所在的服務器地址
"server_port":"21005"} #jacoco監控該應用所用的port號
4.配置build-snoar.xml,執行覆蓋率統計分析。
工具包提供了執行覆蓋率統計分析的sonar ant腳本模板build-snoar.xml,大部分配置均可以重用,須要注意的個性化配置項以下:
< property name= "sonar.host.url" value= "http://classb-qatest38.server.163.org:9000/" /> #當前部門的公用sonar服務器地址
< property name= "sonar_lib_dir" value= "${basedir }/coverage/tools/sonar" /> #指向NetJaco工具包sonar ant架包所在路徑
< property name= "sonar.projectName" value= "vstore " /> #sonar上生成的項目名稱
< property name= "code_dir" value= "/ home/ qafunc/coderepo/ vstore-parent/vstore -front-web/mainsite-web" /> #jenkins 節點機上應用的源碼地址
< property name= "sonar.binaries" value= "${webroot_dir}/target/classes" /> # jenkins節點機上源碼編譯後文件所在地址
5.執行jenkins job dump應用服務器上的覆蓋率數據,而後調用sonar服務進行覆蓋率分析。
配置一個jenkins job用來觸發jacoco請求。
6.查看統計結果
<用後感>
以上幾步就是NJaco的完整操做說明。已經在項目上進行了實踐,應用和tomcat數量衆多的情況並無增長太多的工做量,足見其可用性。
關於如何更好的應用sonar的覆蓋率統計報告?給產品測試帶來實際指導意義,是一個能夠深挖的議題。但願你們之後繼續討論。