# diff-jacoco **Repository Path**: answer_wu_admin/diff-jacoco ## Basic Information - **Project Name**: diff-jacoco - **Description**: 对jacoco代码做改造,实现增量覆盖率。覆盖率报告持久化到数据库,对于增量测试过的代码不会回退。 源代码库 https://github.com/fang-yan-peng/diff-jacoco - **Primary Language**: Java - **License**: EPL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2021-06-21 - **Last Updated**: 2024-06-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README JaCoCo Java Code Coverage Library ================================= [![Build Status](https://travis-ci.org/jacoco/jacoco.svg?branch=master)](https://travis-ci.org/jacoco/jacoco) [![Build status](https://ci.appveyor.com/api/projects/status/g28egytv4tb898d7/branch/master?svg=true)](https://ci.appveyor.com/project/JaCoCo/jacoco/branch/master) [![Maven Central](https://img.shields.io/maven-central/v/org.jacoco/jacoco.svg)](http://search.maven.org/#search|ga|1|g%3Aorg.jacoco) JaCoCo is a free Java code coverage library distributed under the Eclipse Public License. Check the [project homepage](http://www.jacoco.org/jacoco) for downloads, documentation and feedback. Please use our [mailing list](https://groups.google.com/forum/?fromgroups=#!forum/jacoco) for questions regarding JaCoCo which are not already covered by the [extensive documentation](http://www.jacoco.org/jacoco/trunk/doc/). Note: 欢迎一起开发,有问题提issue ------------------------------------------------------------------------- JaCoCo二次开发基于Git分支差分实现增量代码覆盖率 ## 方案设计 我们设计的方案也是基于 JaCoCo 做相应改造,生成我们所需要的覆盖率模型,并通过 JaCoCo 开放的 API 实现相关功能。这里面主要需要解决的点在获取增量代码并解析生成覆盖率上。可以拆分成如下几个步骤: 1. 获取测试完成后的 exec 文件(二进制文件,里面有探针的覆盖执行信息); 2. 获取基线提交与被测提交之间的差异代码; 3. 对差异代码进行解析,切割为更小的颗粒度,我们选择方法作为最小纬度; 4. 改造 JaCoCo ,使它支持仅对差异代码生成覆盖率报告; ![图片](https://github.com/fang-yan-peng/diff-jacoco/blob/master/jacoco_archive2.jpeg) ### 一、原理 通过使用org.eclipse.jgit比较新旧分支代码差分,取得变更行信息,生成报告时高亮线上变更行信息,未检出变更行不做处理。从而达到,增量显示代码覆盖率的目的。当然当不传代码分支时默认展示全量覆盖率。测试过的代码报告会存入mysql中,如果更改某类中的方法内容,不会影响同类中其他未更改方法的测试报告。 ### 二、使用方法 #### 1,执行mvn clean install -Dmaven.javadoc.test=true -Dmaven.test.skip=true 自行打包。注意事项IDE下载后,在IDE中执行maven打包命令可能不成功。建议在命令行中执行maven打包命令。打包成功后,会在 JacocoPlus/org.jacoco .startup/target目录下生成org.jacoco.startup-0.8.4.tar.gz。解压后会有三个目录,分别是bin、lib和conf。其中conf/jacoco.conf文件是jacoco运行所需要的配置信息,如数据库的jdbcUrl、用户名密码和堆栈大小等。 #### 2,在配置的数据库中新建两张表用于存放代码测试覆盖率信息 create table coverage_record( id bigint primary key auto_increment, project varchar(64), class_name varchar(128), method varchar(64), line varchar(128), method_md5 char(32), line_md5 char(32), type char(2), unique key p_c_m_l(project, class_name, method_md5, line_md5), key p_c_m(project, class_name, method) ); create table coverage_rate_record( id bigint primary key auto_increment, project varchar(64), class_name varchar(128), method varchar(64), covered int, unique key p_c_m(project, class_name, method) ); #### 3,执行bin目录下jacoco.sh,以tag比较为例 ./jacoco.sh --git-work-dir /Users/yanpengfang/test/ai-charge --branch master --tag jacoco_1 --compare-tag jacoco_3 --report-dir /Users/yanpengfang/Desktop/sq_jacoco/coveragereport --source-dirs /Users/yanpengfang/test/ai-charge/charge-api/src/main/java, /Users/yanpengfang/test/ai-charge/charge-core/src/main/java --class-dirs /Users/yanpengfang/test/ai-charge/charge-api/target/classes, /Users/yanpengfang/test/ai-charge/charge-core/target/classes --remote-host localhost --remote-port 8044 --exec-dir /Users/yanpengfang/Desktop/test_jacoco ### 三、代码差分比较分支说明 #### 1,基于分支的比较 --branch 指定当前代码分支, --compare-branch 指定要对比的的代码分支,如果不指定默认为master。 #### 2,基于tag的比较 --branch 指定是哪个分支上的tag, --tag 当前tag,--compare-tag 指定要对比的tag。 #### 3,参数说明 * git-work-dir 指定git的工作目录 * report-dir 生成报告的目录 * source-dirs 源码目录,多个目录用逗号分隔 * class-dirs 字节码目录,多个目录用逗号分隔 * remote-host jacoco的agent运行的地址 * remote-port jacoco的agent运行的端口号 * exec-dir exec文件生成的目录,如果不指定默认是report-dir指定的目录/exec。 * branch 当前代码分支 * compare-branch 要对比的分支 * tag 当前tag * compare-tag 要对比的tag #### 4,代码颜色说明 * 红色 未覆盖的代码 * 绿色 覆盖的代码 * 白色 分支对比或者tag对比没有发生变化的代码,一般不用关注 执行完后就可以生成报告了。就可以随时导出Ecec文件,生成报告,查看测试覆盖情况了。 ### 四 生成的差分报告展示 这步是用 JaCoCo 开放的 API 和改造后的 JaCoCo 来实现的,根据前两步获取到的 class 和差异方法信息,用改造后的 JaCoCo 去解析 exec 文件,使它按照我们的覆盖率模型,只生成增量代码部分的覆盖率报告。 生成报告的大致流程如图: ![图片](https://github.com/fang-yan-peng/diff-jacoco/blob/master/jacoco_archive3.jpeg) 通过率概览: ![图片](https://github.com/fang-yan-peng/diff-jacoco/blob/master/report1.png) 覆盖的代码显示为绿色, 未覆盖的代码显示为红色, 白色的代码是没有发生更改的。 ![图片](https://github.com/fang-yan-peng/diff-jacoco/blob/master/report2.png)