jacoco集成测试覆盖率(ant)

背景:
日常版本测试过程中,由于只有接口和功能测试;版本上线后,发现会有一些小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/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352