jacoco代码覆盖率报告分析
一、目的
对Jacoco代码覆盖率统计维度、报告字段说明、报告详细分析描述。并为精准测试、健壮性测试提供指导。
二、Jacoco代码覆盖率统计维度
Jacoco是从代码指令(Instructions, Coverage),分支(Branches, Coverage),圈复杂度(Cyclomatic Complexity),行(Lines),方法(Methods),类(Classes)等维度进行分析的。
三、覆盖率报告字段说明
![](http://upload-images.jianshu.io/upload_images/3596084-43fad4ed30c82d51.png?imageMogr2/auto-orient/strip|imageView2/2/w/577/format/webp)
四、Jacoco覆盖率报告详细分析
4.1 目录结构
4.1.1一级目录-group
![](http://upload-images.jianshu.io/upload_images/3596084-40c9d11e769a5d04.png?imageMogr2/auto-orient/strip|imageView2/2/w/831/format/webp)
手动收集生成的报告,展示的时build.xml的 group name,若有多个group name则显示多个。
组的覆盖率取决于包的覆盖情况。
注:报告的一级目录展示以组为单位。
4.1.2 二级目录-包名
![](http://upload-images.jianshu.io/upload_images/3596084-33c415bc8dc8acfe.png?imageMogr2/auto-orient/strip|imageView2/2/w/827/format/webp)
展示当前分组下面所有的包。
包的覆盖率取决于类的覆盖情况。
4.1.3 三级目录-类名
![](http://upload-images.jianshu.io/upload_images/3596084-80189aaae6bc1147.png?imageMogr2/auto-orient/strip|imageView2/2/w/859/format/webp)
展示当前分组>包下面所有的类。
类的覆盖率取决于方法的覆盖情况。
4.1.4 四级目录-方法名
![](http://upload-images.jianshu.io/upload_images/3596084-9eef290a62f6ad35.png?imageMogr2/auto-orient/strip|imageView2/2/w/840/format/webp)
展示当前分组>包>类下面的所有方法。
方法的覆盖率取决于方法内代码覆盖的情况。
4.2 覆盖率报告详细分析
![](http://upload-images.jianshu.io/upload_images/3596084-ebe12eeb3ff12882.png?imageMogr2/auto-orient/strip|imageView2/2/w/842/format/webp)
注:报告中涉及字段的名称详见3覆盖率报告字段详细说明。
4.2.1 Missed Instructons
![](http://upload-images.jianshu.io/upload_images/3596084-50cd21a9a72cdcaf.png?imageMogr2/auto-orient/strip|imageView2/2/w/720/format/webp)
分组:红色进度条表未覆盖,绿色进度条表示已覆盖,Cov 为总体覆盖率。
Total:51379 表示没有覆盖的指令,64756 表示总的指令
Cov 表示覆盖率。
Jacoco 计算的最小单位就是字节码指令。指令覆盖率表明了在所有的指令中,哪些被执行过以及哪些没有被执行。这项指数完全独立于源码格式并且在任何情况下有效,不需要类文件的调试信息。
4.2.2 Missed Branches
![](http://upload-images.jianshu.io/upload_images/3596084-251e9f37dbb28d7c.png?imageMogr2/auto-orient/strip|imageView2/2/w/837/format/webp)
分组:红色进度条表未覆盖,绿色进度条表示已覆盖,Cov为总体覆盖率。
Total:4307表示没有覆盖的分支,4954表示总的分支,Cov表示总体覆盖率。
实例分析一
![](http://upload-images.jianshu.io/upload_images/3596084-682c287639de65c6.png?imageMogr2/auto-orient/strip|imageView2/2/w/844/format/webp)
![](http://upload-images.jianshu.io/upload_images/3596084-fc21766b67061e42.png?imageMogr2/auto-orient/strip|imageView2/2/w/809/format/webp)
Missed Instructions覆盖率100%,但分支覆盖率为75%; 原因:所有代码行都覆盖并不代表所有分支都覆盖完整。
分析:urls!=null这个条件已覆盖,但urls=null这个条件还没有覆盖 ;所有的代码行都有覆盖到、但分支还没有覆盖完整、所以Instructions的覆盖率100%、Braches的覆盖率75%。
实例分析二
![](http://upload-images.jianshu.io/upload_images/3596084-0e1e5f6e60d15620.png?imageMogr2/auto-orient/strip|imageView2/2/w/838/format/webp)
分析:if(StringUtils.hasText(strLike)) 只执行了结果为flase的条件,没有执行结为true的条件,导致大括号的内容没有被执行;所以Missed Instructions、Missed Braches覆盖率都非100%。
4.2.3 Missed Cxty
![](http://upload-images.jianshu.io/upload_images/3596084-3fb522237f54f2ec.png?imageMogr2/auto-orient/strip|imageView2/2/w/831/format/webp)
此方法里面有1个for(1个for占2个条件)循环、8个if,圈复杂度共计10个。有两个条件没有被覆盖所以Missed为2,Cxty为10(表示总数)。
while, for, if,switch每个都是一个判定节点。嵌套的都是加1。
4.2.4Missed.Lines、Methods、classes
![](http://upload-images.jianshu.io/upload_images/3596084-9b1d30a6d6ebf92a.png?imageMogr2/auto-orient/strip|imageView2/2/w/851/format/webp)
Classes表示类、Methods表示方法、Lines表示代码行。
Missed表示未覆盖数量,Classes表示共有X个类、Methods表示共有X个方法,Lines表示共有多少行代码(例如:else是不统计到Lines的)。
4.3 覆盖率标识
4.3.1 条件覆盖
红钻:表示未覆盖
黄钻:表示部分覆盖
绿钻:表示全部覆盖
注:条件覆盖都是用钻表示。
4.3.2 Lines覆盖
红色背景:无覆盖,该行的所有指令均无执行。
背景:部分覆盖,该行部分指令被执行。
绿色背景:全覆盖,该行所有指令被执行。
作者:奔跑的小小鱼
链接:https://www.jianshu.com/p/ef987f1b6f2f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。