Jacoco Agent 测量任何测试的代码覆盖率

Jacoco 代码覆盖率库概述

Jacoco 是一个开源的 Java 代码覆盖率库,遵循 Eclipse 公共许可证发布。它通常用于测量 Java 项目中的单元测试或集成测试的覆盖率,但也可以通过 Jacoco 代理测量运行中应用程序的任何测试覆盖率。

使用 Jacoco 的步骤

  1. 下载和配置

    • Jacoco 官网 下载最新版本的 zip 文件并解压。
    • lib 目录中的 jacocoagent.jarjacococli.jar 文件放置在项目的根目录或其他已知目录。
  2. 示例应用

    • 使用一个简单的 Spring Boot 控制器类来演示 Jacoco 代理的使用。该控制器包含一个 GET 和一个 POST 端点。
  3. 启动应用并附加 Jacoco 代理

    • 使用以下命令启动 Java 应用并附加 Jacoco 代理:

      java -javaagent:jacocoagent.jar=destfile=target/jacoco.exec,append=false,
          includes=com.example.* -jar target/jacoco-agent-0.0.1-SNAPSHOT.jar
    • 其中,destfile 参数指定覆盖率结果文件,append=false 表示每次启动应用时重新创建该文件,includes=com.example.* 用于仅测量示例项目的覆盖率。
  4. 测试应用

    • 通过浏览器或命令行测试应用的 /car 端点,覆盖率文件 target/jacoco.exec 会在应用停止时自动写入。
  5. 生成可读的覆盖率报告

    • 使用 Jacoco 的命令行接口工具将覆盖率文件转换为 HTML 页面或 XML 报告:

      java -javaagent:jacocoagent.jar=destfile=target/jacoco.exec,append=false,
          includes=com.example.* -jar target/jacoco-agent-0.0.1-SNAPSHOT.jar
    • 生成的 HTML 报告可以在浏览器中查看,XML 报告可以导入 SonarQube 等工具。

覆盖率报告分析

  • 总体覆盖率:通过浏览器打开 index.html 文件,可以查看应用的总体代码覆盖率。
  • 类级别覆盖率:点击 com.example 包,可以查看应用中各个类的覆盖率。
  • 方法级别覆盖率:点击具体类(如 CarRestController),可以查看该类中每个方法的覆盖率。
  • 代码行覆盖率:点击具体方法,可以查看该方法的代码行覆盖率。例如,addCar() 方法由于未发送 POST 请求,未被覆盖。

Jacoco 代理的应用场景

  • 系统测试覆盖率:可以用于测量系统测试、性能测试、功能测试等的覆盖率。
  • 检测死代码:通过功能测试覆盖率,可以识别潜在的未使用代码。
  • 第三方库覆盖率:测量外部库、框架甚至 Java 本身的代码覆盖率,帮助评估其实际使用情况。
  • 用户交互覆盖率:在验收或生产环境中测量真实用户交互的代码覆盖率,但可能会影响应用性能。

参考资料

  • Sebastian Daschner(Fairsource 联合创始人兼 CTO)的 博客视频 提供了关于 Jacoco 代理的详细解释。
阅读 61
0 条评论