代码覆盖率是衡量测试中源代码执行程度的指标,不反映测试质量;JavaScript常用Istanbul(nyc)或Jest生成报告,含语句、分支、函数、行四种覆盖率,各自统计维度不同,应结合业务风险设定合理目标。

代码覆盖率是衡量测试用例执行时,源代码被覆盖程度的量化指标,它不表示测试质量高低,而是反映“哪些代码被运行过”。在 JavaScript 中,常借助工具如 JaCoCo(配合 Node.js 环境较少)、Istanbul(nyc)或 Jest 内置报告 来生成覆盖率数据。
语句覆盖率(Statement Coverage)
统计已执行的语句占全部可执行语句的比例。JS 中每条带实际逻辑的语句(如赋值、return、throw、函数调用等)都算一个语句单位;声明(var/let/const 单独一行无初始化)、空行、纯注释不计入。
- 例如:
if (x > 0) console.log('ok');这一行是一个语句;console.log('ok');单独一行也是一个语句 - 100% 语句覆盖率 ≠ 所有分支都被测到,比如 if 块只走 true 分支,false 分支未执行,仍可能达到 100% 语句覆盖(若 else 为空或不存在)
分支覆盖率(Branch Coverage)
衡量所有控制流分支(如 if/else、三元运算符、switch case、逻辑与/或短路路径)是否都被执行过。每个分支出口(true/false、case/default)都算一个独立分支目标。
- 例如:
if (a && b) {...}至少需要两组输入:一组让a && b为真,另一组让它为假(如 a=true, b=false 或 a=false, b=任意) - switch 语句中每个 case 和 default 都要触发一次才算完整分支覆盖
函数覆盖率(Function Coverage)
检查项目中定义的所有函数(包括箭头函数、方法、构造函数等)是否至少被调用过一次。
- 注意:函数声明本身不触发覆盖,必须执行到函数体内部第一行才计为“已覆盖”
- 类中的 getter/setter、原型方法、模块顶层函数均纳入统计
- 未导出的私有辅助函数也参与计算,除非工具配置了忽略规则
行覆盖率(Line Coverage)
以源码行为单位统计,只要某一行中至少有一个可执行语句被执行,整行即视为“已覆盖”。它是最粗粒度、最容易达成但信息量最少的指标。
- 常见误区:一行含多个语句(如
a = 1; b = 2;),只要其中任一执行,整行就标绿 - 空行、仅含注释或仅含花括号的行不参与统计
- Jest 默认 HTML 报告里显示的就是行覆盖率(line),但它背后依赖语句和分支的实际执行情况
四个指标通常并列展示,理想目标不是盲目追求 100%,而是结合业务风险识别未覆盖的关键路径。比如支付逻辑的分支覆盖比工具函数的语句覆盖更值得优先保障。


















