概述

本文将演示如何使用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风格报告,展示通过代码插桩收集的代码覆盖率统计信息:

cob-e1485730773190

行覆盖率指标显示单元测试运行时执行了多少语句,而分支覆盖率指标则关注这些测试覆盖了多少分支。

对于每个条件,你有两个分支,所以总的分支数通常是条件数的两倍。

复杂性因素反映了代码的复杂程度,当代码中的分支数量增加时,复杂度也会提高。

理论上,分支越多,就需要编写更多的测试来提高分支覆盖率得分。

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

你可以使用ignoreexclude标签忽略或排除特定类的代码插桩:

<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/*

cob3-e1485814235220

步骤2: 选择eCobertura代码覆盖率,点击“下一步”,然后按照安装向导中的步骤进行操作。

eCobertura安装完成后,重启Eclipse,在窗口显示视图其他Cobertura下显示覆盖率会话视图。

cob3-e1485814235220-1

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测试”。

在“覆盖率会话”视图中,可以查看每个类的行/分支覆盖率报告:

Sans-titre-e1487178259898

使用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项目