Cobertura 简介
1. 概述
在本文中,我们将演示使用**Cobertura 生成代码覆盖率报告**的几个方面。
简单地说,Cobertura 是一个报告工具,用于计算代码库的测试覆盖率——Java 项目中单元测试访问的分支/行的百分比。
2. Maven 插件
2.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 样式报告,显示通过代码检测收集的代码覆盖率统计信息:
行覆盖率指标显示在单元测试运行中执行了多少语句,而分支覆盖率指标侧重于这些测试覆盖了多少分支。
对于每个条件,你有两个分支,所以基本上,你最终会拥有两倍于条件的分支。
复杂性因素反映了代码的复杂性——当代码中的分支数量增加时它会上升。
理论上,您拥有的分支越多,您需要实施的测试就越多,以提高分支覆盖率分数。
2.2. 配置代码覆盖率计算和检查
您可以使用ignores和excludes标记从代码检测中忽略/排除一组特定的类:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<instrumentation>
<ignores>
<ignore>com/blogdemo/algorithms/dijkstra/*</ignore>
</ignores>
<excludes>
<exclude>com/blogdemo/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.blogdemo.algorithms.dijkstra.*</pattern>
<branchRate>60</branchRate>
<lineRate>50</lineRate>
</regex>
</regexes>
</check>
</configuration>
使用haltOnFailure标志时,如果指定的检查之一失败,Cobertura 将导致构建失败。
branchRate/lineRate标记指定代码检测后所需的最低可接受分支/线路覆盖率分数。可以使用packageLineRate/packageBranchRate标签将这些检查扩展到包级别。
还可以使用regex标记为名称遵循特定模式的类声明特定规则检查。在上面的示例中,我们确保com.blogdemo.algorithms.dijkstra包及以下包中的类必须达到特定的行/分支覆盖率分数。
3. Eclipse 插件
3.1. 安装
Cobertura 也可用作名为eCobertura的 Eclipse 插件。为了安装eCobertura for Eclipse,您需要按照以下步骤安装 Eclipse 3.5 或更高版本:
第 1 步:从 Eclipse 菜单中,选择Help→Install New Software。然后,在work中,输入http://ecobertura.johoop.de/update/ :
第 2 步:选择eCobertura Code Coverage,单击“下一步”,然后按照安装向导中的步骤进行操作。
现在已安装eCobertura ,重新启动 Eclipse 并在Windows → Show View → Other → Cobertura下显示覆盖会话视图。
3.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 插件文件夹中。
这可以通过从*%ECLIPSE_HOME%/plugins中删除文件夹 org.junit.*** 来完成,然后从与eCobertura*兼容的旧 Eclipse 安装中复制相同的文件夹。
完成后,重新启动 Eclipse IDE 并使用相应的更新站点重新安装插件。
3.3. Eclipse 中的代码覆盖率报告
为了通过单元测试计算代码覆盖率,右键单击您的项目/测试以打开上下文菜单,然后选择选项Cover As → JUnit Test。
在Coverage Session视图下,您可以检查每个类的行/分支覆盖率报告:
Java 8 用户在计算代码覆盖率时可能会遇到一个常见错误:
java.lang.VerifyError: Expecting a stackmap frame at branch target ...
在这种情况下,Java 抱怨某些方法没有正确的堆栈映射,因为在较新版本的 Java 中引入了更严格的字节码验证器。
此问题可以通过在 Java 虚拟机中禁用验证来解决。
为此,请右键单击您的项目以打开上下文菜单,选择Cover As,然后打开Coverage Configurations视图。在参数选项卡中,添加*-noverify标志作为 VM 参数。最后,点击coverage *按钮启动覆盖率计算。
您也可以使用标志*-XX:-UseSplitVerifier*,但这仅适用于 Java 6 和 7,因为 Java 8 不再支持拆分验证器。