1 简介
单元测试是保证代码质量的重要一环,而如何衡量单元测试写得好不好呢?覆盖率(Coverage)是一个重要指标。而JaCoCo则是专门为Java提供的用于检测测试覆盖率的工具,英文全称为Java Code Coverage。
本文将讲解如何在Maven项目中整合JaCoCo,并在SonarQube中展示。SonarQube的安装可以参考这篇文章:
《Docker搭建代码检测平台SonarQube并检测maven项目》
2 基本概念
这里所讲的覆盖率是指测试代码的覆盖率,这个指标有多种计算方式,如下是比较常用的有:
- 行覆盖率:执行代码行数 / 总代码行数,判断有多少行代码被测试执行;
- 类覆盖率:执行的类 / 代码中类总个数;
- 分支覆盖率:执行的逻辑分支数 / 总的分支数,一般用于检测是不是lf/else都有测试覆盖;
- 方法覆盖率:执行的方法数 / 代码总方法数,检测是否有方法被遗漏,构造方法也看作为方法。
- 圈复杂度:用于判断代码结构的复杂程序,JaCoCo不考虑异常处理的分支;一般认为圈复杂度大于10,就存在比较大的风险,严格要求不可大于15。
颜色标识:
JaCoCo会通过颜色来标识代码覆盖情况,使其一目了然。红色表示没有覆盖,绿色表示已经覆盖,黄色表示部分覆盖。
执行方式:
执行JaCoCo有多种方式:
(1)直接通过命令执行:https://www.eclemma.org/jacoco/trunk/doc/agent.html
(2)Ant执行:https://www.eclemma.org/jacoco/trunk/doc/ant.html
(3)Maven执行:https://www.eclemma.org/jacoco/trunk/doc/maven.html
(4)集成IDE执行:https://www.eclemma.org/
我们接下来主要讲解maven的方式。
3 maven整合
3.1 基础整合
Maven整合JaCoCo也容易,配置如下:
org.jacoco jacoco-maven-plugin ${jacoco.version}${maven.test.skip}${basedir}/target/coverage-reports/jacoco-unit.exec${basedir}/target/coverage-reports/jacoco-unit.execfile true com/pkslow/basic/containsperformance/**com/pkslow/basic/ReadPropertiesFilejacoco-initializeprepare-agenttest-compilejacoco-siteverifyreport
执行mvn clean test,则会生成报告target/coverage-reports/jacoco-unit.exec,但这是人不可读的,Sonar可读的。Intellij Idea也可以阅读,按照Run--Show Code Coverage Data打开即可。
执行mvn clean verify,就会生成报告target/site/jacoco/,有多种格式,用浏览器打开index.html文件可以方便查看。如下图所示:
3.2 选择范围
指定某些类不执行检测:
com/pkslow/basic/containsperformance/**com/pkslow/basic/ReadPropertiesFile
3.3 规则与阈值
Rules标签可以指定检查阈值,比如类覆盖率必须为100%。在configuration里面配置如下:
BUNDLE METHODCOVEREDRATIO0.50BRANCHCOVEREDRATIO0.50CLASSMISSEDCOUNT0
这时需要有下面的check才会执行这个规则校验:
checkcheck
如果不满足条件,maven build就会失败。不过,如果我们集成了SonarQube,我们则会通过SonarQube来设置这个规则和阈值。
4 提交到Sonar
添加SonarQube配置信息如下,有三种配置方式:
(1)配置数据库信息
sonar true jdbc:postgresql://localhost/sonarorg.postgresql.Driveruserpasswordhttp://localhost:9000
(2)配置用户名密码
sonar true http://localhost:9000adminadmin
(3)配置令牌
sonar true http://localhost:90009656c84090b2481db6ea97b6d14d87d546bff619
以上三种都可以,配置完成后,执行命令如下:
mvn clean verify sonar:sonar
如果不想添加配置,可以直接通过命令来指定,命令如下:
mvn clean verify sonar:sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.login=9656c84090b2481db6ea97b6d14d87d546bff619
5 总结
JaCoCo对项目质量管理作用重大,应该加以使用。
多读书,多分享;多写作,多整理。