JaCoCo代码覆盖率工具使用心得

一、简介

JaCoCo是一个开源的覆盖率工具(官网地址:http://www.eclemma.org/jacoco/),它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant、Maven中;可以作为Eclipse插件,可以使用其JavaAgent技术监控Java程序等等。

二、原理

 

JaCoCo在Byte Code时使用的ASM技术修改字节码方法,可以修改Jar文件、class文件字节码文件。

 

三、两种插桩模式

JaCoCo同时支持on-the-fly(推荐)和offline的两种插桩模式:

 

On-the-fly插桩:

JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。

 

Offline模式:

在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩 的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。

 

 

On-the-fly和offline比较:

On-the-fly模式更方便简单进行代码覆盖分析,无需提前进行字节码插桩,无需考虑classpath 的设置。

存在如下情况不适合on-the-fly,需要采用offline提前对字节码插桩:

(1)运行环境不支持java agent。

(2)部署环境不允许设置JVM参数。

(3)字节码需要被转换成其他的虚拟机如Android Dalvik VM。

(4)动态修改字节码过程中和其他agent冲突。(这个倒是常见,比如:AOP的修改字节码的静态代理

(5)无法自定义用户加载类。

 

四、用途

 

1、代码单元测试覆盖率统计(开发关注)

实现思路:

(1)项目的pom.xml中添加jacoco插件,用于生成单元测试覆盖率

(2)Jenkins上配置job,配置构建代码的分支地址和命令以及构建之后发邮件等操作。

(3)GitLab上分支下添加挂钩hooks,当用户提交代码时,触发hooks(这里是Jenkins上job的执行url),执行job构建。

提交代码至该分支时,触发hooks调用构建job,邮件发送构建结果(构建结果中包含单元测试覆盖率)

          

2、接口功能 远程调用 测试覆盖率 统计(测试关注)

File模式因需要关闭JVM才能获取到覆盖率信息,所以不建议使用。

Server模式实现思路:

(1)下载jacoco

(2)下载并安装配置ant(为了兼容jdk1.7,这里使用了apache-ant-1.9.9)

(3)服务器中使用-javaagent对jvm-arg进行配置(server)

(4)创建ant构建配置文件,使用ant生成当前的测试覆盖率

Client模式实现思路:

优点:统一管理,不用每台服务器都占用一个端口

缺点:实现较复杂,需要考虑JDK版本一致性,项目结构等问题(有些技术上的突破可能需要修改源码,当然个人不推荐这么去做)

需要自实现一个服务端,管理各个客户端连接发过来的覆盖率报文。最好手动触发去接收处理报文,不然连接处理过多,服务器撑不住。如果做集群,还需考虑覆盖率文件共享,连接分配等问题。

 

你可能感兴趣的:(Tools)