- 问题背景
- maven-surefire-plugin插件
- 跳过全部测试用例
- 跳过部分测试代码
- Jacoco生成覆盖率报告
- 总结
本文以maven项目为例,主要解决一下两个问题:
- 在代码构建时不想执行测试代码,或者希望有选择地执行其中一部分测试代码
- 使用jacoco插件生成覆盖率测试报告,并且只统计已选择执行的部分测试代码的覆盖率
Maven构建项目的生命周期分为很多个阶段,其中test阶段默认绑定了maven-surefire-plugin插件来执行JUnit或TestNG的测试用例。
也就是说,当执行 mvn test 命令时,maven-surefire-plugin插件就已经开始工作了。
maven-surefire-plugin插件可以通过一些属性配置来选择性地执行指定的测试类,默认情况下,surefire插件会自动执行 src/test/ 目录下符合以下命名规则的测试类:
1) Test*.java: 任何以 Test 开头的Java类
2) *Test.java: 任何以 Test 结尾的Java类
3) *TestCase.java: 任何以 TestCase 结尾的Java类
maven-surefire-plugin插件的导入:
跳过全部测试用例org.apache.maven.plugins maven-surefire-plugin 2.4.2
- 如果需要跳过所有的测试代码,可以使用
true 进行配置 - 默认不跳过测试,即
false - 对于包含多个子工程的项目,在父pom.xml配置
true 属性,则所有的子工程的测试代码都跳过执行;若某个子工程也配置surefire插件并将该属性设为false,则盖子工程不会跳过其测试代码的执行 - maven-surefire-plugin生成的测试报告默认存放在工程的 ${basedir}/target/surefire-reports/ 路径下,${basedir} 是 pom.xml 文件所在的目录;对于多工程的项目,每个工程的target目录先都会生成 surefire-reports
org.apache.maven.plugins maven-surefire-plugin 2.4.2 true
跳过测试在控制台会显示 [INFO] Tests are skipped. 信息,同时由于无法生成 jacoco.exec 文件,jacoco也无法生成覆盖率报告。
跳过部分测试代码- surefire插件通过配置
和 属性来选择执行或不执行某些指定的测试用例,最终执行的测试代码是两者的交集 - 例如,下面代码中,最终会执行所有类名以 Test 结尾的测试类,并且不执行所有类名以 TestCase 结尾的测试类
org.apache.maven.plugins maven-surefire-plugin 2.4.2 ***Test.class ***Test.class -->匹配所有类名以 Test 结尾的测试类 Jacoco生成覆盖率报告
**/example* -->匹配所有包路径中包含 example 的测试类maven-surefire-plugin插件使用
true 或者、 配置可以跳过或者选择指定的测试类,但在使用Jacoco统计覆盖率是,实际上那些被指定跳过的代码也还是会被统计进来的。 例如,假设有三个类 TestA、 TestB、 TestC,分别有 20 、30、50行代码,共100行,现在使用surefire插件设置跳过TestB和 TestC 的测试代码,只执行 TestA 的测试代码。那么,即使 TestA 的20行代码全部被覆盖到,最终Jacoco统计的行覆盖率仍然只有20%,因为Jacoco默认统计项目的所有代码的行覆盖率。
如果全部跳过测试,Jacoco将无法生成 jacoco.exec 文件,则会显示 [INFO] Skipping JaCoCo execution due to missing execution date file. 信息。
如果希望在跳过TestB和 TestC 的测试代码的同时,让Jacoco只对 TestA 进行统计,则需要进行相应的配置。
Jacoco插件导入
org.jacoco jacoco-maven-plugin 0.8.1 prepare-agent report test report 配置
和 属性,选择指定的测试代码进行jacoco统计: org.jacoco jacoco-maven-plugin 0.8.1 prepare-agent report test report **/example* **/util* 当然,Jacoco生成覆盖率报告的前提是能够正常地生成jacoco.exec文件,该文件默认保存在 ${basedir}/target/ 路径下。
Jacoco生成的覆盖率报告默认保存在 ${basedir}/target/site/jacoco/ 路径下。
总结通过结合使用 maven-surefire-plugin 插件和 Jacoco,可以在构建项目时只执行指定的测试代码,并且只统计指定的测试代码的jacoco覆盖率,方便代码开发调试。



