代碼覆蓋率統計


代碼覆蓋率統計

 

不管是否在項目中起着持續、有效的作用,代碼覆蓋率統計已經成為各產品組必備的工具。憑借豐富的覆蓋率度量維度、靈活的數據管理與報告過濾方案和良好的工具支持,Jacoco成為部門內部技術成熟,使用廣泛的工具。

Jacoco可以嵌入到Ant、Maven中,提供了EclEmma Eclipse插件,也可以使用Java Agent技術監控Java程序;另外還有很多第三方工具支持Jacoco集成,如sonar、Jenkins、IDEA。Jacoco用法並不復雜但其靈活的應用方式,想要與不斷更新的項目環境良好的適配工作,還是需要我們花一些時間來了解它,找到最佳使用方式。

 

下面介紹一個基於當前內部主流技術平台(omad、jenkins、sonar)的代碼覆蓋率統計實施方案:<NetJaco>

NetJaco是一個集成工具包,采用Jacoco Ant Tasks+Java Agent的工作方式,工具包含下面幾個部分:

圖1.NetJaco工具包

 

【Java Agent】為了有更好的可用性和獨立性,NetJaco選擇Java Agent插樁的工作方式與源碼解耦,並且不依賴第3方工具,降低了維護成本。

【ant】現在大部分Java項目通過maven管理,Jacoco的maven plug-in同樣可以很好支持maven項目,但是其配置相對復雜,並且需要需要修改源代碼的pom.xml,這可能會招致開發同事的反對,也使沒有源碼權限的測試難行寸步難行。所以需要ant架包為Jacoco Ant Tasks提供支持。

【Jacocoant】、【Sonar-ant-task】、【Jacocoagent】架包。

【build-jacoco.xml】基於ant tasks的jacoco執行腳本,默認已提供了merge,backup,delete,dump等功能已經能滿足大部分使用場景。

【build-sonar.xml】sonar條用腳本,基於ant tasks。代碼覆蓋率統計分析,上傳到sonar服務器並展示。

圖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口配置示例如下:

  1. mainsite_web = {"codedir":"/****/mainsite-web",\ #該應用源碼所在的路徑

  2. "webroot_dir":"/home/qafunc/coderepo/*****/mainsite-web/target/vstore",\ #該應用源碼編譯后,class文件所在的路徑

  3. "server_ip":"classb-*****.server.163.org",\ #該應用實例所在的服務器地址

  4. "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的覆蓋率統計報告?給產品測試帶來實際指導意義,是一個可以深挖的議題。希望大家以后繼續討論。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM