Jacoco统计接口测试的代码覆盖率

发表于:2019-8-09 10:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:小小    来源:搜狗测试

  背景
  搜狗商城现有的接口自动化测试框架是使用Python搭建的,共900多条case,每天都会运行一次,从而监控是否有因开发代码变更或者新功能添加而导致的遗漏的bug。但我们只是依照测试用例来转换成自动化脚本、case,实际上并没有度量的指标,也不能保证测试的完整性,所以我们打算引入代码覆盖率这一指标来度量测试完整性。
  我们经常接触的是做单元测试的代码覆盖率,但jacoco也可以进行接口测试的代码覆盖率统计,本篇文章主要介绍使用jacoco+ant来统计tomcat服务的测试代码。其中:
  Jacoco是一个开源的覆盖率工具,通过插桩方式来记录代码执行轨迹。
  Ant 是Java的生成工具,类似于Unix中的Make工具,都是用来编译、生成,ant运行时需要一个XML文件(构建文件)。
  环境部署
  一、流程
  启动服务携带jacocoagent参数
  生成jacoco.exec
  ant任务生成覆盖率
  二、安装jacoco
  Jacoco安装比较简单,下载后,放到合适的位置,解压即可。
   #下载并解压jacoco
  wget http://search.maven.org/remotecontent?filepath=org/jacoco/jacoco/0.8.4/jacoco-0.8.4.zip
  unzip jacoco-0.8.4.zip
  目录结构如下图所示:
  jacocoagent:运行时启动tcp服务监控代码覆盖,dump出覆盖率数据。
  jacocoant:jacoco的任务是ant驱动的,所以这个包用来执行jacoco的任务,向tcp服务发送请求。
  三、Tomcat配置(此处省略tomcat的安装,请自行安装)
  (1)需要在tomcat/bin目录下的catalina.sh添加配置,打开该文件
   cd $tomcat_path/bin
  vi catalina.sh
  (2)修改catalina.sh的JAVA_OPTS配置
   JAVA_OPTS="-server -javaagent:/usr/local/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8044,address=127.0.0.1,append=true -Xverify:none"
  # JAVA_OPTS="-javaagent:[yourPath/]jacocoagent.jar=includes=com.companyName.*,output=tcpserver,port=PORT,address=IP -Xverify:none"
  yourPath :放 jacocoagent.jar 文件的目录路径;
  includes 是指要收集哪些类(注意不要光写包名,最后要写.*),不写的话默认是*,会收集应用服务上所有的类,包括服务器和其他中间件的类,一般要过滤(当然如果你愿意写*也完全没有问题,如:"includes=com.*" or "includes=*");
  output 有 4 个值,分别是 file、tcpserver、tcpclient、mbean,默认是 file。使用 file 的方式只有在停掉应用服务的时候才能产生覆盖率文件,而使用 tcpserver 的方式可以在不停止应用服务的情况下下载覆盖率文件;
  address 是 IP 地址,IP 就是 Tomcat 服务器的机器的 IP,至于是写 `服务器本机的 IP` 还是写 "127.0.0.1" 要看情况:1) 如果是在 Tomcat 服务器上执行" ant dump"的话,就直接写 address=127.0.0.1;2) 如果执行 "ant dump" 不是在 Tomcat 服务器上执行的,就得写服务器本机的IP;
  port 是端口;
  `-Xverify:none`:这个参数是防止启动主程序异常才加的(也可以不加)。
  (3)部署项目
  将搜狗商城的java工程项目打包(可以通过maven 的package命令打成war包),之后直接上传到tomcat中的webapps目录下。
  (4)启动tomcat服务并查看是否正确
   service tomcat start
  ps -ef | grep tomcat
  包含jacocoagent.jar的使用参数,即配置成功。
  四、访问API进行测试
  (1)手工访问单一/多个接口
  客户端访问项目中提供的API进行测试:
 http://10.135.54.158/mall-server-api/api/product/sku/sku_stock_detail?product_id=1727504&stock_type=1
  (2)运行接口自动化测试框架
  我们在此步骤是运行的接口自动化测试框架。
  五、Ant构建获取代码覆盖率
  (1)安装Ant
   #下载并解压ant
  wget http://mirrors.koehn.com/apache//ant/binaries/apache-ant-1.9.14-bin.tar.gz
  tar –vxzf apache-ant-1.9.14-bin.tar.gz
  (2)修改系统配置文件
   vi /etc/profile
  #set Ant environment
  export ANT_HOME=/usr/apache-ant-1.9.14
  export PATH=$PATH:$ANT_HOME/bin
  (3)立即将配置生效
 source /etc/proifle
  (4)测试ant是否生效
 ant -version
  (5)建立build.xml文件
  ant的默认生成文件为build.xml,输入ant后,ant会在当前目录下搜索是否有build.xml,如果有,则执行;当然也可以自定义生成文件,通过ant -f a.xml即可指定a.xml为生成文件。
   <?xml version="1.0" encoding="UTF-8" ?>
  <project name="Jacoco" xmlns:jacoco="antlib:org.jacoco.ant" default="report">
  <property name="result.dir" location="/usr/local/tomcat/apache-tomcat-8.5.38/webapps/mall-server-api/WEB-INF/" />
  <property name="result.classes.dir" location="${result.dir}/classes" />
  <property name="result.report.dir" location="/usr/local/jacoco/report/" />
  <property name="resource.code" location="/usr/local/code/mall-server/mall-server-api/src/main/java/" />
  <property name="jacocoantPath" value="/usr/local/jacoco/lib/jacocoant.jar/"/>
  <property name="integrationJacocoexecPath" value="/usr/local/jacoco/jacoco.exec/"/>
  <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
  <classpath path="${jacocoantPath}" />
  </taskdef>
  <target name="dump">
  <!—port为之前server端tomcat服务打开的端口,要和上面配置的一样-->
  <!—destfile指定生成的文件地址-->
  <jacoco:dump address="127.0.0.1" port="8044" reset="false" destfile="${integrationJacocoexecPath}" append="false"/>
  </target>
  <target name="report" depends="dump">
  <!-- Create coverage report -->
  <jacoco:report>
  <!-- This task needs the collected execution data and ... -->
  <executiondata>
  <file file="${integrationJacocoexecPath}" />
  </executiondata>
  <!-- the class files and optional source files ... -->
  <structure name="API_CodeCoverage">
  <group name="API">
  <classfiles>
  <fileset dir="${result.classes.dir}"/>
  </classfiles>
  <sourcefiles encoding="UTF-8">
  <fileset dir="${resource.code}"/>
  </sourcefiles>
  </group>
  </structure>
  <!-- to produce reports in different formats. -->
  <html destdir="${result.report.dir}" />
  </jacoco:report>
  </target>
  </project>
  (6)执行ant命令
   #生成jacoco.exec文件,里面有覆盖率的数据
  ant dump
  #根据exec生成相应的覆盖率report文件(如果通过Jenkins插件这步骤可跳过)
  ant report
  (7)查看生成代码覆盖率报告
  生成报告地址是build.xml 中配置的。红色表示未测试未覆盖到的代码,绿色表示测试已经覆盖到代码。下载生成的代码覆盖率文件夹中的index.html文件,如图所示:
  总结
  优点
  简单易学;
  时间成本低,短期内可获得收益;
  解决不会Java的困扰。
  局限:
  测试深度:目前的测试层次维持在对外提供的接口,仅为入口级别,对于接口内部的深层逻辑,无法有效验证。

     上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
精选软件测试好文,快来阅读吧~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号