1.JaCoCo简介

JaCoCo是一个开源的代码覆盖统计工具,支持Java和Kotlin;支持计算测试代码对项目的覆盖情况,能定位到测试未覆盖的代码部分;同时它也能检查程序中的“废”代码和不合理的逻辑,用以提高代码质量;JaCoCo不仅能对本地的代码进行检查,我们还可以把它与持续集成工具Jenkins进行集成,这样就能在代码提交后自动对提交的代码进行覆盖率的验证,保证提交代码的质量。

2.JaCoCo运行环境准备

(1)Jenkins服务:执行代码覆盖率的节点计算机,由于Jenkins执行代码覆盖率是向本地工具发起调用,所以,此节点计算机上需要安装好代码覆盖的相关工具,如Java和Maven。

(2)Jenkins上需要安装JaCoCo插件。

(3)安装JUnit单元测试框架。

3.Maven项目与Jenkins工程(job)配置

(1)在Maven项目的配置文件(pom.xml)中配置jacoco-maven-plugin工具(见图8-36)。

Java单元测试覆盖率统计 java测试代码覆盖率_jenkins

 

(2)在Jenkins中建立一个自由风格的项目(见图8-37)。

(3)配置好节点计算机,此计算机是JaCoCo运行环境中的节点计算机,勾选“限定节点运行”(Restrict where this project can be run)项后,在“标签表达式”(Label Expression)文本框中填入节点的匹配表达式(见图8-38)。

Java单元测试覆盖率统计 java测试代码覆盖率_Jenkins_02

 

(4)配置代码源,将被测项目的代码的Git地址配置到图8-39所示的URL中。

Java单元测试覆盖率统计 java测试代码覆盖率_Jenkins_03

 

(5)在“构建”(Build)选项卡界面中选择“增加构建步骤”(Add build step)项,在“构建步骤”中选择执行shell(Execute shell)(见图8-40)。

Java单元测试覆盖率统计 java测试代码覆盖率_jenkins_04

 

(6)在“构建后操作”(Post-build Actions)中,选择“增加构建后操作步骤”(Add post-build action)项,在展开的页面中选中“Record JaCoCo coverage report”项(见图8-41),展开的页面中的其他配置项可以保持默认值。

4.执行job

(1)job配置完成之后,保存信息。在job首页的左边功能列表中有对该工程的操作,点击“立即构建”(Build Now)项,构建完成后会在job首页上展示一个代码覆盖率的趋势图。其中“line covered”表示代码的覆盖,“line missed”表示代码的丢失(见图8-42)。

Java单元测试覆盖率统计 java测试代码覆盖率_代码覆盖率_05

 (2)点击趋势图能进入详细信息页面(M表示丢失,C表示已覆盖)(见图8-43)。其中部分字段的含义如下。

1)instruction:字节码指令覆盖率。

2)branch:分支代码覆盖率。

3)complexity:圈复杂度覆盖率。

4)line:行覆盖率。

5)method:方法覆盖率。

6)class:类覆盖率。

Java单元测试覆盖率统计 java测试代码覆盖率_Jenkins_06

 

(3)图8-43中的“Coverage Breakdowm by Package” 项展示出包的覆盖信息,通过点击包名还能继续查看包下面的类、方法等更详细的代码覆盖情况,未覆盖的代码会被标识成为红色(见图8-44和图8-45)。注:实际运行环境中有颜色。

Java单元测试覆盖率统计 java测试代码覆盖率_Jenkins_07

 

Java单元测试覆盖率统计 java测试代码覆盖率_jenkins_08

 

(4)从第3个步骤中可以看到,Demo1类中的countlength() 方法有一个if语句的分支长度大于10(length>10)的条件没有覆盖到。此时可以在项目的测试代码中新增一个测试用例(见图8-46)。

Java单元测试覆盖率统计 java测试代码覆盖率_代码覆盖率_09

 

(5)我们用Jenkins重新构建任务后,将会发现前面未被覆盖的代码行已经被覆盖了(见图8-47)。

Java单元测试覆盖率统计 java测试代码覆盖率_Jenkins_10

(6)我们在项目的main函数中增加一些无用代码,用Jenkins重新构建后发现新增的两行无用代码未被覆盖。根据对代码分析可知,代码中两个整数相乘是不会出现问题的,所以代码中的try语句是无用代码,测试程序就不会进入到catch的分支(见图8-48和图8-49)。

Java单元测试覆盖率统计 java测试代码覆盖率_代码覆盖率_11

Java单元测试覆盖率统计 java测试代码覆盖率_代码覆盖率_12