JaCoCo覆盖率计数器介绍

Jacoco.jpg

注意:此文译自JaCoCo官方介绍文档,如有出错之处,烦请指出,不胜感激。点击此处,查看原文

覆盖率计数器

JaCoCo使用一组不同的计数器来计算覆盖率指标。这些计数器根据Java类文件包含的信息(基本上是Java字节码指令和调试信息有选择地嵌入类文件)被分成不同种类。因此,即使在没有源码的情况下,这种方法也允许高效的动态测量和分析应用程序。

在大多数情况下,收集到的信息可以被映射回源代码,然后可视化成行级别的覆盖率报告。然而,这种方法也有局限性。调试信息必须被编译到类文件,以便计算行粒度覆盖率,并提供源代码高亮显示。并不是所有的Java语言结构都可以直接编译成字节码,在这种情况下,Java编译器创建所谓的合成代码有时会导致意想不到的代码覆盖率结果。

指令(C0 Coverage)

最小单元JaCoCo计数是单个Java字节码指令,指令覆盖提供了被执行或未被执行的代码量信息。这个指标是完全独立于源格式的, 即使在没有调试信息的类文件,也是可用的,。

分支(C1 Coverage)

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块也不会增加复杂性。

对所有已编译调试信息的类文件,每一行的覆盖率信息也可以计算。当至少一条指令被分配到某一源码行时,该源码行被认为已经执行。

由于一行通常 编译多个字节码指令,每一行包含的源代码高亮显示有三种不同的状态:

  • 未覆盖:该行没有指令被执行(红色背景)
  • 部分覆盖:该行只有部分指令被执行(黄色背景)
  • 全覆盖:该行包含的所有指令都被执行(绿色背景)

根据源格式,一行源代码可能指定了多个方法或多个类。因此,方法的行计数,不能简单地添加到获得包含类的总数。这同样适用于在一个源文件的多个类。JaCoCo基于实际的源代码行覆盖来计算类和源文件的覆盖率。

方法##

每个非抽象方法至少包含一条指令。当方法至少一条指令被执行,则被认为该方法被执行过。因为JaCoCo是基于字节码级别的,构造函数和静态初始化也被当作方法计算。 其中有些方法,如隐式,从而生成默认构造函数或常量初始值设定,可能没有直接对应到Java源代码中。

当一个类至少有一个方法被执行过,则认为该类被执行过。注意,JaCoCo 将构造方法和静态初始化方法也当作被执行过的方法。包含静态初始化方法的Java接口类型,也被当作已执行的类。

阅读原文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,103评论 18 139
  • 2016年国庆假期终于把此书过完,整理笔记和体会于此。 关于书名 书名源于俄罗斯的演员斯坦尼斯拉夫斯基创作的《演员...
    李剑飞的简书阅读 7,126评论 2 65
  • 这世间,唯有时间对每个人是最公平的。 此时不改变,明天你还是如此模样。 不想把未来想的太复杂,因为你永远不知道明天...
    miss_默芝阅读 188评论 0 0
  • 在这里有两种人,他们都要报考北大的研究生了,正在准备阶段。小A逢人聊天便会提到自己要考北大的研究生,看到别人称赞的...
    秋羽阅读 396评论 0 0
  • 一盏小灯摆在床头。这样看来,冬夜的黑幕顷刻间也显出几分温暖。从手机里跑出小时候的旋律,这样就很好。能帮我暂时离...
    七渔安阅读 282评论 0 1