Jacoco覆盖率

8 篇文章 0 订阅
6 篇文章 0 订阅

Jacoco通过若干计数来统计覆盖率,这些计数基于class文件中的java 字节码指令和debug信息获取的,不依赖于源码,并且多数情况下,这些信息可以映射到源码行。其局限性就是要依赖于debug信息来计算行覆盖率,并不是所有的java指令都能编译成适合的字节码,俗称合成码,这种情况下计算的覆盖率不准确。

  1. 行覆盖
    条件:如上所述,计算行覆盖率需要debug信息
    计算:至少行中的一条指令运行,则该行被覆盖
    分类:由于一行代码通常包含多条指令,根据指令的执行情况细分:
    - 无覆盖率:没有指令覆盖(红色)
    - 部分覆盖:部分指令覆盖(黄色)
    - 全覆盖:所有指令覆盖(绿色)
    由于一行代码可能被多个方法或类引用,所以不能单纯的通过计算所有方法的代码行来作为整个类的代码行,jacoco计算的是实际的源码行覆盖率。
  2. 方法覆盖率
    非抽象方法至少包含一条指令,一条指令被覆盖则该方法被覆盖。由于Jacoco基于字节码指令,所以构造方法和静态初始化方法也被计算在内,这些方法有的不能直接对应到java源码,比如implicit(scala)、默认构造函数、常量初始化方法。
  3. 类覆盖
    至少一条指令被执行,则类被覆盖,Jacoco把构造函数和静态初始化方法也计算在方法内,由于接口包含静态初始化方法,所以接口也被看作可执行的类。
  4. 指令覆盖(C0覆盖)
    最新粒度的覆盖,统计字节码指令的覆盖率情况,不依赖源码和debug信息,所以通常都可以获取到有效值。
  5. 分支覆盖(C1覆盖)
    Jacoco计算if和switch语句的分支覆盖,通过计算方法中的分支执行情况,来反映多少分支执行和为执行,分支覆盖不依赖于debug信息,异常处理不在分支覆盖统计范围内。
    未覆盖:没有分支执行(红色)
    部分覆盖:部分分支执行(黄色)
    全覆盖:全部执行(绿色)
  6. 圈复杂度
    Jacoco统计非静态类的全复杂度,度量类、包、组级别的复杂性。圈复杂度是度量方法中所有路径的最小线性组合,来反映代码片段中所有路径是否被全覆盖,不依赖debug信息。
    通常圈复杂度(v(G))的计算基于控制方法执行的有效图:
    v(G) = E - N + 2
    E:边数 N:节点数
    Jacoco计算方法的圈复杂度:
    v(G) = B - D + 1
    B:分支数 D:决策节点数
    基于分支覆盖率,Jacoco计算每个方法的圈复杂度的覆盖情况来反映这个模块是否被完全覆盖。由于Jacoco分支覆盖不考虑异常,所以try/catch语句不会增加复杂度。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值