java测试覆盖率工具jacoco

1,618 阅读4分钟

说明:本来工作是搞C语言的测试覆盖率统计,不过我本人只会java,还是有必要了解一下java测试覆盖率统计。这个工具也着实花费了我一点时间,这里记录一下,以备自己哪天忘了,有据可查。

一、概述

测试覆盖率是个老生常谈的问题,也是一个量化测试工作的基本方法,这里具体的测试覆盖率理论不再赘述。本文主要是针对java后端覆盖率的阐述。
由于某些原因,作者本人所在的部门基本不做UT,所以对测试来说,咱最关心的还是手工执行、接口执行 (人工 Postman 之类的)、接口自动化、WebUI 自动化对一个应用系统的覆盖度。得益于几年前的活动逻辑复杂度大大的提高,开发也有了危机感。最终这一块的UT想起来做一下了。
本来 Jacoco 已经流行了很多年了,各种文档和帖子已经描述的很完美了,但是多数文章都是针对某一特定形式做了总结和使用。因为使用过c的覆盖率统计工具,以为会大同小异的,实际使用的时候还是绕了不少弯路。

二、覆盖率原理

之前了解过C的覆盖率工具原理,覆盖率说的直白一点,就是插桩。在编译的时候配置好参数,在生成汇编文件的时候插桩,每个桩点插入3-4条汇编语句,最后汇编文件生成汇编生成目标文件,同时生成关联BB和ARC的文件,这一块网上资料也不少,有兴趣的可以自行查找。想来jacoco的原理应该也差不多 jacoco插桩的本质,可以是编译时插桩,也可以是运行时插桩,这就是offline模式和on-the-fly模式。jacoco的on-the-fly模式,其实就是在测试环境部署的时候,让jacoco介入部署过程,也就是介入class文件的加载,在加载class文件的时候,动态改版字节码的结构,插入jacoco的探针。

三、项目描述

测试项目是一个maven多模块构建的springboot项目,具体的项目结构如下: image.png

四、具体配置

4.1、jar启动

1. 首先下载jacocoagent.jar和jacococli.jar这个两个文件
2. 将项目打包好
3. 分别启动所有需要运行的jar文件,启动命令如下:
java -javaagent:"D:\jacoco-0.8.6\lib\jacocoagent.jar"=includes=*,output=file,append=true,destfile=d:\jacoco.exec -jar demo-0.0.1.jar

参数解释,参考下面地址www.cnblogs.com/kingzzm/p/3…

  • -javaagent jdk5之后新增的参数,主要用来在运行jar包的时候,以一种方式介入字节码加载过程,如有兴趣自行百度。注意后面有个冒号,如果jacocoagent.jar是在win上需要加双引号,如果是在Linux上则不需要
  • includes=* 这个代表需要进行字节码插桩的包,*代表所有的class文件加载都进行插桩
  • output=file 这里有四种配置,还可以写成output=tcpserver,表示以tcpserver的方式启动并进行插桩,tcpserver的方式还需要指定port和address,服务器上使用tcpserver更好一点,address配置为服务器的可访问地址,这样就可以在任意一台机器上进行数据的dump
java -javaagent:"D:\jacoco-0.8.6\lib\jacocoagent.jar"=includes=*,output=tcpserver,port=可用端口号,address=你的服务器地址,append=true -jar demo-0.0.1.jar

使用tcpserver模式后,需要先dump数据

java -jar jacococli.jar dump --address 你的服务器地址 --port 启动时设置的端口号 --destfile d:\jacoco.exec
  • destfile 指定.exec文件生成的位置
  • jar 指定需要启动的jar文件,分别启动,带上以上参数
4. 查看报告

方式一:ant转报告,没有使用ant,使用ant还要配置build.xml等,这里不展示了
方式二:开发工具查看exec文件 image.png 方式三:jacococli.jar转报告(多模块)

java -jar d:\jacoco-0.8.6\lib\jacococli.jar report .\jacoco.exec --classfiles f:\workspace\springtest\module1\target\classes --sourcefiles f:\workspace\springtest\module1\src\main\java --classfiles f:\workspace\springtest\moduletest\target\classes --sourcefiles f:\workspace\springtest\moduletest\src\main\java --html report --xml report.xml

结果如下: image.png 经个人尝试:

  • --classfiles 必须项,是编译后target 文件夹下的classes里面的com
  • --sourcefiles 理论可以不传,不传的话 只能到文件级的展示,再细就需要具体代码和行数就需要这个了

4.2、war启动、maven插件方式启动以及其他的启动方式

通过tomcat,来启动war包服务的,需要实现jacoco插桩,这个可以参考以下的地址: zhuanlan.zhihu.com/p/161787871