想要对 Java 项目进行代码覆盖率的测试,很容易就找到 JaCoCo 这个开源代码覆盖率分析工具是众多工具中最后欢迎的哪一个。
本篇仅仅是在学习 JaCoCo 时对其实现设计文档 https://www.jacoco.org/jacoco/trunk/doc/implementation.html 的粗略翻译。
实现设计(Implementation Design)
这是实现设计决策的一个无序列表,每个主题都试图遵循这样的结构:
- 问题陈述
- 建议的解决方案
- 选择和讨论
覆盖率分析机制(Coverage Analysis Mechanism)
覆盖率信息必须在运行时收集。为此,JaCoCo 创建原始类定义的插装版本,插装过程发生在加载类期间使用一个叫做 Java agents 动态地完成。
有几种收集覆盖率信息的不同方法。每种方法都有不同的实现技术。下面的图表给出了 JaCoCo 使用的技术的概述:
字节码插装非常快,可以用纯 Java 实现,并且可以与每个 Java VM 一起工作。可以将带有 Java 代理钩子的动态插装添加到 JVM 中,而无需对目标应用程序进行任何修改。
Java 代理钩子至少需要 1.5 个 JVMs。用调试信息(行号)编译的类文件允许突出显示源代码。不幸的是,一些 Java 语言结构被编译成字节代码,从而产生意外的突出显示结果,特别是在使用隐式生成的代码时(如缺省构造函数或 finally 语句的控制结构)。