Contents

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 样式报告,显示通过代码检测收集的代码覆盖率统计信息:

/uploads/cobertura/1.png

行覆盖率指标显示在单元测试运行中执行了多少语句,而分支覆盖率指标侧重于这些测试覆盖了多少分支

对于每个条件,你有两个分支,所以基本上,你最终会拥有两倍于条件的分支。

复杂性因素反映了代码的复杂性——当代码中的分支数量增加时它会上升。

理论上,您拥有的分支越多,您需要实施的测试就越多,以提高分支覆盖率分数。

2.2. 配置代码覆盖率计算和检查

您可以使用ignoresexcludes标记从代码检测中忽略/排除一组特定的类:

<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 菜单中,选择HelpInstall New Software。然后,在work中,输入http://ecobertura.johoop.de/update/

/uploads/cobertura/3.png

第 2 步:选择eCobertura Code Coverage,单击“下一步”,然后按照安装向导中的步骤进行操作。

现在已安装eCobertura ,重新启动 Eclipse 并在Windows → Show View → Other → Cobertura下显示覆盖会话视图。

/uploads/cobertura/5.png

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视图下,您可以检查每个类的行/分支覆盖率报告:

/uploads/cobertura/7.png

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 不再支持拆分验证器。