代码覆盖率检测

Libo.X 1年前
549次浏览 0人关注 复制链接 所属标签: 代码覆盖率

意义

分析未覆盖部分的代码,从而反推在测试用例是否充分。
检测出程序中的废代码,可以逆向反推在代码设计中思维混乱点,提醒理清代码逻辑关系,提升代码质量。
代码覆盖率高不能说明代码质量高,但是反过来看,代码覆盖率低,代码质量不会高到哪里去,可以作为测试自我审视的重要工具之一。

工具

覆盖率工具工作流程

  1. 对Java字节码进行插桩,On-The-Fly和Offine两种方式。
  2. 执行测试用例,收集程序执行轨迹信息,将其dump到内存。
  3. 数据处理器结合程序执行轨迹信息和代码结构信息分析生成代码覆盖率报告。
  4. 将代码覆盖率报告图形化展示出来,如html、xml等文件格式

Jacoco解析

Instructions(指令覆盖率)

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

Branches(分支覆盖率)

JaCoCo也计算所有if和switch语句的分支覆盖率。这个指标项计算在一个方法中的总分支数,并决定了已执行和未执行分支的数量。即使在没有调试信息的类文件,分支覆盖也总是可用的。注意,在此计数器的定义中,异常处理并不属于分支。
如果类文件被编译了调式信息决策点,就能够被相应地映射回源码行以及高亮显示:

Lines(行覆盖率)

JaCoCo可以计算每一行的被覆盖的情况。JaCoCo认这一行至少有一条指令被执行则认为这一行被执行过了。

Cyclomatic Complexity(环路复杂度)

Jacoco 会为每一个非抽象方法计算圈复杂度,并为类,包以及组(groups)计算复杂度。圈复杂度简单的说就是为了覆盖所有路径,所需要执行单元测试数量,圈复杂度大说明程序代码可能质量低且难于测试和维护。

Methods

方法覆盖率,任何非抽象的方法,只要有一条指令被执行,则该方法被计为被执行

Classes

类覆盖率,所有类,包括接口,只要其中有一个方法被执行,则标记为被执行。

注意:构造函数和静态初始化块也算作方法

实践

根据几个工具的比较与行业内的一些使用案例,目前后端选用Jacoco作为测试覆盖率工具。

项目Pom.xml配置

解析:

1:主要是Jacoco插桩的配置,准备一个指向JaCoCo运行时代理的属性,该属性可以作为VM参数传递给被测试的应用程序,此过程将会生成一个jacoco.exec文件,此文件是原始覆盖数据文件,默认在target目录下,可配置。

2:此过程主要是生成覆盖率报告,可指定maven的lifecycle。图中的配置是在maven执行package阶段进行报告生成,并且生成在target目录的jacoco-ut目录下。

3:此过程主要是对覆盖率的一个检查配置。对一些列的rule配置来检查覆盖率是否达标。可以对检查元素类型(BUNDLE, PACKAGE, CLASS, SOURCEFILE or METHOD)进行配置,图中是对总体项目覆盖率进行检查,最小行覆盖率不能低于10%。

注意:要像得到测试覆盖率,必须要开启单元测试配置,在springboot项目中spring-boot-starter-parent父模块已经配置测试插件surefire,自己项目中没有特殊配置,无需进行测试插件surefire的配置。

执行

非常简单的执行mvn package命令即可。

结果展示

执行完package命令之后,target目录下可以看到已经生成了jacoco.exec文件和jacoco-ut目录。

jacoco-ut目录中会为工程内所有的类文件生成html文件以及一个汇总html文件。

打开jacoco-ut目录下的index.html文件,会展示可视化的测试覆盖率报告,其中包括指令、分支、环路复杂度、行、方法、类的覆盖数和未覆盖数。

Jenkins集成

插件安装

系统管理—>管理插件,安装Jacoco Plugin插件。

Job配置


自由风格项目的Job中,在构建后操作选项中选择Record Jacoco coverage report,将出现下图配置:

根据以上pom的配置,这里默认即可,也可以设置覆盖率阈值来控制构建状态,最终报告结果展示如下:

5条回答
数据爱好者 1年前

赞!

有用0 评论0
班大头 1年前

讲解够细[坏笑]

有用0 评论0
zhaoy07331 1年前

我要用平板撑挑战你

有用0 评论1
登录后可参与回答,请 登录
Libo.X 1年前

来来来~[坏笑]

有用0 评论
liweitao 1年前

讲解很细致!赞!!!

有用0 评论0