JaCoCo覆盖率计数器
覆盖率计数器
JaCoCo使用一组不同的计数器来计算覆盖率指标。所有这些计数器都是从Java类文件里获取信息,这些类文件包含Java 字节码指令和调试信息。即使没有可用源代码情况下,这种方法可以实时有效的对应用程序进行检测和分析。在大多数情况下,收集的信息可以映射回源代码,并可视化到每一行代码的粒度。然而,这种方法也有局限性。这些类文件必须使用调试信息编译,这样才可以计算行的覆盖率并让源码高亮显示。并不是所有的Java语言的结构都可以直接编译成相应的字节码。在这种情况下,Java编译器创建所谓的“合成”代码,有时会导致未预料到的代码覆盖结果。
指令(C0 覆盖率)
JaCoCo最小的计数单元是单个Java字节代码指令。指令覆盖率提供了代码是否被执行的信息。这个度量是完全独立于源格式并且经常可用,即使在类文件缺失调试信息的情况下。
分支(C1 覆盖率)
JaCoCo还计算所有的 if 和 switch 语句的分支覆盖率。这个度量计算一个方法里的总分支数并确定执行或未执行的分支数。分支覆盖率总是可用的,即使类文件里缺失调试信息的情况下。请注意异常处理是不在分支度量里面统计的。
如果类文件使用调试信息编译,产生的覆盖率可以映射到源码行并且高亮显示:
- 没有覆盖:行内没有分支被执行(红色代码块)
- 部分覆盖:行内只有一部分分支被执行(黄色代码块)
- 完全覆盖:行内所有分支都被执行 (绿色代码块)
圈复杂度
JaCoCo同样可以为每一个非抽象方法计算圈复杂度,最终计算出类、包、组的复杂度。根据McCabe1996圈复杂度的定义是,在线性组合中,计算在一个方法里面所有可能路径的最小数量。因此,复杂度的值可以作为表示单元测试用例是否有完全覆盖所有场景的一个依据。复杂度数字即使在类文件缺失调试信息的情况下也可以计算。
圈复杂度 v(G) 的正式定义基于方法的控制流程图作为有向图的表示:
v(G) = E - N + 2
其中,E代表边界的数量,N表示节点的数量。JaCoCo通过下面基于分支数量(B)和决策点数量(D)的等价方程来计算方法的圈复杂度:
v(G) = B - D + 1
基于每个分支的被覆盖情况,JaCoCo也为每个方法计算覆盖率和缺失的复杂度。缺失的复杂度同样表示测试用例没有完全覆盖到这个模块。值得注意的是JaCoCo并不会将异常处理作为分支, try/catch 块也同样不会增加复杂度。
行
所有的类文件使用调试信息编译之后,就可以计算行的覆盖率信息。一行源代码是否被执行,要看这一行中是否至少有一个指令被执行。由于单一行代码通常被编译为多个字节码指令,这样源码在高亮显示时,会显示成3种不同的状态:
- 没有覆盖:行中没有执行任何指令 (红色背景)
- 部分覆盖:行中只有一部分指令被执行(黄色背景)
- 完全覆盖:行中的所有指令都已执行(绿色背景)
根据源代码格式的不同,源代码的单行可能引用多个方法或多个类。因此,不能简单地添加方法的行计数来获取包含类的总数。同一个源文件中多个类的行也是如此。Jacoco根据覆盖的实际源行计算类和源文件的行覆盖率。
方法
每个非抽象方法至少包含一个指令。一个方法是否执行取决于方法中是否至少有一个指令被执行。当Jacoco在字节代码级别上工作时,构造器和静态初始化同样会像方法一样统计。其中一些方法可能没有可以直接对应的Java源码,比如默认构造器或常量的初始化命令。
类
一个类是否执行取决于类中是否至少有一个方法被执行。值得注意的是JaCoCo认为构造函数和静态初始化都是方法。Java的接口一般包含静态初始化,所以接口也同样被认为是可执行的类。
JaCoCo覆盖率计数器的更多相关文章
- Jacoco覆盖率工具使用调研
JaCoCo Java Code Coverage Library Jacoco是一个开源的覆盖率工具.Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以 ...
- Jacoco覆盖率工具使用
Jacoco介绍 Jacoco是一个开源的覆盖率工具.Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序.很多第 ...
- Jacoco覆盖率工具使用之maven篇
说明 之前的文章已经介绍过如何使用apacheant 执行jacoco工具,下面开始介绍如何使用maven使用jacoco工具. 1.首先新建一个maven项目 如图所示: ...
- jacoco覆盖率工具测试及性能分析
ant版本:https://ant.apache.org/bindownload.cgi jdk版本 注: ant 1.10 ---> jdk1.8 ant 1.9 ---& ...
- linux环境中设置jacoco覆盖率
cd /alidata1/admin/za-themis pkill -9 -f za-themis #CATALINA_HOME=/root/za-tomcat #CATALINA_BASE=/ro ...
- 在jenkins和sonar中集成jacoco(二)--在jenkins中生成jacoco覆盖率报告
先要在jenkins上安装jacoco的插件,安装完成之后在job的配置项中可以增加这个选项: 第一个录入框是你的覆盖率文件(exec),第二个是class文件目录,第三个是源代码文件目录. 配置好了 ...
- 一个测试文件与源文件位于不同模块时Jacoco覆盖率配置的例子
问题描述: 我们有个多模块项目,由于种种原因(更常见的可能是需要集成测试)测试文件和源文件不在一个模块,Jacoco的覆盖率无法正确显示,查询了一些资料,发现中文的例子比较少,就把我自己的Demo贴一 ...
- 使用JaCoCo统计单元测试代码覆盖率
1 JaCoCo介绍 JaCoCo是EclEmma团队基于多年覆盖率库使用经验总结而研发的一个开源的Java代码覆盖率库. 2 JaCoCo覆盖率计数器 JaCoCo 包含了多种尺度的覆盖率计数器(C ...
- maven单测生成覆盖率报告---Jacoco的使用
JaCoCo介绍 一.JaCoCo简述 JaCoCo是一个开源的覆盖率工具,它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant.Maven中:可以作为Eclipse插件,可以使用其Java ...
随机推荐
- 四、Srping之Bean的初始化和销毁
Srping之Bean的初始化和销毁方法 通常,bean的初始化和销毁方法我们有三个地方可以入手,分别是: 自定义初始化,销毁方法 实现spring提供的InitializingBean(初始化逻辑) ...
- Singnal R 练习参考
项目地址:https://gitee.com/dhclly/IceDog.SignalR/tree/master/src/chat demo的实现均来自官方的教程,教程地址: ASP.NET Core ...
- 解决用navicat远程连接数据库出现1045 access denied for user 'root'@'localhost' using password yes
在mysql命令行中执行 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456XXX'); GRANT ALL PRIVILEGES ON * ...
- 汇总Anaconda与ROS冲突解决方法
汇总一下在网上找到的Anaconda与ROS冲突解决方法,如果还有其他人找到其他方法,欢迎留言. anaconda和ros的安装就不介绍了. 1. 在某视频网站上一个印度小哥提出的方法 安装完成后,在 ...
- C# 人民币大写金额转换
/// <summary> /// 转换人民币大小金额 /// </summary> /// <param name="nu ...
- 从VisualStudio资源文件看.NET资源处理
c# 工程里面,经常会添加资源文件. 作用: 一处文本多个地方的UI使用,最好把文本抽成资源,多处调用使用一处资源. 多语言版本支持,一份代码支持多国语言.配置多国语言的资源文件,调用处引用资源. 例 ...
- ASP.NET Core MVC 过滤器
参考网址:https://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_4_3-filters.html ASP.NET Core有五种类型的过滤器,每个过滤 ...
- 腾讯WeTest加入智慧零售“倍增计划”,引领微信小程序质量优化
WeTest 导读 在2019腾讯全球数字生态大会零售分论坛上,腾讯正式面向全行业合作伙伴发布倍增计划,通过咨询.培训.竞赛三步走,帮助零售商户解决前端触点融通的问题,推动微信生意大盘阶梯式上涨. 倍 ...
- vue如何导入外部js文件(es6)
也许大家都是使用习惯了es5的写法喜欢直接用<Script>标签倒入js文件,但是很是可惜,这写法.在es6,或则说vue环境下不支持 真的写法是怎样? 首先.我们要改造我们要映入的外部j ...
- RV64I基础整数指令集
RV64I是RV32I的超集,RV32I是RV64I的子集.RV64I包括RV32I的所有40条指令,另外增加了12条RV32I中没有的指令,还有三条移位指令(slli, srli,srai)也进行小 ...