前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >jacoco 生成单测覆盖率报告

jacoco 生成单测覆盖率报告

作者头像
JMCui
发布于 2020-05-09 08:07:26
发布于 2020-05-09 08:07:26
3.5K00
代码可运行
举报
文章被收录于专栏:JMCuiJMCui
运行总次数:0
代码可运行

一、jacoco 简介

jacoco 是一个开源的覆盖率工具,它针对的开发语言是 java。其使用方法很灵活,可以嵌入到 ant、maven 中;可以作为 Eclipse 插件;可以作为 javaAgent 探针监控 java 程序等等。

很多第三方的工具提供了对 jacoco 的集成,如 sonar、jenkins 等等。

jacoco 包含了多种尺度的覆盖率计数器,包含指令级覆盖(Instructions,C0coverage)、分支覆盖(Branches,C1coverage)、圈复杂度(CyclomaticComplexity)、行覆盖(Lines)、方法覆盖(non-abstract methods)、类覆盖(classes),其含义如下:

  • 行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
  • 类覆盖率:度量计算 class 类文件是否被执行。
  • 分支覆盖率:度量 if 和 switch 语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的分支数量。
  • 方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
  • 指令覆盖:计数单元是单个 java 二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全独立源码格式。
  • 圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测试案例没有完全覆盖到这个模块。

二、jacoco 和 maven 集成

2.1 mvn 命令增加参数

在执行 mvn 命令时,加上 "org.jacoco:jacoco-maven-plugin:prepare-agent" 参数即可。示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn clean test org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent install -Dmaven.test.failure.ignore=true

其中,jacoco-maven-plugin 后面跟的是jacoco的版本。"-Dmaven.test.failure.ignore=true" 建议加上,否则如果单元测试失败,就会直接中断,不会产生 .exec 文件。

执行以上命令后,会在当前目录的 target 目录下产生一个jacoco.exec文件,该文件就是覆盖率的文件。

总体说来,这种方式比较简单,在与 jenkins 集成时也非常方便。

2.2 在 pom 文件中使用 jacoco 插件

首先,需要添加 jacoco 的依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <properties>
        <jacoco.version>0.8.5</jacoco.version>
    </properties>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <dependency>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${jacoco.version}</version>
        <scope>test</scope>
    </dependency>

接着,我们需要配置 jacoco-maven-plugin 和 maven-surefire-plugin 内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <argLine>
                        -javaagent:${settings.localRepository}/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar=destfile=${project.basedir}/target/coverage-reports/jacoco-unit.exec
                    </argLine>
                    <testFailureIgnore>true</testFailureIgnore>
                </configuration>
            </plugin>
            <!--检查代码覆盖率的插件配置-->
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.5</version>
                <configuration>
                    <!--指定生成.exec文件的存放位置-->
                    <destFile>target/coverage-reports/jacoco-unit.exec</destFile>
                    <!--Jacoco是根据.exec文件生成最终的报告,所以需指定.exec的存放路径-->
                    <dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
                    <includes>
                        <include>**/service/**</include>
                    </includes>
                    <!-- rules里面指定覆盖规则 -->
                    <rules>
                        <rule implementation="org.jacoco.maven.RuleConfiguration">
                            <element>BUNDLE</element>
                            <limits>  
                                <!-- 指定方法覆盖到50% -->
                                <limit implementation="org.jacoco.report.check.Limit">
                                    <counter>METHOD</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>0.50</minimum>
                                </limit>
                                <!-- 指定分支覆盖到50% -->
                                <limit implementation="org.jacoco.report.check.Limit">
                                    <counter>BRANCH</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>0.50</minimum>
                                </limit>
                                <!-- 指定类覆盖到100%,不能遗失任何类 -->
                                <limit implementation="org.jacoco.report.check.Limit">
                                    <counter>CLASS</counter>
                                    <value>MISSEDCOUNT</value>
                                    <maximum>0</maximum>
                                </limit>
                            </limits>
                        </rule>
                    </rules>
                </configuration>
                <executions>
                    <execution>
                        <id>pre-test</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>post-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

<includes>或<excludes>标签的值应该是相对于目录 /classes/ 的编译类的类路径(而不是包名),用来指定哪些类需要进行单元测试。

另外 maven 的测试类需要遵循相应的规范命名,否则无法运行测试类,无法生成测试报告以及覆盖率报告。jacoco 使用的是 maven-surefire-plugin 插件,它的默认测试类名规范是:

  • Test*.java:以 Test 开头的 Java 类;
  • *Test.java:以 Test 结尾的 Java 类;
  • *TestCase.java:以 TestCase 结尾的 Java 类;

或者可以在pom中自定义测试类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-surefire-plugin</artifactId>
	<configuration>
		<includes>
			<include>**/*Tests.java</include>
			<include>**/*Test.java</include>
		</includes>
		<excludes>
			<exclude>**/Abstract*.java</exclude>
		</excludes>
	</configuration>
</plugin>

<rules> 指定筛选规则。

接着运行 mvn test 生成 index.html,即覆盖率报告

推荐阅读:

  1. ant 集成 jacoco:http://eclemma.org/jacoco/trunk/doc/ant.html
  2. eclipse 使用 jacoco:http://www.eclemma.org/
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【黄啊码】Linux搭建SVN总是失败?看完这篇你就知道重点在哪了
只需在末尾添加,无需在文件其他部分修改和添加任何东西(groups被我马赛克的地方忽略),末尾内容如下:
黄啊码
2022/01/10
9430
【黄啊码】Linux搭建SVN总是失败?看完这篇你就知道重点在哪了
SVN服务器部署「建议收藏」
1,关闭防火墙或者开放对应端口3690, 2,Yum下载安装subversion 检查SVN是否安装成功 svnserve --version 3,建立SVN版本库 3.1因为大磁盘挂载在/home下,所以我是在/home下创建的版本库, mkdir /home/svn 创建一个文件夹(所有项目库都在此目录下创建) 3.2创建svn版本库 svnadmin create /home/svn/liangz_art liangz_art 才是项目版本库的名字,后面开发人员checkout时就要用这个名称,项目版本库可以创建多个,每次拉取填写对应的库名就可以。 3.3查看版本库下面的目录结构
全栈程序员站长
2022/09/09
6660
SVN服务器部署「建议收藏」
linux服务器安装svn超详细介绍
  本人选择在/usr/share/nginx/html/svn路径下创建版本库,当前处于根目录下,一次性创建如下:
全栈程序员站长
2022/09/06
4.5K0
linux服务器安装svn超详细介绍
svn服务器配置与使用
(b)若安装需要卸载 sudo apt-get remove --purge subversion
全栈程序员站长
2022/09/06
1.1K0
svn服务器配置与使用
Ubuntu16.04安装SVN及配置
今天在装机之余学了一下SVN的基础命令及安装配置,把搭建教程放在博客上,希望以后可以用的到,也希望可以给你带来帮助,加油 学习互联网技术,不断进步,今天搭建环境使用的时我的博客服务器,环境是Ubuntu16.04版本哦,其实这个软件的安装都是大同小异的。
Meng小羽
2019/12/23
1.1K0
Linux下的SVN服务器搭建
>svnadmin create /var/svn/svnrepos/liuke   (xxxx为自定义版本库名称,可根据实际情况填写)
流柯
2018/08/31
4.3K0
Linux下的SVN服务器搭建
Linux 下使用 SVN 服务
svn服务配置文件:/data/svn/myproject/conf/svnserve.conf
acc8226
2022/05/17
8.7K0
Ubuntu 14.0.4系统下SVN的安装与配置
SVN(subversion)是近年来崛起的版本管理工具,绝大多数开源软件都使用了svn作为代码版本管理软件。对于写代码的用户来说使用版本控制管理工具svn来说最合适不过了,下面就介绍一下在Ubuntu 14.0.4下安装和配置SVN的简要方法!
星哥玩云
2022/07/03
6500
linux服务器设置svn开机自动启动的图文教程
话说SVN这个服务之前就搭建过,过程也不是很复杂,感兴趣的同学可以参考之前的文章教程:宝塔linux面板搭建SVN控制系统的图文教程,今天聊聊怎么把SVN设置成开机自启,为什么呢?因为最近在测试项目的时候偶尔会用到重启主机,重启之后项目的某个功能可用了,但是在使用svn上传文件数据的时候就会出现无法连接等情况,就是因为重启服务器之后svn服务并没有启动,所以才导致无法使用的问题,百度一下怎么设置开启启动,然后把设置教程记录一下。
李洋博客
2022/02/25
3.3K0
linux服务器设置svn开机自动启动的图文教程
svn - 配置账号、自动更新、配置log权限
虽然已经有很多朋友的公司都不使用svn了,但也有很多朋友的公司在使用,统一整理了svn的配置账号、自动更新、配置log权限,常用的操作知识。
stark张宇
2024/01/12
7420
SVN就是这么简单
什么是SVN SVN全称:Subversion,是一个开放源代码的版本控制系统 Svn是一种集中式文件版本管理系统。集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。 集中式文件版本控制器:将所有的文件都交由服务器来进行统一的管理。既然是有服务器的,那么就需要联网进行操作了。 为什么要使用SVN 我们写一个项目一般都是一个团队来写,如果我们没有用SVN的话,那么我们只能在团队中互相拷贝对方的代码来完成我们的项目。 SVN还有如下的好处: 轻松比
Java3y
2018/03/15
8420
SVN就是这么简单
宝塔linux面板搭建SVN控制系统的图文教程
记得在大学期间,使用过SVN功能,当时觉得很不错,但是慢慢的接触了FTP之后很久没涉及到svn服务了,今天刚刚在新项目上需要部署新环境,还需要在linux搭建svn服务,其实安装完宝塔我的第一反应是去软件商城搜索svn,别说还真有,只是收费,抱着学习的态度打算在宝塔linux面板上手动安装svn服务,为防止后期还会涉及重新搭建svn,所以记录下此次的安装过程。
李洋博客
2021/08/16
2.1K0
【说站】linux服务器设置svn开机自动启动的图文教程
怎么把SVN设置成开机自启,为在测试项目的时候偶尔会用到重启主机,重启之后项目的某个功能可用了,但是在使用svn上传文件数据的时候就会出现无法连接等情况,就是因为重启服务器之后svn服务并没有启动,所以才导致无法使用的问题,百度一下怎么设置开启启动,然后把设置教程记录一下。
很酷的站长
2022/11/24
2.1K0
【说站】linux服务器设置svn开机自动启动的图文教程
如何在本机搭建SVN服务器
http://www.visualsvn.com/server/download/
星哥玩云
2022/07/03
1.7K0
Linux环境搭建svn服务器
官网下载:http://subversion.apache.org/packages.html
幽鸿
2020/04/02
9.6K0
Linux svn搭建配置钩子自动更新
其它采用默认配置. 各语句都必须顶格写, 左侧不能留空格, 否则会出错. 这是个坑一定要注意
Past
2022/07/12
2K0
03 Linux下的SVN服务器搭建
公司周报采用SVN格式提交,服务器在内网,有一天突发奇想,能不能在个人的云服务器搭建SVN环境,保存一些个人资料,这样不是随时随地都可以访问了么!!!
lovingwork
2020/10/16
2.6K0
linux环境svn服务端及windows环境客户端安装配置
首先,检查当前服务器中是否已经安装了svn,使用命令:find / -name ‘subversion’,如果有安装的话,会出现目录列表。
云深i不知处
2020/09/16
4.8K0
005-centos7 搭建svn服务器
可以看到,没有telnet服务和3690端口。增加telnet服务器和3690端口:
上善若水.夏
2018/09/28
1.4K1
一、Linux下的SVN服务器搭建
3.创建版本库目录,可以再chenjy目录上放置多个项目,不必为每个项目创建一个版本库。下面是我的版本库
全栈程序员站长
2022/09/09
2K0
一、Linux下的SVN服务器搭建
相关推荐
【黄啊码】Linux搭建SVN总是失败?看完这篇你就知道重点在哪了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验