jacoco + ant遠程統計(tomcat/spring boot)服務的代碼覆蓋率


什么是Jacoco?
Jacoco(java code coverage)是一個開源的Java代碼覆蓋率工具,Jacoco可以嵌入到Ant 、Maven中,並提供了EclEmma Eclipse插件,也可以使用JavaAgent技術監控Java程序。很多第三方的工具提供了對Jacoco的集成,如sonar、Jenkins等。

軟件安裝
Ant
Jacoco

Tomcat配置
1、進入你需要統計代碼覆蓋率的tomcat  
cd /data/tomcat-gateway/bin
2、先關閉這個tomcat的服務
正常情況下可以直接執行  ./shutdown.sh
執行結束后 ps -ef|grep tomcat名 查看是否已經正常關閉,如果還沒有關閉 kill -9 pid(來源於ps的結果)
3、修改 catalina.sh  的JAVA_OPTS/CATALINA_OPTS配置
output=file時,需要shudown服務才能dump出jacoco.exec文件
declare -x CATALINA_OPTS="-javaagent:/data/jacoco/lib/jacocoagent.jar=includes=*,output=file,destfile=/data/jacocoExec/jacoco_gateway.exec"
output=tcpserver時,可以利用ant執行dump操作,無需shutdown服務;
address可以填寫hostname或ip,填ip時需要注意,查看/etc/hosts的hostname映射的ip是什么
declare -x CATALINA_OPTS="-javaagent:/data/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8457,address=172.16.1.31"
具體參數的意思請查看官方文檔
4、啟動服務 ./startup.sh
5、查看一下JAVA_OPTS是否有修改正確,在這有個坑,有一種情況是你把JAVA_OPTS寫在前面,在后面被別人的覆蓋了
ps -ef|grep tomcat名 看出來的結果有沒有剛才你修改的值

6、output=tcpserver時,查看tcpserver有沒有啟來

netstat -tunlp|grep 8457


Spring Boot服務
啟動命令如下:
java -javaagent:/data/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8457,address=172.16.1.31 -jar springboot-xxx.jar

ant任務配置
配置jacocoAnt.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project name="JaCoCo" default="run" xmlns:jacoco="antlib:org.jacoco.ant">
        <!--Jacoco的安裝路徑-->
    <property name="jacocoAntPath" value="/opt/jacoco/lib/jacocoant.jar"/>
        <!--最終生成.exec文件的路徑,Jacoco就是根據這個文件生成最終的報告的-->
    <property name="jacocoExecPath" value="/data/jacocoExec"/>
        <!--生成覆蓋率報告的路徑-->
    <property name="jacocoReportPath" value="/data/jacocoReport"/>
        <!--遠程tomcat服務的ip地址  xxx.xx.xxx.163(172.16.1.31)-->
    <property name="server_ip_test163" value="172.16.1.31"/>
        <!--前面配置的遠程tomcat服務打開的端口,要跟上面配置的一樣-->
    <property name="server_port_cybs" value="8456"/>
    <property name="server_port_gateway" value="8457"/>

        <!--源代碼路徑-->
    <property name="gatewaySrcPath" value="/data/jacocoSrc/Gateway/GATEWAY/fi-website/src/main/java"/>

    <property name="cybsSrcPath" value="/data/jacocoSrc/cybs/src/main/java"/>    

        <!--.class文件路徑-->
    <property name="gatewayClassesPath" value="/data/jacocoClasses/gateway/WEB-INF/classes"/>
<property name="cybsClassesPath" value="/data/jacocoClasses/cybs/WEB-INF/classes"/> <!--讓ant知道去哪兒找Jacoco--> <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml"> <classpath path="${jacocoAntPath}"/> </taskdef> <target name="run"> <echo message="start..."/> <echo message="dump..."/> <antcall target="dump"/> <echo message="merge..."/> <antcall target="merge"/> <echo message="report..."/> <antcall target="report"/> <echo message="end..."/> </target> <!--dump任務: 根據前面配置的ip地址,和端口號,訪問目標tomcat服務,並生成.exec文件。--> <target name="dump"> <jacoco:dump address="${server_ip_test163}" reset="true" destfile="${jacocoExecPath}/jacoco_gateway.exec" port="${server_port_gateway}" append="false"/> <jacoco:dump address="${server_ip_test163}" reset="true" destfile="${jacocoExecPath}/jacoco_cybs.exec" port="${server_port_cybs}" append="false"/> </target> <target name="merge"> <jacoco:merge destfile="${jacocoExecPath}/merged.exec"> <fileset dir="${jacocoExecPath}" includes="*.exec"/> </jacoco:merge> </target> <!--jacoco任務: 根據前面配置的源代碼路徑和.class文件路徑, 根據dump后,生成的.exec文件,生成最終的html覆蓋率報告。--> <target name="report"> <jacoco:report> <executiondata> <file file="${jacocoExecPath}/merged.exec"/> </executiondata> <structure name="JaCoCo Report"> <group name="gateway coverage"> <sourcefiles encoding="UTF-8"> <fileset dir="${gatewaySrcPath}"/> </sourcefiles> <classfiles> <fileset dir="${gatewayClassesPath}"/> </classfiles> </group> <group name="cybs coverage"> <sourcefiles encoding="UTF-8"> <fileset dir="${cybsSrcPath}"/> </sourcefiles> <classfiles> <fileset dir="${cybsClassesPath}"/> </classfiles> </group> </structure> <html destdir="${jacocoReportPath}" encoding="utf-8"/> <csv destfile="${jacocoReportPath}/report.csv"/> <xml destfile="${jacocoReportPath}/report.xml"/> </jacoco:report> </target> </project>

執行ant任務
ant -f jacocoAnt.xml


<jacoco:dump address="${server_ip_test163}" reset="true" destfile="${jacocoExecPath}/jacoco_gateway.exec" port="${server_port_gateway}" append="false"/>

reset=true時,會在dump出exec文件后,清空覆蓋率數據;
append=false時,dump出的exec文件會覆蓋原有的exec文件;append=true時,dump出的exec文件追加至原有的exec文件;


結果展示:

+ cd /data/jacocoAntXml
+ ant -f jacocoAnt.xml
Buildfile: /data/jacocoAntXml/jacocoAnt.xml

run:
     [echo] start...
     [echo] dump...

dump:
[jacoco:dump] Connecting to /172.16.1.15:8457
[jacoco:dump] Dumping execution data to /data/jacocoExec/jacoco_gateway.exec
[jacoco:dump] Connecting to /172.16.1.15:8456
[jacoco:dump] Dumping execution data to /data/jacocoExec/jacoco_cybs.exec
[jacoco:dump] Connecting to /172.16.1.15:8470
[jacoco:dump] Dumping execution data to /data/jacocoExec/jacoco_creditCardBank.exec
[jacoco:dump] Connecting to /172.16.1.15:8459
[jacoco:dump] Dumping execution data to /data/jacocoExec/jacoco_mps.exec
[jacoco:dump] Connecting to /172.16.1.15:8451
[jacoco:dump] Dumping execution data to /data/jacocoExec/jacoco_accounting.exec
[jacoco:dump] Connecting to /172.16.1.15:8458
[jacoco:dump] Dumping execution data to /data/jacocoExec/jacoco_ordercenter.exec
[jacoco:dump] Connecting to /172.16.1.15:8453
[jacoco:dump] Dumping execution data to /data/jacocoExec/jacoco_notification.exec
[jacoco:dump] Connecting to /172.16.1.15:8454
[jacoco:dump] Dumping execution data to /data/jacocoExec/jacoco_poss.exec
     [echo] merge...

merge:
[jacoco:merge] Loading execution data file /data/jacocoExec/jacoco_accounting.exec
[jacoco:merge] Loading execution data file /data/jacocoExec/jacoco_creditCardBank.exec
[jacoco:merge] Loading execution data file /data/jacocoExec/jacoco_cybs.exec
[jacoco:merge] Loading execution data file /data/jacocoExec/jacoco_gateway.exec
[jacoco:merge] Loading execution data file /data/jacocoExec/jacoco_mps.exec
[jacoco:merge] Loading execution data file /data/jacocoExec/jacoco_notification.exec
[jacoco:merge] Loading execution data file /data/jacocoExec/jacoco_ordercenter.exec
[jacoco:merge] Loading execution data file /data/jacocoExec/jacoco_poss.exec
[jacoco:merge] Loading execution data file /data/jacocoExec/merged.exec
[jacoco:merge] Writing merged execution data to /data/jacocoExec/merged.exec
     [echo] report...

report:
[jacoco:report] Loading execution data file /data/jacocoExec/merged.exec
[jacoco:report] Writing bundle 'webgate coverage' with 701 classes
[jacoco:report] Writing bundle 'gateway coverage' with 198 classes

[echo] end...
BUILD SUCCESSFUL

 




免責聲明!

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



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