Jacoco

本文介绍了开源Java覆盖率工具Jacoco,它使用灵活,可嵌入Ant、Maven等,还被sonar、Jenkins等集成。阐述了其基本概念,如行、类、分支等覆盖率统计。详细说明了Maven配置方法,包括添加依赖、插件配置,最后介绍了执行结果查看和注意Java版本一致的事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Jacoco概述

        JaCoCo 是一个开源的覆盖率工具,它针对的开发语言是 java,其使用方法很灵活,可以嵌入到 Ant、Maven 中;可以作为 Eclipse 插件,可以使用其 JavaAgent 技术监控 Java 程序等等。

        很多第三方的工具提供了对 JaCoCo 的集成,如 sonar、Jenkins 等。

        JaCoCo 包含了多种尺度的覆盖率计数器,包含指令级覆盖(Instructions,C0coverage),分支(Branches,C1coverage)、圈复杂度(CyclomaticComplexity)、行覆盖(Lines)、方法覆盖(non-abstract methods)、类覆盖(classes)。

二、JaCoCo 基本概念

jacoco 支持多种覆盖率的统计,包括:

  • 行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
  • 类覆盖率:度量计算 class 类文件是否被执行。
  • 分支覆盖率:度量 if 和 switch 语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。
  • 方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
  • 指令覆盖:计数单元是单个 java 二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全 独立源码格式。
  • 圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。

三、Maven 配置 Jacoco

3.1 添加依赖

<!-- jacoco -->
<dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.11</version>
</dependency>

3.2 插件配置

<!-- jacoco 插件配置 -->
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.11</version>
    <executions>
        <execution>
            <id>jacoco-initialize</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>check</id>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
        <execution>
            <id>jacoco-site</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>
  • 设定覆盖率检测的文件范围,configuration 加在 plugin 标签里,executions 外
<configuration>
    <includes>
        <!-- 对包含***的路径的测试类进行统计 -->
        <include>com/unit/test/**</include>
    </includes>
    <excludes>
        <!-- 排除包路径中包含***的测试类进行jacoco统计 -->
        <exclude></exclude>
    </excludes>
</configuration>

表示对指定目录下的包进行覆盖率测试,com/**/*表示对 com 下的所有文件进行覆盖率测试

  • 你也可以这样排除一个包和它的所有子包/子包:
<exclude>com/**/*</exclude>
  • 通配符语法

*   Match zero or more characters
**  Match zero or more directories
?   Match a single character

  • 指定覆盖规则
<configuration>
          <!-- rules裏面指定覆蓋規則 -->
          <rules>
            <rule implementation="org.jacoco.maven.RuleConfiguration">
              <element>BUNDLE</element>
              <limits>  
                <!-- 指定方法覆蓋到50% -->
                <limit implementation="org.jacoco.report.check.Limit">
                  <counter>METHOD</counter>
                  <value>COVEREDRATIO</value>
                  <minimum>0.50</minimum>
                </limit>
                <!-- 指定分支覆蓋到50% -->
                <limit implementation="org.jacoco.report.check.Limit">
                  <counter>BRANCH</counter>
                  <value>COVEREDRATIO</value>
                  <minimum>0.50</minimum>
                </limit>
                <!-- 指定類覆蓋到100%,不能遺失任何類 -->
                <limit implementation="org.jacoco.report.check.Limit">
                  <counter>CLASS</counter>
                  <value>MISSEDCOUNT</value>
                  <maximum>0</maximum>
                </limit>
              </limits>
            </rule>
          </rules>
</configuration>

        指定覆盖规则,只有在中配置了 check 才会生效,不满足覆盖条件的情况下 mvn install 命令将会执行失败

        在执行 mvn 命令时,加上“org.jacoco:jacoco-maven-plugin:{版本号}:prepare-agent”参数即可。

示例:

mvn clean test org.jacoco:jacoco-maven-plugin:0.8.11:prepare-agent install -'Dmaven.test.failure.ignore'=true -e -X

【-Dmaven.test.failure.ignore=true】建议加上,否则如果单元测试失败,就会直接中断,不会产生.exec 文件

四、执行结果

执行完毕后,打开target/site/jacoco,效果如下

用浏览器打开index.html,即可看到各个文件的行和分支覆盖情况

五、注意事项

注意:确保各个地方Java版本一致

### 使用 JaCoCo 进行代码覆盖率转储 JaCoCo 是一款广泛使用的 Java 代码覆盖率库,能够帮助开发者评估测试套件的有效性和质量。为了实现代码覆盖率的转储,通常会采用两种主要方法:通过 JVM 参数启动代理以及利用 Ant 或 Maven 插件。 #### 方法一:JVM 启动参数配置 当应用程序运行时可以通过设置特定的 JVM 参数来启用 JaCoCo 的监控功能: ```bash -javaagent:path/to/jacocoagent.jar=destfile=path/to/coverage.exec,includes=com.example.* ``` 这段命令中的 `javaagent` 参数指定了 JaCoCo agent JAR 文件的位置,并定义了输出报告的目标路径和要包含在内的包名前缀[^1]。 #### 方法二:Maven 插件集成 对于基于 Maven 构建的应用程序来说,可以在项目的 POM 文件里加入如下插件声明以便更方便地管理依赖关系并自动生成覆盖率报告: ```xml <build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>${jacoco.version}</version> <executions> <!-- 配置准备阶段的任务 --> <execution> <id>pre-unit-test</id> <goals><goal>prepare-agent</goal></goals> </execution> <!-- 执行单元测试后的操作 --> <execution> <id>post-unit-test</id> <phase>test</phase> <goals><goal>report</goal></goals> </execution> </executions> </plugin> </plugins> </build> ``` 上述 XML 片段展示了如何在构建生命周期的不同阶段触发相应的 JaCoCo 动作——即准备工作(如注入字节码转换器)和生成最终的结果报表[^2]。 #### 命令行工具使用说明 除了以上提到的方式外,还可以直接调用 JaCoCo 提供的 CLI 工具来进行手动控制。例如,可以使用下面这条指令完成一次完整的覆盖率测量过程: ```shell java -jar jacococli.jar report path/to/execution-data-file --classfiles path/to/classes --sourcefiles src/main/java --html output/directory ``` 此命令将会读取指定位置上的执行数据文件(.exec),解析对应的类文件及其源代码文件夹,最后将分析结果导出成 HTML 格式的可视化页面存放在给定目录下[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值