代码覆盖率统计

不管是否在项目中起着持续、有效的作用,代码覆盖率统计已经成为各产品组必备的工具。凭借丰富的覆盖率度量维度、灵活的数据管理与报告过滤方案和良好的工具支持,Jacoco成为部门内部技术成熟,使用广泛的工具。

Jacoco可以嵌入到Ant、Maven中,提供了EclEmma Eclipse插件,也可以使用Java Agent技术监控Java程序;另外还有很多第三方工具支持Jacoco集成,如sonar、Jenkins、IDEA。Jacoco用法并不复杂但其灵活的应用方式,想要与不断更新的项目环境良好的适配工作,还是需要我们花一些时间来了解它,找到最佳使用方式。

 

下面介绍一个基于当前内部主流技术平台(omad、jenkins、sonar)的代码覆盖率统计实施方案:<NetJaco>

NetJaco是一个集成工具包,采用Jacoco Ant Tasks+Java Agent的工作方式,工具包含下面几个部分:

图1.NetJaco工具包

 

【Java Agent】为了有更好的可用性和独立性,NetJaco选择Java Agent插桩的工作方式与源码解耦,并且不依赖第3方工具,降低了维护成本。

【ant】现在大部分Java项目通过maven管理,Jacoco的maven plug-in同样可以很好支持maven项目,但是其配置相对复杂,并且需要需要修改源代码的pom.xml,这可能会招致开发同事的反对,也使没有源码权限的测试难行寸步难行。所以需要ant架包为Jacoco Ant Tasks提供支持。

【Jacocoant】、【Sonar-ant-task】、【Jacocoagent】架包。

【build-jacoco.xml】基于ant tasks的jacoco执行脚本,默认已提供了merge,backup,delete,dump等功能已经能满足大部分使用场景。

【build-sonar.xml】sonar条用脚本,基于ant tasks。代码覆盖率统计分析,上传到sonar服务器并展示。

图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口配置示例如下:

  1. mainsite_web = {"codedir":"/****/mainsite-web",\ #该应用源码所在的路径

  2. "webroot_dir":"/home/qafunc/coderepo/*****/mainsite-web/target/vstore",\ #该应用源码编译后,class文件所在的路径

  3. "server_ip":"classb-*****.server.163.org",\ #该应用实例所在的服务器地址

  4. "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的覆盖率统计报告?给产品测试带来实际指导意义,是一个可以深挖的议题。希望大家以后继续讨论。

 

posted @ 2017-01-18 17:03  安大叔  阅读(4742)  评论(0编辑  收藏  举报