Java变更行单元测试覆盖率
概述
Java应用代码的单元测试覆盖率工具Jacoco已经非常成熟及完善了。对于历史的Java项目很多都是没有单元测试的,往往在新的在迭代的过程中都希望能有变更代码行的单元测试覆盖率,从而提高迭代质量。
本文介绍怎么基于jacoco和maven构建变更行单元测试覆盖率报告。对于全量单测覆盖率报告怎么使用可以参考Jacoco官方文档
获取变更行
要构建变更行测试覆盖率,那么首先我们要定位出源代码的变更文件和对应变更行号。
- 获取变更文件列表
git diff --name-status ${baseCommintId} ${currentCommintId}
解析以上命令行结果可以获得变更文件列表
3. 获取文件变更行明细和行号
git diff -U100000 --cc -W ${baseCommintId} ${currentCommintId} ${filePath}
解析返回结果,能够得到对应文件的变更行行号。
生成变更行覆盖率报告
JaCoCo 的注入逻辑用的是 ASM 库,都是基于JVM指令注入,比较复杂。我们用了一个比较快速简单的方式:前面生成全量覆盖率数据的流程不变,只对解析exec 文件生成报告做改造,过滤掉非变更行的行号,生成我们所需要的增量覆盖率模型。参考实现详情-Github
最佳实践
对于现在的应用,大部分都是基于Maven的多模块应用。多模块配置官方推荐。
- 应用多模块
多模块示例说明
- demo-api 是应用的基础api
- demo-service 是应用的核心业务处理模块,依赖api
- demo-app 是应用的最终运行,依赖service
- demo-build是独立模块,用于生成report
- root应用的pom.xml配置
在根pom里面设置jacoco的agent插装及单模块的测试覆盖率报告
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>jacoco_demo</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>demo-service</module><module>demo-build</module><module>demo-api</module><module>demo-app</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><jacoco.version>0.8.6-diff-20210324</jacoco.version></properties><build><plugins><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>${jacoco.version}</version><configuration><includes><include>com/demo/**/*</include></includes></configuration><executions><execution><id>prepare-agent</id><goals><goal>prepare-agent</goal></goals></execution><execution><id>report</id><phase>test</phase><goals><goal>report</goal></goals></execution></executions></plugin></plugins></build>
</project>
- 各子模块配置
子模块会继承root模块的配置,无需特殊配置
- build模块配置
build模块需要聚合各个子模块的测试报告,切生成变更行的覆盖率报告
build模块需要依赖所有的子模块
build模块需要配置git的基础commitId: mvn.git.base.commit
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>jacoco_demo</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>demo-build</artifactId><properties><mvn.git.base.commit>36a2****338a</mvn.git.base.commit><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.example</groupId><artifactId>demo-service</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.example</groupId><artifactId>demo-app</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.example</groupId><artifactId>demo-api</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies><build><plugins><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>${jacoco.version}</version><executions><-- 各模块全量覆盖率聚合报告 --><execution><id>report-aggregate</id><phase>test</phase><goals><goal>report-aggregate</goal></goals></execution><-- 各模块增量覆盖率聚合报告 --><execution><id>report-aggregate-diff</id><phase>test</phase><goals><goal>report-aggregate-diff</goal></goals></execution></executions></plugin></plugins></build>
</project>
- 构建及单元测试
在根目录构建单元测试,各个子模块会生成各自模块的全量单元测试覆盖率
build模块会生成全量模块的聚合单元测试覆盖率,且会生成增量的覆盖率
jacoco-aggregate-diff/index.html 只看行覆盖率,其他的列忽略
jacoco-aggragate/index.html 全量代码覆盖率
后记
基于git和jaccoco的maven插件,我们能获取代码变更行的单元测试覆盖率。对于历史悠久且无单元测试的Java应用迭代可以尽量的控制增量代码单测的规范要求。
Java变更行单元测试覆盖率相关推荐
- java 代码覆盖率_java单元测试覆盖率统计
很多时候,开发写了单元测试,但是我们并不知道当前的单元测试覆盖率是怎么样的,所以我们需要有技术手段来分析我们的单元测试覆盖率情况. 那么,jacoco来了... jacoco介绍: jacoco 是一 ...
- java jacoco powerMock 单元测试覆盖率为0怎么解决
我们项目中使用powerMock作为单元测试的mock工具,统计项目测试覆盖率使用jacoco编译的结果上传到sonar,但是jacoco 和 powerMock在运行时runtime加载代码的时候自 ...
- java 中的单元测试_浅谈Java 中的单元测试
单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...
- testng查看覆盖率_使用Cobertura统计单元测试覆盖率
学习Cobertura的起因是前天晚上媳妇儿(终于有出场机会了)突然问我有没有用过一些可以统计单元测试覆盖率的工具,答曰:木有...感觉比较丢人,于是昨天晚上研究了一把,今天顺便share一下. 因为 ...
- Springboot 单元测试结合Jacoco收集单元测试覆盖率
目录 单元测试 Junit 简单例子 mockito Mock 的限制 Powermock maven 引入 注解使用 处理私有方法 mock构造函数 结合Springboot一起使用 各种runne ...
- SpringBoot-Jacoco单元测试覆盖率报告
SpringBoot-Jacoco单元测试覆盖率报告 添加Maven 添加测试依赖 <dependencies> <!--spring-boot测试--><depende ...
- 阿里巴巴对Java编程【单元测试】的规约
转载自 阿里巴巴对Java编程[单元测试]的规约 单元测试 1. [强制]好的单元测试必须遵守 AIR 原则. 说明:单元测试在线上运行时,感觉像空气 (AIR) 一样并不存在,但在测试质量的保障上, ...
- java命令行参数工具_Java方法中的参数太多,第8部分:工具
java命令行参数工具 在我的系列文章的前七篇文章中,有关处理Java方法中期望的参数过多的内容集中在减少方法或构造函数期望的参数数量的替代方法上. 在本系列的第八篇文章中,我将介绍一些工具,这些工具 ...
- aiohttp/flask python后端单元测试,单元测试覆盖率测试
aiohttp web服务器单元测试 官方代码:https://github.com/aio-libs/aiohttp/blob/master/tests/test_client_functional ...
最新文章
- linux dd命令磁盘写入
- Centos/Red Hat7/8.x 安装、配置、启动Gitlab14.x (语言和主题配置)
- vue 子级拿值_Vue 父组件主动获取子组件的值,子组件主动获取父组件的值
- 民熙科技发布货物资产数字化系统“识物链”2.0版本
- CUDA Study Notes
- 等差素数列(java)
- LambdaQueryWrapper构建查询条件、模糊查询、范围查询、排序
- linux里rw文件如何打开,RW 文件扩展名: 它是什么以及如何打开它?
- javascript书籍推荐
- android qq音乐歌词怎么实现,歌词翻译利器 QQ音乐Android3.9.5版本全新上线
- U盘PE系统下安装WIN2003和WINXP的方法(非GHOST版)
- 循环闹钟c语言,闹钟设置四天一个循环,自定义周期循环提醒便签
- Mac Chrome浏览器快捷键大全
- Appium-Long Press(长按)
- python安装jupyterlab_jupyter及jupyterlab安装使用
- 自定义android控件:快速检索QuickSearch
- 缺页中断与页面置换算法
- 【Java】用PriorityQueue优先队列实现最小堆和最大堆
- DNS云学堂 | 智能DNS让CDN乘风破浪
- 2022icpc昆明
热门文章
- 网格化智能移动警务综合应用系统建设方案
- 报告显示:修改器、自动点击、破解版是大多数手游里占比最高的外挂类型
- Error Domain=NSURLErrorDomain Code=-1202
- G1CTF-2021 WP
- 基岩版皮肤改java版_我的世界基岩版更新 新皮肤编辑系统加入
- ​盘点几款国内外安全稳定的域名解析平台​
- 对以“孵化器”模式推进气象大数据应用的思考
- Easy Connect for mac 无法下载
- 沈阳航空航天大学计算机考研真题指针模板
- Java-微信H5分享功能