zoukankan      html  css  js  c++  java
  • 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



  • 相关阅读:
    c# 基础
    摹客插件,自动识别画板大小!
    知道这10点,你才是真正会画线框图
    在线原型实例(可编辑):图片社交-InstagraAPP
    16 种原型设计工具及其使用场景
    微博APP在线原型实例(可编辑)
    5款前端切图工具大比拼:谁是最强切图神器
    你真的了解这4款协作设计吗
    nvm 安装及使用(npm版本管理工具)
    webpack入门四 安装vue,并打包
  • 原文地址:https://www.cnblogs.com/dingtian/p/7754079.html
Copyright © 2011-2022 走看看