背景
持续集成项目,完善单元测试的能力
获取单元测试通过率(mvn test 获取surefire report),获取代码覆盖率(jacoco)
本次实践基于jenkins环境 以及 jenkins - jacoco插件
收集覆盖率统计结果跟生成jacoco报告文件无关,生成jacoco聚合报告文件不依赖jenkins环境,请各位有需要的看官认真查看
maven单测已完成测试,此插件方案应该适用于java语言 gradle、android(前提已生成exec文件)
一、准备工作 - 生成exec文件
maven插件的使用方式:- 在pom.xml文件里配置插件
- 使用命令行加载
pom文件配置网上很多资料,跳过了,也不是此文关注点。因为是持续集成,需要给各种项目做编译,并不只是自己的,因此不能改变用户的代码情况下,使用命令行形式为佳。
命令行形式:
- maven测试命令:mvn clean test
- 配置命令:-Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
- maven的jacoco插件:org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent
- 运行单元测试并生成exec:
mvn org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent clean test -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
附:- gradle、android的exec文件生成:在项目根目录放入一个.gradle文件,命令行加载编译
- ./gradlew --init-script init.gradle clean build
不是专业的就不细讲啦~
二、准备工作 - 引入依赖
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
</dependency>
jacoco-maven-plugin里包含了org.jacoco.core,org.jacoco.report都是必要的。
因为是在jenkins插件开发,开发中遇到过依赖冲突问题,困扰几天的奇怪的bug最终也是依赖问题,认真对待依赖很重要
三、利用jenkins-jacoco插件源码收集覆盖率结果
jacoco插件的JacocoPublisher类 perform方法为执行入口一番分析后提取核心代码占为己有*-*
其实以下代码都是jacoco插件源码的抽取,方便自己开发插件,扩展功能,如jacoco增量覆盖率检测,自定义前端样式
写文章时候才发现很多类都是基于jenkins,普通项目不一定很好移植,本地@test可行估计也是准备了一定的环境,但是还是觉得应该能成功的
public class JacocoCore {
private String rootDir = "/data/myapp";
private String execsPattern = "**/*.exec";
private String classesPattern = "**/classes";
private String sourcesPattern = "**/src/main/java";
private String inclusionPattern = "";
private String exclusionPattern = "**/*Test*.class";
private String sourceInclusionPattern = "**/*.java,**/*.groovy,**/*.kt,**/*.kts";
// 收集所有exec文件List<File>
public List<FilePath> collectExecFilesByPattern(String pattern){
return Arrays.asList(workspace.list(pattern));
}
public void getJacocoResultData() {
1. 设定一个收集文件用的根目录
JacocoReportDir reportDir = new JacocoReportDir