Jacoco远程统计tomcat服务(Windows系统)的代码覆盖率
2017-09-21
1 Jacoco的安装和设置
1.1 什么是Jacoco?
1.2 Jacoco安装
1.3 Tomcat配置
2 在客户端进行功能测试或接口测试
3 Ant安装与配置
3.1 安装
3.2 配置build.xml
4 生成代码覆盖率报告
5 查看结果
开发在做单元测试时,通过开发工具的插件很容易得到测试代码覆盖率。当软件部署好之后,我们通过功能测试或接口测试,能否得到代码覆盖率?Jacoco可以通过JavaAgent技术监控Java程序的到代码覆盖率。
此文介绍java Agent的'tcpserver' output方法,用此方法时,JavaAgent会监听服务器端设置(Tomcat配置)的TCP port,然后把收集到的信息(jacoco.exec)写入TCP connection。然后通过jacocoant在客户端把收集的信息(jacoco.exec)从TCP connection拉取到客户端,再根据收集到信息(jacoco.exec)和源代码生成覆盖率report。
1 Jacoco的安装和设置
1.1 什么是Jacoco?
Jacoco是一个开源的Java代码覆盖率工具,Jacoco可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序。很多第三方的工具提供了对Jacoco的集成,如sonar、Jenkins等。
1.2 Jacoco安装
官网地址:http://www.eclemma.org/jacoco/ (这里下载了jacoco-0.7.4.201502262128.zip版本)
下载后加压到目录:D:CodeCoveragejacoco
1.3 Tomcat配置
1 关闭Tomcat:双击安装目录下的 D: omcatinshutdown.bat (window是bat扩展名、Linux是sh扩展名)
2 修改D: omcatincatalina.bat,在第一行添加如下脚本:
set JAVA_OPTS=-javaagent:D:CodeCoveragejacocolibjacocoagent.jar=includes=*,output=tcpserver,address=172.31.1.32,port=6300,append=true
JVM option 格式:-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]
官方文档:http://www.eclemma.org/jacoco/trunk/doc/agent.html
或者:启动的时候加上javaagent参数
java -javaagent:/opt/quality/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=*,append=true -jar /app/bin/start.jar
3 启动Tomcat:双击安装目录下的 D: omcatinstartup.bat
4 验证JAVA_OPTS是否有修改正确
使用WMIC命令
vmic
process where name="java.exe"
若显示一下内容,表示修改成功
java.exe "D:Javajdk1.8.0_91injava.exe" -javaagent:D:CodeCoveragejacocolibjacocoagent.jar=includes=*,output=tcpserver,address=172.31.1.32,port=6300,append=true
图1 process WMIC
2 在客户端进行功能测试或接口测试
1 测试对象:SpringMVC HelloWorld实例开发及部署
2 功能测试:输入url:http://localhost:8080/HelloSpringMVC/saveResult
说明:在功能测试过程中javaagent会收集覆盖到的代码信息
3 Ant安装与配置
3.1 安装
1 官方网址: http://ant.apache.org -> download -> binary distribute apache-ant-1.9.9-bin.zip
解压到:D:CodeCoverageant
2 验证安装是否成功
在安装目录D:CodeCoverageantin下执行命令:ant -version
3.2 配置build.xml
<?xml version="1.0" encoding="UTF-8"?> <project name="plate_id_sample_service" xmlns:jacoco="antlib:org.jacoco.ant"> <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml"> <classpath path="D:CodeCoveragejacocolibjacocoant.jar"/> </taskdef> <target name="dump"> <!-- address和port和catalina.bat设置保持一致,destfile设置jacoco.exec保存地址 --> <jacoco:dump address="172.31.1.32" reset="true" port="6300" destfile="D:CodeCoveragejacocojacoco.exec"/> </target> <target name="report"> <jacoco:report> <executiondata> <file file="D:CodeCoveragejacocojacoco.exec"/> </executiondata> <structure name="Example Project"> <!-- 可以按软件功能模块设置多个group,方便在report中查看 --> <group name="SpringMVC"> <classfiles> <!--.class文件路径,可以放在客户端--> <fileset dir="D:CodeCoverageprojectHelloSpringMVCclasses"/> </classfiles> <sourcefiles encoding="gbk"> <!--源代码路径,可以放在客户端--> <fileset dir="D:CodeCoverageprojectHelloSpringMVCjava" /> </sourcefiles> </group> </structure> <!-- report文件保存地址 --> <html destdir="D:CodeCoveragejacoco eport"/> </jacoco:report> </target> </project>
4 生成代码覆盖率报告
在ant安装目录运行ant dump命令,把jacoco.exec拉取到build.xml设置的客户端路径
在ant安装目录运行ant report命令,根据build.xml设置jacoco.exec、class和java文件地址生成report
图2 ant命令
5 查看结果
若build.xml没有设置源代码java的地址,就看不到代码内容的覆盖情况,最细只能看到方法的覆盖率统计
图3 覆盖率报表