jest 可通过 package.json 的 jest.coveragethreshold 字段设置覆盖率阈值以拦截低质量代码,支持 global、路径或 glob 模式分级配置 branches/functions/lines/statements 四类指标,按最长匹配优先级生效,需配合 --coverage 参数使用。

在 Jest 中,可以通过 package.json 的 jest.coverageThreshold 字段设置覆盖率阈值,当实际覆盖率低于设定值时,测试会失败(退出码非 0),从而拦截低质量代码提交或构建。
配置 coverageThreshold 字段
在 package.json 的 jest 配置块中添加 coverageThreshold,支持按全局、文件路径或 glob 模式分别设定最低要求:
-
全局阈值:对所有文件统一要求,用
global键 -
路径/模式阈值:用具体路径(如
"src/utils/")或 glob(如"src/**.test.js")指定范围 -
维度细分:每个范围下可设
branches、functions、lines、statements四类指标,单位为百分比数字(不带 % 符号)
示例配置:
{
"jest": {
"coverageThreshold": {
"global": {
"branches": 80,
"functions": 85,
"lines": 90,
"statements": 90
},
"src/components/": {
"lines": 75
},
"src/**.test.js": {
"statements": 100
}
}
}
}
注意匹配逻辑和优先级
覆盖率检查按“最精确匹配”生效。Jest 会依次查找:
- 完全匹配的文件路径 →
- 最长前缀匹配的目录(如 src/components/Button.js 匹配 "src/components/")→
- global 作为兜底。
- 若某文件同时命中多个规则(如
src/components/Button.test.js同时满足"src/components/"和"src/**.test.js"),Jest 使用 最长 glob 模式(即"src/**.test.js")的配置 - 未显式配置的维度默认不限制(即允许 0%)
配合 CI 或 pre-commit 使用
仅靠配置不会自动拦截,需确保测试命令启用覆盖率收集:
- 运行测试时加
--coverage参数(如jest --coverage) - CI 脚本或 husky pre-commit 钩子中调用该命令,利用其非零退出码中断流程
- 推荐在
package.json#scripts中定义明确脚本:"test:ci": "jest --coverage --ci --passWithNoTests"
调试与验证技巧
遇到阈值未触发或误报,可:
- 加
--coverageReporters=html生成 HTML 报告,直观查看各文件真实覆盖率 - 用
jest --coverage --collectCoverageFrom="src/**/*.{js,ts}"显式指定统计范围,避免遗漏 - 临时加
--verbose查看 Jest 是否识别到 threshold 配置(启动日志会打印 “coverage threshold config”)











