Jest 代码覆盖率怎么配置?四个指标分别是什么意思?
Jest 内置了代码覆盖率收集功能,基于 Istanbul(Babel provider)或 V8 引擎实现。运行 jest --coverage 即可生成报告,四种核心指标:**语句覆盖率(Statements)**衡量代码语句执行比例,**分支覆盖率(Branches)**衡量 if/switch 等分支走过了多少,**函数覆盖率(Functions)**统计函数调用比例,**行覆盖率(Lines)**统计代码行执行比例。四个指标中分支覆盖率通常最低,也最值得重点关注——因为未覆盖的分支意味着逻辑路径没被测到。配置方面,collectCoverageFrom 控制统计范围,coverageThreshold 设置门槛,coverageReporters 选择输出格式(text 控制台、lcov 给 CI、html 可视化浏览)。阈值支持全局和按文件/目录设置,还能用负数表示"最多允许 N 个未覆盖项"。
追问
Statements 和 Lines 有什么区别?不都是行吗?
不是。一行代码可以包含多条语句,比如 let a = 1, b = 2; 是一条行但两条语句。反过来,一条 if 判断如果跨行书写,行覆盖率可能覆盖了但分支没覆盖。实际项目中这两个数字通常很接近,差异大说明代码风格比较紧凑。
覆盖率到了 100% 就说明测试充分吗?
不是。覆盖率只衡量"有没有被执行过",不衡量"有没有被正确验证"。比如一个函数返回值你从没断言,但函数被调用了,语句覆盖率照样算通过。另外边界值、异常路径、并发场景这些覆盖率工具本身很难捕捉。80% 是常见基线,核心模块可以要求更高。
babel provider 和 v8 provider 怎么选?
Babel provider 是默认选项,通过代码插桩(instrumentation)收集覆盖率,支持 /* istanbul ignore next */ 跳过指定行。V8 provider 利用 V8 引擎原生覆盖率 API,速度更快但不支持 Istanbul 忽略注释(改用 /* c8 ignore next */)。大型项目如果 Babel provider 跑覆盖率太慢,可以试 coverageProvider: "v8",但注意 V8 provider 是实验性功能,输出精度在某些边界场景有差异。
CI 里覆盖率检查不通过怎么排查?
先看 HTML 报告里标红的文件,重点看分支覆盖——很多是 else 分支或三元表达式的某一端没走到。常见原因:错误处理路径没测、环境判断(if (process.env.NODE_ENV === "production"))在测试环境走不到、死代码没排除。用 collectCoverageFrom 排除配置文件和类型定义,用负数阈值给特定模块放宽限制,比如 { "./src/legacy/**/*.js": { statements: -20 } } 允许老代码最多 20 个语句未覆盖。
写段代码
javascript// jest.config.js module.exports = { collectCoverage: true, coverageProvider: "v8", // 或 "babel" collectCoverageFrom: [ "src/**/*.{js,ts}", "!src/**/*.d.ts", "!src/index.ts", ], coverageThreshold: { global: { branches: 80, functions: 80, lines: 80, statements: 80 }, "./src/core/**/*.ts": { branches: 90 }, // 核心模块更严格 }, coverageReporters: ["text-summary", "lcov", "html"], };