{"id":20264317,"url":"https://github.com/fang-yan-peng/diff-jacoco","last_synced_at":"2025-10-25T20:37:00.404Z","repository":{"id":37262206,"uuid":"232064233","full_name":"fang-yan-peng/diff-jacoco","owner":"fang-yan-peng","description":"对jacoco代码做改造，实现增量覆盖率。覆盖率报告持久化到数据库，对于增量测试过的代码不会回退。","archived":false,"fork":false,"pushed_at":"2023-09-26T19:43:10.000Z","size":1599,"stargazers_count":114,"open_issues_count":14,"forks_count":60,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-12-08T11:51:36.310Z","etag":null,"topics":["diff-cover","jacoco"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fang-yan-peng.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-01-06T09:11:54.000Z","updated_at":"2024-12-06T13:56:27.000Z","dependencies_parsed_at":"2024-11-14T11:39:46.441Z","dependency_job_id":"a8c88d1a-0ff7-4e39-9ae3-57a7bf4f2ed0","html_url":"https://github.com/fang-yan-peng/diff-jacoco","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fang-yan-peng%2Fdiff-jacoco","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fang-yan-peng%2Fdiff-jacoco/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fang-yan-peng%2Fdiff-jacoco/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fang-yan-peng%2Fdiff-jacoco/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fang-yan-peng","download_url":"https://codeload.github.com/fang-yan-peng/diff-jacoco/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230527866,"owners_count":18240051,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["diff-cover","jacoco"],"created_at":"2024-11-14T11:39:36.004Z","updated_at":"2025-10-25T20:36:55.362Z","avatar_url":"https://github.com/fang-yan-peng.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"JaCoCo Java Code Coverage Library\n=================================\n\n[![Build Status](https://travis-ci.org/jacoco/jacoco.svg?branch=master)](https://travis-ci.org/jacoco/jacoco)\n[![Build status](https://ci.appveyor.com/api/projects/status/g28egytv4tb898d7/branch/master?svg=true)](https://ci.appveyor.com/project/JaCoCo/jacoco/branch/master)\n[![Maven Central](https://img.shields.io/maven-central/v/org.jacoco/jacoco.svg)](http://search.maven.org/#search|ga|1|g%3Aorg.jacoco)\n\nJaCoCo is a free Java code coverage library distributed under the Eclipse Public\nLicense. Check the [project homepage](http://www.jacoco.org/jacoco)\nfor downloads, documentation and feedback.\n\nPlease use our [mailing list](https://groups.google.com/forum/?fromgroups=#!forum/jacoco)\nfor questions regarding JaCoCo which are not already covered by the\n[extensive documentation](http://www.jacoco.org/jacoco/trunk/doc/).\n\nNote: 欢迎一起开发，有问题提issue\n-------------------------------------------------------------------------\n\nJaCoCo二次开发基于Git分支差分实现增量代码覆盖率\n## 方案设计\n我们设计的方案也是基于 JaCoCo 做相应改造，生成我们所需要的覆盖率模型，并通过 JaCoCo 开放的 API 实现相关功能。这里面主要需要解决的点在获取增量代码并解析生成覆盖率上。可以拆分成如下几个步骤：\n1. 获取测试完成后的 exec 文件（二进制文件，里面有探针的覆盖执行信息）；\n2. 获取基线提交与被测提交之间的差异代码；\n3. 对差异代码进行解析，切割为更小的颗粒度，我们选择方法作为最小纬度；\n4. 改造 JaCoCo ，使它支持仅对差异代码生成覆盖率报告；\n\n![图片](https://github.com/fang-yan-peng/diff-jacoco/blob/master/jacoco_archive2.jpeg)\n\n### 一、原理\n 通过使用org.eclipse.jgit比较新旧分支代码差分，取得变更行信息，生成报告时高亮线上变更行信息，未检出变更行不做处理。从而达到，增量显示代码覆盖率的目的。当然当不传代码分支时默认展示全量覆盖率。测试过的代码报告会存入mysql中，如果更改某类中的方法内容，不会影响同类中其他未更改方法的测试报告。\n\n### 二、使用方法\n\n  #### 1，执行mvn clean install -Dmaven.javadoc.test=true -Dmaven.test.skip=true\n  自行打包。注意事项IDE下载后，在IDE中执行maven打包命令可能不成功。建议在命令行中执行maven打包命令。打包成功后，会在 JacocoPlus/org.jacoco\n  .startup/target目录下生成org.jacoco.startup-0.8.4.tar.gz。解压后会有三个目录，分别是bin、lib和conf。其中conf/jacoco.conf文件是jacoco运行所需要的配置信息，如数据库的jdbcUrl、用户名密码和堆栈大小等。\n  \n  #### 2，在配置的数据库中新建两张表用于存放代码测试覆盖率信息\n  create table coverage_record(\n  id bigint primary key auto_increment,\n  project varchar(64),\n  class_name varchar(128),\n  method varchar(64),\n  line varchar(128),\n  method_md5 char(32),\n  line_md5 char(32),\n  type char(2),\n  unique key p_c_m_l(project, class_name, method_md5, line_md5),\n  key p_c_m(project, class_name, method)\n  );\n  \n  create table coverage_rate_record(\n  id bigint primary key auto_increment,\n  project varchar(64),\n  class_name varchar(128),\n  method varchar(64),\n  covered int,\n  unique key p_c_m(project, class_name, method)\n  );\n  \n  #### 3，执行bin目录下jacoco.sh，以tag比较为例\n   ./jacoco.sh --git-work-dir /Users/yanpengfang/test/ai-charge --branch master --tag jacoco_1 \n   --compare-tag jacoco_3 --report-dir /Users/yanpengfang/Desktop/sq_jacoco/coveragereport \n   --source-dirs /Users/yanpengfang/test/ai-charge/charge-api/src/main/java,\n   /Users/yanpengfang/test/ai-charge/charge-core/src/main/java \n   --class-dirs /Users/yanpengfang/test/ai-charge/charge-api/target/classes,\n   /Users/yanpengfang/test/ai-charge/charge-core/target/classes --remote-host localhost \n   --remote-port 8044 --exec-dir /Users/yanpengfang/Desktop/test_jacoco\n\n### 三、代码差分比较分支说明\n   #### 1，基于分支的比较\n   --branch 指定当前代码分支， --compare-branch 指定要对比的的代码分支，如果不指定默认为master。\n   #### 2，基于tag的比较\n   --branch 指定是哪个分支上的tag， --tag 当前tag，--compare-tag 指定要对比的tag。\n   #### 3，参数说明\n  * git-work-dir 指定git的工作目录\n  * report-dir 生成报告的目录\n  * source-dirs 源码目录，多个目录用逗号分隔\n  * class-dirs 字节码目录，多个目录用逗号分隔\n  * remote-host jacoco的agent运行的地址\n  * remote-port jacoco的agent运行的端口号\n  * exec-dir exec文件生成的目录，如果不指定默认是report-dir指定的目录/exec。\n  * branch 当前代码分支\n  * compare-branch 要对比的分支\n  * tag 当前tag\n  * compare-tag 要对比的tag\n  #### 4，代码颜色说明\n  * 红色 未覆盖的代码\n  * 绿色 覆盖的代码\n  * 白色 分支对比或者tag对比没有发生变化的代码，一般不用关注\n\n执行完后就可以生成报告了。就可以随时导出Ecec文件，生成报告，查看测试覆盖情况了。\n\n### 四 生成的差分报告展示\n这步是用 JaCoCo 开放的 API 和改造后的 JaCoCo 来实现的，根据前两步获取到的 class 和差异方法信息，用改造后的 JaCoCo 去解析 exec 文件，使它按照我们的覆盖率模型，只生成增量代码部分的覆盖率报告。 生成报告的大致流程如图：\n![图片](https://github.com/fang-yan-peng/diff-jacoco/blob/master/jacoco_archive3.jpeg)\n\n通过率概览：\n\n![图片](https://github.com/fang-yan-peng/diff-jacoco/blob/master/report1.png)\n\n覆盖的代码显示为绿色, 未覆盖的代码显示为红色, 白色的代码是没有发生更改的。\n\n![图片](https://github.com/fang-yan-peng/diff-jacoco/blob/master/report2.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffang-yan-peng%2Fdiff-jacoco","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffang-yan-peng%2Fdiff-jacoco","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffang-yan-peng%2Fdiff-jacoco/lists"}