JavaScript项目中测试覆盖率白名单本质是限定参与统计的源码路径,如Jest用collectCoverageFrom、Vitest用coverage.include、c8用--include,只计入指定src子目录的.js/.ts文件,排除类型定义、mock等无关文件。

在 JavaScript 项目中,通过测试覆盖率工具(如 jest 或 c8)配置白名单过滤,本质是告诉覆盖率收集器:**只统计指定路径或模块的代码覆盖情况**,忽略第三方库、类型定义、配置文件等无关代码。关键不在“过滤测试文件”,而在“过滤被测源码文件”。
明确白名单目标:只统计你关心的源码
覆盖率白名单(include)不是限制哪些测试文件运行,而是限定哪些 .js/.ts 源文件参与覆盖率计算。例如,你只想看 src/utils/ 和 src/components/ 下的覆盖情况,其他一律不计入。
- Jest 中用
collectCoverageFrom配合include数组 - c8(Node.js 原生覆盖率)用
--includeCLI 参数或配置中的include字段 - Vitest 使用
coverage.include选项(v1.0+)
Jest:在 jest.config.js 中设置 collectCoverageFrom
这是最常用方式。注意:collectCoverageFrom 的路径是相对于项目根目录的 glob 模式,且默认已排除 node_modules 和测试文件(**/*.test.* 等),你只需聚焦源码白名单:
module.exports = {
collectCoverage: true,
collectCoverageFrom: [
"src/**/*.{js,jsx,ts,tsx}",
"!src/**/*.d.ts",
"!src/**/index.ts", // 可选:排除导出入口
],
coverageDirectory: "coverage",
coverageReporters: ["html", "lcov", "text-summary"],
};
✅ 有效写法示例:
立即学习“Java免费学习笔记(深入)”;
-
"src/utils/**/*.{js,ts}"—— 仅统计 utils 目录 -
"src/{api,models}/**/*.{js,ts}"—— 白名单多个子目录 -
"!src/**/__mocks__/**"—— 排除 mock 文件(即使它在 src 下)
Vitest 或 c8:按需启用 include 模式
Vitest(v1.0+)在 vitest.config.ts 中配置:
export default defineConfig({
test: {
coverage: {
enabled: true,
include: ["src/**/*.{js,ts}"],
exclude: ["src/**/*.d.ts", "src/**/test-utils.ts"],
provider: "c8", // 或 "istanbul"
}
}
});
c8(单独使用时)命令行示例:
npx c8 --include="src/**/*.{js,ts}" --exclude="**/*.d.ts" npm test
⚠️ 注意:c8 的 --include 是“必须匹配至少一个模式才纳入”,未匹配的文件直接跳过,不报错也不统计。
验证白名单是否生效
生成覆盖率报告后,打开 coverage/lcov-report/index.html,检查左侧文件树是否只包含你预期的目录。如果看到 node_modules 或 dist/,说明 include 规则没覆盖到位,或你误用了 coveragePathIgnorePatterns(那是黑名单,和白名单逻辑相反)。建议优先用 include,再辅以 exclude 收尾清理。
不复杂但容易忽略:白名单路径必须存在可读的源码文件,如果写成 "src/features/**" 但该目录实际叫 src/feature,就不会命中任何文件,导致覆盖率显示为 0。


















