JaCoCo,即 Java Code Coverage Library,它由 EclEmma 团队根据多年来使用和集成现有库的经验教训而创建的一个开源的代码覆盖率工具,支持 Java 和 Kotlin;支持计算测试代码对项目的覆盖情况,能定位到测试未覆盖的代码部分;同时它也能检查程序中的废代码和不合理的逻辑提高质量;JaCoCo 能本地进行代码的检查,也可以把它与持续集成工具 Jenkins 进行集成,这样就能在代码提交后自动对提交的代码进行覆盖率的验证,保证提交代码的质量。
环境准备
- Jenkins 服务
- 执行代码覆盖率的节点机器,此机器上需要部署好 Java 和 Maven 工具
- Jenkins 上需要安装 JaCoCo Plugin 插件
- 被测的项目代码
https://gitee.com/ceshiren/iTest.git
- Junit 单元测试框架
项目的配置
- 在 Maven 项目的配置 pom.xml 文件中配置 jacoco-maven-plugin 工具
- 在 jenkins 中建立一个自由风格的项目
- 配置好运行的节点机器,此机器是环境准备中的节点机器。
- 配置代码源,将被测项目代码的 git 地址配置到此处
- 在构建(Build)中点击增加构建步骤(Add build step),构建步骤中选择执行 shell(Execute shell)
- 在构建后步骤(Post-build Actions)中添加输出信息的配置,选择 Record JaCoCo Coverage report 可以保持默认
执行job
- 手工执行 job 完成后,在 job 的首页上会展示一个代码覆盖率扫描的趋势图。其中 line covered 表示代码的覆盖,line missed 表示代码的丢失。
- 点击趋势图能进入详情的页面 (M 表示丢失,C 表示已覆盖)。其中每个字段的含义为:
- instruction:字节码指令覆盖率
- branch:分支代码覆盖率
- complexity:圈复杂度覆盖率
- line:行覆盖率
- method:方法覆盖率
- class:类覆盖率
- 在包的信息展示中还能继续往详细信息点击,查看更加详细的覆盖情况,未覆盖的代码会被标识成红色。
- 从上个步骤上看,有一个长度大于 10 的分支没有覆盖到,此时给项目的测试代码新增一个 case 后提交代码到 git 上。
- 此时重新构建任务后,将会发现前面未被覆盖的代码行已经实现了覆盖。
- 在项目的 main 函数中增加一些无用代码,重新构建后看结果,此时有新增了两行代码未被覆盖。从常识上分析两个整数相乘是不会抛错,所以此时的 try 动作是无用代码,不会进入到 catch 的分支。