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

背景javascript

    搜狗商城现有的接口自动化测试框架是使用Python搭建的,共900多条case,天天都会运行一次,从而监控是否有因开发代码变动或者新功能添加而致使的遗漏的bug。但咱们只是依照测试用例来转换成自动化脚本、case,实际上并无度量的指标,也不能保证测试的完整性,因此咱们打算引入代码覆盖率这一指标来度量测试完整性。html

    咱们常常接触的是作单元测试的代码覆盖率,但jacoco也能够进行接口测试的代码覆盖率统计,本篇文章主要介绍使用jacoco+ant来统计tomcat服务的测试代码。其中:java

  • Jacoco是一个开源的覆盖率工具,经过插桩方式来记录代码执行轨迹。nginx

  • Ant 是Java的生成工具,相似于Unix中的Make工具,都是用来编译、生成,ant运行时须要一个XML文件(构建文件)。web

环境部署apache

1、流程api

  • 启动服务携带jacocoagent参数tomcat

  • 生成jacoco.execruby

  • ant任务生成覆盖率bash

2、安装jacoco

    Jacoco安装比较简单,下载后,放到合适的位置,解压便可。

#下载并解压jacocowget http://search.maven.org/remotecontent?filepath=org/jacoco/jacoco/0.8.4/jacoco-0.8.4.zipunzip jacoco-0.8.4.zip

目录结构以下图所示:

  • jacocoagent:运行时启动tcp服务监控代码覆盖,dump出覆盖率数据。

  • jacocoant:jacoco的任务是ant驱动的,因此这个包用来执行jacoco的任务,向tcp服务发送请求。

3、Tomcat配置(此处省略tomcat的安装,请自行安装)

(1)须要在tomcat/bin目录下的catalina.sh添加配置,打开该文件

cd $tomcat_path/binvi 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 startps -ef | grep tomcat

    包含jacocoagent.jar的使用参数,即配置成功。

4、访问API进行测试

(1)手工访问单一/多个接口

    客户端访问项目中提供的API进行测试

http://10.135.54.158/mall-server-api/api/product/sku/sku_stock_detail?product_id=1727504&stock_type=1

(2)运行接口自动化测试框架

    咱们在此步骤是运行的接口自动化测试框架。

5、Ant构建获取代码覆盖率

(1)安装Ant

#下载并解压antwget http://mirrors.koehn.com/apache//ant/binaries/apache-ant-1.9.14-bin.tar.gztar –vxzf apache-ant-1.9.14-bin.tar.gz

(2)修改系统配置文件

vi /etc/profile#set Ant environmentexport ANT_HOME=/usr/apache-ant-1.9.14export 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的困扰。

局限:

  • 测试深度:目前的测试层次维持在对外提供的接口,仅为入口级别,对于接口内部的深层逻辑,没法有效验证。


欢迎添加咱们的搜狗测试微信号,与咱们一块儿聊聊测试。



本文分享自微信公众号 - 搜狗测试(SogouQA)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索