jacoco单元测试代码覆盖率统计

1,141 阅读2分钟

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

单测的时候如何知道覆盖到了多少代码?jacoco就是个很不错的代码覆盖率统计框架。一起来学习一下吧。

我的学习顺序:
1、jacoco基本知识、底层原理和简单应用
2、如何获取增量代码
3、jacoco二开-支持增量代码覆盖率报告
4、super-jacoco:增量代码覆盖率平台化项目

jacoco基础

1、On-the-fly

JVM通过-javaagent这个参数开启一个代理程序,代理程序在装载class文件前判断是否已经转换修改了该class文件,最后统计转换的文件得到覆盖率。

Jacoco通过ASM在字节码中插入探针,每个探针都是一个布尔变量(true表示执行、false表示没有执行),程序在运行时可以改变指针结果,最后统计探针的数量来统计代码执行情况。

.exec文件:一个二进制文件,里面有探针的覆盖执行信息,用于生成报告。

一、jacoco应用-ant方式(全量代码)

简述:jacoco中有javaant的jar包,支持ant命令去执行结果。

1、前期准备
【ant】
下载安装

/Users/mac/apache-ant-1.10.11

配置环境变量

export ANT_HOME=/Users/mac/apache-ant-1.10.11

export PATH=PATH:{PATH}:{ANT_HOME}/bin

【jacoco】

源码下载,主要是cli包、ant包和agent包。

【jdk】

安装、配置环境变量

2、配置测试项目的启动项
设置ip和端口,用到agent包
在启动的时候加上这句命令
​
-javaagent:/Users/mac/jacoco-0.8.7/lib/jacocoagent.jar=includes=*,output=tcpserver,address=127.0.0.1,port=6300,append=true
或者 在环境变量配置中加上这句
​
export JACOCO="-javaagent:/Users/mac/jacoco-0.8.7/lib/jacocoagent.jar=**includes=*,**output=tcpserver,address=127.0.0.1,port=6300,append=true"export JAVA_OPTS="$JACOCO":"$JAVA_OPTS"

3、ant的.xml文件配置

创建build.xml文件,放在ant的bin目录下。

参考往期文章:jacoco+springboot代码覆盖率实践

4、启动被测试服务,执行ant命令
cd /Users/mac/apache-ant-1.10.11/bin   //build.xml文件所在的目录
source ~/.bash_profile //生效ant
ant dump
ant merge
ant report  //在jacoco指令中需要用到被测试服务的源码路径
5、解读代码覆盖率报告
Jacoco报告层级:包>类>方法
Instructions-代码指令

红色代表未覆盖,绿色代表已覆盖,Cov 为总体覆盖率。

300/400 25% 未覆盖300条指令/总400条指令 覆盖率25%

Branches-分支

分支用菱形标示。

switch,while,for,if 语句代表分支,Assert、Boolean也会被定义为分支,判断语句都会被定义为分支。

红色菱形:覆盖为0 黄色菱形:未完全覆盖 绿色菱形:完全覆盖

方法/类

方法、类完全没有指令执行,未覆盖,有一行指令被执行,代表完全覆盖。

今天到这,下篇继续👉