Jacoco 覆盖率维度说明

以下是JaCoCo统计的指标维度

1)指令 - Instructions(C0覆盖率)

JaCoCo计数的最小单位是单个Java字节代码指令。指令覆盖率提供有关已执行或遗漏(executed or missed)的代码量的信息。该度量完全独立于源格式,并且即使在类文件中没有调试信息的情况下也始终可用。

2)分支 - Branches(C1覆盖率)

JaCoCo还为所有if和switch语句计算分支覆盖率。此度量标准统计方法中此类分支的总数,并确定已执行或遗漏的分支的数量。分支覆盖始终可用,即使类文件中没有调试信息也是如此。请注意,在此计数器定义的上下文中,异常处理不视为分支。

如果尚未使用调试信息编译类文件,则可以将决策点映射到源代码行并高亮:

无覆盖范围:该行没有分支执行(红色菱形)
部分覆盖:仅执行了该行中的一部分分支(黄色菱形)
全面覆盖:该行中的所有分支均已执行(绿色菱形)
3)循环复杂度 - Cyclomatic Complexity

JaCoCo 还为每种非抽象方法计算循环复杂度,并汇总了类,包和组的复杂度。根据 McCabe1996 的定义,循环复杂度是可以(线性)组合生成一种方法的所有可能路径的最小路径数。因此,复杂度值可以作为完全覆盖某个软件的单元测试用例数量的指示。即使类文件中没有调试信息,也总是可以计算复杂度数字。

循环复杂度v(G)的形式定义基于方法的控制流图作为有向图的表示:

v(G)= E- N 2

其中,E是边数,N是节点数。 JaCoCo根据分支数(B)和决策点数(D)使用以下等效方程式计算方法的循环复杂度:

v(G)= B - D + 1

根据每个分支的覆盖状态,JaCoCo还可以计算每种方法的覆盖和遗漏复杂度。缺少的复杂性再次表明完全覆盖模块的测试用例的数量。请注意,由于JaCoCo不考虑异常处理,因为分支try / catch块也不会增加复杂性。

4)行

对于已使用调试信息编译的所有类文件,可以计算各个行的覆盖率信息。当已执行至少一个分配给该源代码行的指令时,该源代码行被视为已执行。

由于单行通常会编译为多字节代码指令,因此,源代码高亮显示每行包含源代码的三种不同状态:

无覆盖:该行中没有指令被执行(红色背景)

部分覆盖:仅执行了该行中的一部分指令(黄色背景)

全面覆盖:该行中的所有指令均已执行(绿色背景)

根据源格式,源代码的一行可能会引用多个方法或多个类。因此,不能简单地添加方法的行数以获得包含类的总数。单个源文件中的多个类的行也是如此。 JaCoCo根据覆盖的实际源代码行计算类和源文件的代码行覆盖率。

5)方法

每个非抽象方法都包含至少一条指令。当至少一个指令已被执行时,一种方法被视为已执行。由于JaCoCo在字节码级别上工作,因此构造函数和静态初始化程序也被视为方法。这些方法中的某些方法在Java源代码中可能没有直接的对应关系,例如隐式生成的常量的默认构造函数或初始化器。

6)类

当至少一个类里面的方法已执行时,该类被视为已执行。 请注意,JaCoCo将构造函数以及静态初始化程序视为方法。 由于Java接口类型可能包含静态初始化器,因此此类接口也被视为可执行类。

posted @ 2024-01-25 14:03  小清澈  阅读(156)  评论(0编辑  收藏  举报