下面介绍现有的一种测试覆盖率报告方案:cobertura,具体是通过cobertura的maven以及Jenkins插件来实现测试覆盖率的展示。
maven部分
<!-- 在clean时把老的ser文件也清理掉 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<filesets>
<fileset>
<directory>.</directory>
<includes>
<include>**/*.ser</include>
</includes>
</fileset>
</filesets>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<formats>
<format>html</format>
<format>xml</format>
</formats>
<aggregate>true</aggregate> <!-- 表示会聚合不同子module下的测试报告 -->
</configuration>
</plugin>
运行mvn cobertura:cobertura,它会在每个模块以及根目录的target下分别产生.ser文件以及相应覆盖率报告文件。
覆盖率的html展示效果如下:
在我们的应用场景中,以后希望自动跑这些单元测试,之前写的真实访问、修改数据的test方法就需要排除了,我做了如下配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<includes>
<include>**/*TestJMock.java</include>
</includes>
<excludes>
<exclude>**/*Test.java</exclude>
</excludes>
</configuration>
</plugin>
如果要对测试覆盖率进行控制,一定要达到指定标准呢,做如下配置:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<formats>
<format>html</format>
<format>xml</format>
</formats>
<aggregate>true</aggregate> <!-- 表示会聚合不同子module下的测试报告 -->
<check>
<branchRate>0</branchRate>
<lineRate>0</lineRate>
<haltOnFailure>true</haltOnFailure>
<totalBranchRate>0</totalBranchRate>
<totalLineRate>0</totalLineRate>
<packageLineRate>0</packageLineRate>
<packageBranchRate>0</packageBranchRate>
<regexes>
<regex>
<pattern>com.company.mode.services.*</pattern>
<branchRate>60</branchRate>
<lineRate>80</lineRate>
</regex>
</regexes>
</check>
</configuration>
</plugin>
通过mvn cobertura:check即可对覆盖率进行校验
下面说说这个maven插件的一些缺陷:
1、不支持lambda表达式,在mvn命令的执行中会报错,即使在通过git仓库下载最新cobertura代码自己打包生成的jar包,虽然没有报错,但是依然不能正常产生报告
2、根目录下的测试覆盖率文件似乎只是随机选了底下一个module的覆盖率,没有按照我们的设想来:将所有子module的测试覆盖率汇总。
jenkins 部分
接着讲如何集成到jenkins中,首先安装插件:
其次,在相应的构建任务中配置构建动作以及之后的cobertura解析动作:
构建之后的报告效果如下:
很神奇地,这个时候出现的覆盖率报告整合了所有子模块的测试覆盖率,这个部分应该是Jenkins插件对所有子module的coverage.xml都做了整合之故。