无论是否在项目中起着持续、有效的做用,代码覆盖率统计已经成为各产品组必备的工具。凭借丰富的覆盖率度量维度、灵活的数据管理与报告过滤方案和良好的工具支持,Jacoco成为部门内部技术成熟,使用普遍的工具。java
Jacoco能够嵌入到Ant、Maven中,提供了EclEmma Eclipse插件,也能够使用Java Agent技术监控Java程序;另外还有不少第三方工具支持Jacoco集成,如sonar、Jenkins、IDEA。Jacoco用法并不复杂但其灵活的应用方式,想要与不断更新的项目环境良好的适配工做,仍是须要咱们花一些时间来了解它,找到最佳使用方式。git
下面介绍一个基于当前内部主流技术平台(omad、jenkins、sonar)的代码覆盖率统计实施方案:<NetJaco>web
NetJaco是一个集成工具包,采用Jacoco Ant Tasks+Java Agent的工做方式,工具包含下面几个部分:tomcat
图1.NetJaco工具包服务器
【Java Agent】为了有更好的可用性和独立性,NetJaco选择Java Agent插桩的工做方式与源码解耦,而且不依赖第3方工具,下降了维护成本。maven
【ant】如今大部分Java项目经过maven管理,Jacoco的maven plug-in一样能够很好支持maven项目,可是其配置相对复杂,而且须要须要修改源代码的pom.xml,这可能会招致开发同事的反对,也使没有源码权限的测试难行步履维艰。因此须要ant架包为Jacoco Ant Tasks提供支持。tcp
【Jacocoant】、【Sonar-ant-task】、【Jacocoagent】架包。工具
【build-jacoco.xml】基于ant tasks的jacoco执行脚本,默认已提供了merge,backup,delete,dump等功能已经能知足大部分使用场景。测试
【build-sonar.xml】sonar条用脚本,基于ant tasks。代码覆盖率统计分析,上传到sonar服务器并展现。ui
图2.NetJaco工做示例
如何实施?
1.将Java Agent上传到应用服务器
NetJaco包含了Java Agent,能够用命令 git clone https://git.hz.netease.com/git/hzdingweiwei/NetJaco.git 将工具包下载到应用服务器上。
Jacoco有两大模块,Jacocoagent和Jacocoant。测试服务器上开启tcp端口,Jacocoagent 注入 JAVA_OPTS, 监听整个测试过程, 记录测试覆盖的数据。
而Jacocoant做为客户端能够配置在本地, 经过发送请求,将jacocoagent 监控到的数据,都写入.exec 文件, 而对源码与class文件进行分析比较,生成测试覆盖率文件、映射源码得出测试报告等。
2.修改tomcat启动参数,重启服务让jacocoagent开始工做
修改应用对应tomcat的启动文件:
JAVA_OPTS="$JAVA_OPTS -javaagent:/home/print/ wwwroot/ jacoco/lib /jacocoagent.jar=includes=com.netease.*,output= tcpserver,port=21005,address=*"
经过omad部署的项目则修改实例的JVM参数,示例以下:
增长jacocoagent.jar在服务器上的实际路径,includes指项目应用所在的包路径,output选择tcpserver。address用*号则能够用ip和服务器名来访问,最后同一台服务器上的应用须要注意port的惟一性。
重启该服务,经过检查端口是否被调用来检查jacoco是否在工做:
至此Jacoco已经开始经过agent来监控文件执行的覆盖率数据,这些数据被保存在各服务的内存中,JVM退出时数据释放,咱们须要在tomcat中止或重启前将监控的数据dump出来。
3.配置build-jacoco.xml,收集代码覆盖率监控数据
如图2所示,覆盖率统计任务触发以及与sonar平台的对接工做由jenkins来执行。将NetJaco工具包下载到jenkins slave上,同时该机器上须要一份项目的源码用于覆盖率分析。
前面提到build-jacoco.xml已经默认提供jacoco merge,dump,delete,backup功能,针对项目的个性化配置须要关注下面几个值:
< project name =" jacoco" basedir= "/home/qafunc/ jenkins/workspace/vstore_Jacoco_collection" ... > # basedir指向jenkins job的workspace目录
< property name= "tool_dir" value= "${basedir }/coverage/tools" /> #tool_dir指向NetJaco工具包
源码、代码编辑后文件以及应用所在服务器和port口配置示例以下:
mainsite_web = {"codedir":"/****/mainsite-web",\ #该应用源码所在的路径
"webroot_dir":"/home/qafunc/coderepo/*****/mainsite-web/target/vstore",\ #该应用源码编译后,class文件所在的路径
"server_ip":"classb-*****.server.163.org",\ #该应用实例所在的服务器地址
"server_port":"21005"} #jacoco监控该应用所用的port号
4.配置build-snoar.xml,执行覆盖率统计分析。
工具包提供了执行覆盖率统计分析的sonar ant脚本模板build-snoar.xml,大部分配置均可以重用,须要注意的个性化配置项以下:
< property name= "sonar.host.url" value= "http://classb-qatest38.server.163.org:9000/" /> #当前部门的公用sonar服务器地址
< property name= "sonar_lib_dir" value= "${basedir }/coverage/tools/sonar" /> #指向NetJaco工具包sonar ant架包所在路径
< property name= "sonar.projectName" value= "vstore " /> #sonar上生成的项目名称
< property name= "code_dir" value= "/ home/ qafunc/coderepo/ vstore-parent/vstore -front-web/mainsite-web" /> #jenkins 节点机上应用的源码地址
< property name= "sonar.binaries" value= "${webroot_dir}/target/classes" /> # jenkins节点机上源码编译后文件所在地址
5.执行jenkins job dump应用服务器上的覆盖率数据,而后调用sonar服务进行覆盖率分析。
配置一个jenkins job用来触发jacoco请求。
6.查看统计结果
<用后感>
以上几步就是NJaco的完整操做说明。已经在项目上进行了实践,应用和tomcat数量众多的情况并无增长太多的工做量,足见其可用性。
关于如何更好的应用sonar的覆盖率统计报告?给产品测试带来实际指导意义,是一个能够深挖的议题。但愿你们之后继续讨论。