概述
本文将演示如何使用Cobertura生成代码覆盖率报告的各个方面。
简单来说,Cobertura是一个用于计算代码库测试覆盖率的工具,它关注Java项目中单元测试访问的分支/行数百分比。
1. Maven 插件
1.1. Maven 配置
为了在Java项目中开始计算代码覆盖率,你需要在pom.xml
文件的报告部分声明Cobertura Maven插件:
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
</plugin>
</plugins>
</reporting>
你可以在Maven中央仓库检查插件的最新版本。
完成后,运行Maven并指定cobertura:cobertura
作为目标。
这将创建一个详细的HTML风格报告,展示通过代码插桩收集的代码覆盖率统计信息:
行覆盖率指标显示单元测试运行时执行了多少语句,而分支覆盖率指标则关注这些测试覆盖了多少分支。
对于每个条件,你有两个分支,所以总的分支数通常是条件数的两倍。
复杂性因素反映了代码的复杂程度,当代码中的分支数量增加时,复杂度也会提高。
理论上,分支越多,就需要编写更多的测试来提高分支覆盖率得分。
1.2. 配置代码覆盖率计算和检查
你可以使用ignore
和exclude
标签忽略或排除特定类的代码插桩:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<instrumentation>
<ignores>
<ignore>com/baeldung/algorithms/dijkstra/*</ignore>
</ignores>
<excludes>
<exclude>com/baeldung/algorithms/dijkstra/*</exclude>
</excludes>
</instrumentation>
</configuration>
</plugin>
计算完代码覆盖率后,接下来是check
阶段。**check
阶段确保达到了一定的代码覆盖率要求。**
以下是配置check
阶段的基本示例:
<configuration>
<check>
<haltOnFailure>true</haltOnFailure>
<branchRate>75</branchRate>
<lineRate>85</lineRate>
<totalBranchRate>75</totalBranchRate>
<totalLineRate>85</totalLineRate>
<packageLineRate>75</packageLineRate>
<packageBranchRate>85</packageBranchRate>
<regexes>
<regex>
<pattern>com.baeldung.algorithms.dijkstra.*</pattern>
<branchRate>60</branchRate>
<lineRate>50</lineRate>
</regex>
</regexes>
</check>
</configuration>
当使用haltOnFailure
标志时,如果指定的检查之一失败,Cobertura会导致构建失败。
branchRate/lineRate
标签指定了代码插桩后的最小可接受分支/行覆盖率分数。这些检查可以扩展到包级别,使用packageLineRate/packageBranchRate
标签。
还可以使用regex
标签为遵循特定模式的类声明特定规则检查。在上面的示例中,我们确保com.baeldung.algorithms.dijkstra
包及其以下的类必须达到特定的行/分支覆盖率分数。
2. Eclipse 插件
2.1. 安装
Cobertura也有一个名为eCobertura的Eclipse插件。要在Eclipse中安装eCobertura,请按照以下步骤操作,并确保安装了Eclipse 3.5或更高版本:
步骤1: 从Eclipse菜单中选择帮助
→ 安装新软件
。在工作与
字段中,输入http://ecobertura.johoop.de/update/*
:
步骤2: 选择eCobertura代码覆盖率
,点击“下一步”,然后按照安装向导中的步骤进行操作。
eCobertura安装完成后,重启Eclipse,在窗口
→ 显示视图
→ 其他
→ Cobertura
下显示覆盖率会话视图。
2.2. 使用Eclipse Kepler及以上版本
对于较新的Eclipse版本(如Kepler、Luna等),安装eCobertura可能会导致与JUnit相关的问题:Eclipse打包的JUnit版本与eCobertura的依赖检查器不完全兼容:
Cannot complete the install because one or more required items could not be found.
Software being installed: eCobertura 0.9.8.201007202152 (ecobertura.feature.group
0.9.8.201007202152)
Missing requirement: eCobertura UI 0.9.8.201007202152 (ecobertura.ui
0.9.8.201007202152) requires 'bundle org.junit4 0.0.0' but it could not be found
Cannot satisfy dependency:
From: eCobertura 0.9.8.201007202152
(ecobertura.feature.group 0.9.8.201007202152)
To: ecobertura.ui [0.9.8.201007202152]
解决方法是下载旧版JUnit并将其复制到Eclipse插件文件夹。
可以通过删除org.junit.\*\*\**
文件夹来完成此操作,然后从与eCobertura兼容的旧版Eclipse安装中复制同一文件夹。
完成后,重新启动Eclipse IDE,然后使用相应的更新站点重新安装插件。
2.3. Eclipse中的代码覆盖率报告
要通过单元测试计算代码覆盖率,右键点击你的项目或测试,打开上下文菜单,然后选择“覆盖作为 → JUnit测试”。
在“覆盖率会话”视图中,可以查看每个类的行/分支覆盖率报告:
使用Java 8的用户在计算代码覆盖率时可能会遇到常见错误:
java.lang.VerifyError: Expecting a stackmap frame at branch target ...
在这种情况下,Java抱怨某些方法没有正确的堆栈映射,这是由于新版本Java中更严格的字节码验证器引入的。
这个问题可以通过禁用Java虚拟机中的验证来解决。
只需右键点击项目,打开上下文菜单,选择“覆盖作为”,然后打开“覆盖率配置”视图。在参数选项卡中,添加-noverify
标志作为VM参数。最后,点击“覆盖率”按钮启动覆盖率计算。
你也可以使用-XX:-UseSplitVerifier
标志,但这仅适用于Java 6和7,因为Java 8不再支持分片验证器。
3. 结论
本文简要介绍了如何在Java项目中使用Cobertura计算代码覆盖率。还描述了如何在Eclipse环境中安装eCobertura的步骤。
Cobertura是一个强大且易于使用的代码覆盖率工具,但由于它目前不如像JaCoCo这样的新工具活跃,所以维护方面稍显不足。
最后,可以在本文提供的示例中查看GitHub项目。