美文网首页
jacoco集成测试覆盖率(ant)

jacoco集成测试覆盖率(ant)

作者: 多夏_zoey | 来源:发表于2019-06-15 14:30 被阅读0次

    背景:
    日常版本测试过程中,由于只有接口和功能测试;版本上线后,发现会有一些小bug遗漏;也会有困惑,测试过程阶段已经测试的很仔细了,就想统计一下测试阶段,场景用例对开发代码的覆盖率是多少。因为我们后端代码是java写的,所以选用了jacoco;使用的是jacocoagent+ant方式;我们的后端项目介绍:springboot项目+jenkins打包+自研的工具部署
    实战步骤
    1、在需要统计覆盖率的远程服务器上,部署下载的 jacoco的zip 包;
    1)本来想用wget +url方式下载结果不支持,就想下载到本地;然后通过scp传到远程服务器
    scp /Users/shifangfang/ydh-apk/remotecontent?filepath=org%2Fjacoco%2Fjacoco%2F0.8.3%2Fjacoco-0.8.3.zip root@172.21.34.6:/home/jacoco/
    2)解压缩zip包
    unzip remotecontent?filepath=org%2Fjacoco%2Fjacoco%2F0.8.3%2Fjacoco-0.8.3.zip
    2、修改远程服务器上启动脚本;
    1)以防出错,先备份一下启动脚本
    2)停止当前启动的tomcat服务
    3)在备份的启动脚本starup_bak.sh中添加参数;
    -javaagent:[jacoco安装路径]=includes=[待测试class路径],output=tcpserver,port=[待测试服务器开放的端口],address=[待测试服务器ip] -Xverify:none

    image

    比如:

    添加之前启动项为:
    java -Xmx1024m -Xms1024m -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=64m -Xss512k -server -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.ssl=false -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -Duser.home=/home/tomcat -Dspring.config.location=/home/tomcat/conf/application.properties -jar /home/tomcat/bin/server.jar
    添加之后启动项为:
    java -javaagent:/home/jacoco/lib/jacocoagent.jar=includes=com.qianmi.d2p.admin.api.action.chain.*,output=tcpserver,port=8044,address=172.21.34.6 -Xverify:none -Xmx1024m -Xms1024m -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=64m -Xss512k -server -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.ssl=false -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -Duser.home=/home/tomcat -Dspring.config.location=/home/tomcat/conf/application.properties -jar /home/tomcat/bin/server.jar
    

    参数解释:
    /home/jacoco/lib/jacocoagent.jar---远程服务器上jacocoagent.jar位置
    includes=com.qianmi.d2p.admin.api.action.chain.*---需要统计覆盖率的包中的文件
    output=tcpserver---输出报告形式
    port=8044---待测服务器上开发的代理端口
    address=172.21.34.6---待测服务器(PS:如果是在 待测服务器上执行ant dump的话,就直接写address=127.0.0.1;如果不是就写待测服务器的地址)
    4)启动服务,并查看jacocoagent是否启动成功

    image
    3、部署ant
    ant服务器地址可以和远程被测服务器用一台,也可以分开;我是用单独的服务器
    1)下载好ant包后,解压缩unzip apache-ant-1.9.14-bin.zip
    2)配置环境变量vi /etc/profile
    export ANT_HOME=/usr/apache-ant-1.9.14
    export PATH=$PATH:$ANT_HOME/bin:$JAVA_HOME/bin
    

    3)测试ant是否安装成功
    [root@lin-21-4-249 ~]# ant -version
    Apache Ant(TM) version 1.9.14 compiled on March 12 2019
    4、将源码和远程服务器上待测的jar拷贝到ant服务器
    1)上传源码到ant服务器,然后解压缩源码:

    scp d2p-admin-bff.zip root@172.21.4.249:/home/
    unzip d2p-admin-bff.zip
    
    image

    2)上传部署的jar到ant服务器,然后解压缩部署的jar包:

    jar xvf d2p-admin-api-web-1.18.54-RELEASE.jar
    

    5、在ant服务器上创建build.xml文件
    1)在ant安装目录/bin下创建build.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="JacocoCodeCoveage" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
        <!--Jacoco 的安装路径-->
      <property name="jacocoantPath" value="/home/jacoco/lib/jacocoant.jar"/>
      <!--最终生成 .exec 文件的路径,Jacoco 就是根据这个文件生成最终的报告的-->
      <property name="jacocoexecPath" value="/home/exec/"/>
        <!--生成覆盖率报告的路径-->
      <property name="reportfolderPath" value="/home/jacoco_report"/>
      <!--远程 Tomcat 服务的 ip 地址-->
      <property name="server_ip" value="172.21.34.6"/>
      <!--前面配置的远程 Tomcat 服务打开的端口,要跟上面配置的一样-->
      <property name="server_port" value="8044"/>
      <!--源代码路径-->
      <property name="checkOrderSrcPath" value="/home/d2p-admin-bff/d2p-admin-api-web/src/main/java" />
      <!--.class 文件路径-->
      <property name="checkOrderClasspath" value="/home/d2p_admin_api/BOOT-INF/classes/com/qianmi/d2p/admin/api/action/trade/" />
      
      <tstamp>  
            <format property="stime" pattern="yyyy-MM-dd HH-mm-ss" locale="cn"/>  
        </tstamp>
    
      <!--让 ant 知道去哪儿找 Jacoco-->
      <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
          <classpath path="${jacocoantPath}" />
      </taskdef>
    
      <!--dump 任务:
          根据前面配置的 ip 地址,和端口号,
          访问目标 Tomcat 服务,并生成 .exec 文件。-->
      <target name="dump">
          <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}ApiTest${stime}.exec" port="${server_port}" append="true" dump="true"/>
      </target>
    
      <!--merge指定的.exec文件-->
        <target name="merge_exec">
            <jacoco:merge destfile="${jacocoexecPath}ApiTest-merge.exec">
                <fileset dir="${jacocoexecPath}" includes="ApiTest*.exec" />
            </jacoco:merge>
        </target>
      
      <!--jacoco 任务:
          根据前面配置的源代码路径和 .class 文件路径,
          根据 dump 后,生成的 .exec 文件,生成最终的 html 覆盖率报告。-->
      <target name="report">
          <delete dir="${reportfolderPath}" />
          <mkdir dir="${reportfolderPath}" />
          
          <jacoco:report>
              <executiondata>
                  <file file="${jacocoexecPath}ApiTest-merge.exec" />
              </executiondata>
                  
              <structure name="JaCoCo Report">
                  <group name="Check Order related">           
                      <classfiles>
                          <fileset dir="${checkOrderClasspath}">
                              <!-- 过滤不必要的文件 -->
                              <exclude name="**/R.class"/>
                              <exclude name="**/R$*.class"/>
                              <exclude name="**/*$ViewInjector*.*"/>
                              <exclude name="**/BuildConfig.*"/>
                              <exclude name="**/Manifest*.*"/>
                          </fileset>
                      </classfiles>
                      <sourcefiles encoding="UTF-8">
                          <fileset dir="${checkOrderSrcPath}" />
                      </sourcefiles>
                  </group>
              </structure>
              <html destdir="${reportfolderPath}" encoding="UTF-8" />
              <csv destfile="${reportfolderPath}/coverage-report.csv" encoding="UTF-8"/>
              <xml destfile="${reportfolderPath}/coverage-report.xml" encoding="UTF-8"/>         
          </jacoco:report>
      </target>
      <target name="rebuild" depends="dump,merge_exec,report"></target>
    </project>
    

    6、执行测试后,下载报告
    1)在ant所在的服务器bin下

    ant dump
    ant merge_exec
    ant report
    

    7、把生成的report下载到本地
    1)ant所在服务器,之前build.xml中report路径为:/home/jacoco_report
    2)本地终端执行:

    scp  -r root@172.21.4.249:/home/jacoco_report/ ~/Desktop/
    

    3)打开下载文件夹下面的index.html

    image

    参考文档:https://www.jianshu.com/p/639e51c76544

    https://www.jianshu.com/p/b6a7ab72eb2d

    PS:以上内容部分抽象成脚本后执行步骤
    1)修改tomcat启动脚本,添加jaococo脚本名称startup.sh
    添加参数

    PACKAGES=$1
    serverIP=$2
    JACOCO_OPTS=-javaagent:/home/jacoco/lib/jacocoagent.jar=includes=${PACKAGES},output=tcpserver,port=8044,address=${serverIP}
    java $JACOCO_OPTS -Xverify:none $JAVA_OPTS $CATALINA_OPTS -jar "$APP_HOME"/bin/server.jar
    

    执行脚本(我们项目需要切到tomcat用户下执行)

    sh startup_bak.sh [待测试包名] [待测服务器IP]
    比如sh startup.sh com.qianmi.d2p.admin.api.action.trade.* 172.21.34.6
    

    2)修改ant的build.xml中部分内容

    <!--远程 Tomcat 服务的 ip 地址-->
      <property name="server_ip" value="172.21.34.6"/>
      <!--前面配置的远程 Tomcat 服务打开的端口,要跟上面配置的一样-->
      <property name="server_port" value="8044"/>
      <!--源代码路径-->
      <property name="checkOrderSrcPath" value="/home/d2p-admin-bff/d2p-admin-api-web/src/main/java" />
      <!--.class 文件路径-->
      <property name="checkOrderClasspath" value="/home/d2p_admin_api/BOOT-INF/classes/com/qianmi/d2p/admin/api/action/trade/" />
    

    3)上传源码及解压缩打包的jar包使用脚本执行:vi /home/jacoco.sh

    #!/bin/sh
    #1、先启动jacoco
    echo "先启动jacoco"
    #cd /home/tomcat/bin
    #./startup_bak.sh
    #1、下载源码
    rm -rf /home/d2p-admin-bff
    cd /home
    sourceURL=$1
    git clone ${sourceURL}
    #2、解压缩部署的jar包
    cd /home/d2p_admin_api/
    rm -rf *
    packageName=$2
    cp /home/tomcat/bin/${packageName} /home/d2p_admin_api/
    cd /home/d2p_admin_api
    jar xvf ${packageName}
    #3、生成report
    cd /home/apache-ant-1.9.14/bin/
    ant dump
    ant merge_exec
    ant report
    

    执行脚本(由于权限问题,需要切换到root用户下执行)

    sh jacoco.sh [源码git地址] [部署的jar包]
    

    4)本机下载服务器上生成的jacoco报告

    scp  -r root@[报告所在服务器地址]:/home/jacoco_report/ ~/Desktop/
    

    相关文章

      网友评论

          本文标题:jacoco集成测试覆盖率(ant)

          本文链接:https://www.haomeiwen.com/subject/nztbfctx.html