覆盖率计数器

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覆盖率计数器的更多相关文章

  1. Jacoco覆盖率工具使用调研

    JaCoCo Java Code Coverage Library Jacoco是一个开源的覆盖率工具.Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以 ...

  2. Jacoco覆盖率工具使用

    Jacoco介绍 Jacoco是一个开源的覆盖率工具.Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序.很多第 ...

  3. Jacoco覆盖率工具使用之maven篇

    说明 之前的文章已经介绍过如何使用apacheant 执行jacoco工具,下面开始介绍如何使用maven使用jacoco工具. 1.首先新建一个maven项目       如图所示:        ...

  4. jacoco覆盖率工具测试及性能分析

    ant版本:https://ant.apache.org/bindownload.cgi jdk版本 注: ant 1.10    --->   jdk1.8 ant 1.9      ---& ...

  5. linux环境中设置jacoco覆盖率

    cd /alidata1/admin/za-themis pkill -9 -f za-themis #CATALINA_HOME=/root/za-tomcat #CATALINA_BASE=/ro ...

  6. 在jenkins和sonar中集成jacoco(二)--在jenkins中生成jacoco覆盖率报告

    先要在jenkins上安装jacoco的插件,安装完成之后在job的配置项中可以增加这个选项: 第一个录入框是你的覆盖率文件(exec),第二个是class文件目录,第三个是源代码文件目录. 配置好了 ...

  7. 一个测试文件与源文件位于不同模块时Jacoco覆盖率配置的例子

    问题描述: 我们有个多模块项目,由于种种原因(更常见的可能是需要集成测试)测试文件和源文件不在一个模块,Jacoco的覆盖率无法正确显示,查询了一些资料,发现中文的例子比较少,就把我自己的Demo贴一 ...

  8. 使用JaCoCo统计单元测试代码覆盖率

    1 JaCoCo介绍 JaCoCo是EclEmma团队基于多年覆盖率库使用经验总结而研发的一个开源的Java代码覆盖率库. 2 JaCoCo覆盖率计数器 JaCoCo 包含了多种尺度的覆盖率计数器(C ...

  9. maven单测生成覆盖率报告---Jacoco的使用

    JaCoCo介绍 一.JaCoCo简述 JaCoCo是一个开源的覆盖率工具,它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant.Maven中:可以作为Eclipse插件,可以使用其Java ...

随机推荐

  1. 一、Spring注解之@ComponentScan

    Spring注解之@ComponentScan [1]@ComponentScan注解是什么 @ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bea ...

  2. undefined reference的一种case

    undefined reference是经常遇到的链接错误,一般是函数未定义或未正确链接引起的问题: but 有一种case,比较坑... c++ 调用 c 的函数,当c函数未加:extern “C” ...

  3. hdu-6071 Lazy Running

    In HDU, you have to run along the campus for 24 times, or you will fail in PE. According to the rule ...

  4. windows10 启动安卓模拟器会蓝屏的解决方案

    最近突然想用win10装个安卓模拟器玩游戏,然后提示vt被占用. 查了一下,了解到在windows 10 系统上,我们会用vmware,virtual box ,hyper-v,安卓模拟器,360安全 ...

  5. IDEA不能读取配置文件,springboot配置文件无效、IDEA resources文件夹指定

  6. 单独KafkaConsumer实例and多worker线程。

    1.单独KafkaConsumer实例and多worker线程.将获取的消息和消息的处理解耦,将消息的处理放入单独的工作者线程中,即工作线程中,同时维护一个或者若各干consumer实例执行消息获取任 ...

  7. Enum.GetUnderlyingType(obj.GetType())

    Enum.GetUnderlyingType(obj.GetType())获取保存枚举值的数据类型:

  8. IIS错误:在唯一密钥属性“fileExtension”设置为“.json”时,无法添加类型为“mimeMap”的重复集合项

    在用visual studio 打开一个asp.net mvc 项目时,ctrl+f5运行,发现页面无法加载图片.js.json文件. 按F12查看错误,发现500错误.打开报错的js文件,提示: I ...

  9. c# 值类型和引用类型 笔记

    参考以下博文,我这里只是笔记一下,原文会更加详细 c#基础系列1---深入理解值类型和引用类型 堆栈和托管堆c# 值类型和引用类型 红色表示——“这啥?”(真实1个问题引出3个问题) CLR支持的两种 ...

  10. C 函数指针、回调函数

    参考链接:https://www.runoob.com/cprogramming/c-fun-pointer-callback.html 函数指针 函数指针就是执行函数的指针,他可以像正常函数一样去调 ...