1,什么是代码覆盖率
代码覆盖率是软件测试领域中的一个重要度量指标,用于衡量测试用例对程序源代码的覆盖程度。具体来说,它量化了在执行特定的一组测试用例时,有多少源代码行、分支、条件、函数或方法等被实际执行到了。
- 行覆盖率:指测试用例运行后,源代码中被执行过的语句行数占总语句行数的比例。
- 分支覆盖率(或称决策覆盖率):检查程序中的每一个逻辑分支是否都被至少执行过一次。这意味着不仅要关注每个if语句是否被执行,还要关注其真假分支是否都经过检验。
- 条件覆盖率:针对逻辑表达式中的每个条件(布尔子表达式),确保它们的真值取向都被测试过。
- 方法/函数覆盖率:测试过程中覆盖了多少个方法或函数,即是否每个函数至少被执行了一次。
- 类覆盖率:测试中涉及到的类总数占所有类的比例。
2,常见的代码覆盖率工具
- JaCoCo(Java Code Coverage):专为Java语言设计,轻量级的代码覆盖率工具,可以与Maven、Gradle、Ant等构建工具以及JUnit、TestNG等测试框架无缝集成。
- Cobertura:同样适用于Java代码的覆盖率工具,支持行、分支覆盖率分析,但在JaCoCo出现后逐渐减少使用。
- Istanbul / nyc:主要用于Node.js的JavaScript代码覆盖率工具,能够生成详细的覆盖率报告,支持CommonJS、ES modules等模块系统。
- pytest-cov:Python语言的覆盖率工具,与pytest测试框架集成,可以生成详尽的覆盖率报告。
- gcov/lcov:C和C++语言的覆盖率工具,gcov是GCC的一部分,用于收集代码覆盖率信息,lcov则是一个前端工具,可以生成可视化的HTML报告。
- codecov.io:在线代码覆盖率服务,支持多种语言和框架,常用于整合多个测试工具生成的覆盖率数据并提供统一的报告和分析。
- coverlet:.NET Core平台的代码覆盖率工具,支持多种.NET项目类型。
- gocover:Go语言的覆盖率工具,用于测量和报告Go程序的测试覆盖率。
- RubyCov:Ruby语言的覆盖率工具,用于计算和显示Ruby代码的覆盖率。
- ESLint-plugin-coverage:针对JavaScript和TypeScript的覆盖率检测工具,与ESLint结合使用。
3,jacoco工作原理
目前项目后端使用的是java,所以我们使用jacoco。
- 启动时注入:
•当Java虚拟机(JVM)启动时,通过传递 -javaagent 参数指向JaCoCo的agent JAR文件。
•JVM在启动阶段调用代理程序中的 premain 方法,这个方法是Java Agent的标准入口点。 - 字节码操作代理:
•JaCoCo代理程序在其 premain 方法内部初始化并注册一个类文件转换器(ClassFileTransformer)。
•类文件转换器会在类加载期间收到通知,每当类加载器试图加载一个类的字节码时,转换器都会有机会先对其进行修改。 - 字节码插桩(代理行为):
•转换器会对每一个即将加载的类字节码进行插桩处理,插入相应的监控代码(探针)。
•这个过程就像是类加载的“代理”,因为原本直接加载的类现在经过了一个中间步骤——JaCoCo对其进行了增强。 - 数据收集与追踪:
•插入的探针在运行时会追踪代码的执行情况,例如记录哪些方法被执行、哪些行被访问、哪些分支被跳转等。
•这些信息在运行时实时或结束后被收集并存储起来。 - 报告生成:
•收集到的数据进一步被JaCoCo工具处理成可读的代码覆盖率报告。