核心是配置覆盖率工具在收集阶段忽略第三方路径,而非测试中跳过;Jest用coveragePathIgnorePatterns、Vitest用coverage.exclude、nyc用exclude字段设置过滤规则,排除node_modules等目录,但需仍mock第三方依赖以保障测试隔离与分支覆盖。

在 JS 单元测试中排除第三方工具库的覆盖率统计,核心是让覆盖率工具“看不见”这些文件——不是不加载、不运行,而是不插桩、不计数。这一步必须在覆盖率收集阶段完成,通过工具配置实现,不能靠测试代码里写 if (process.env.TEST) 或手动跳过。
Jest:用 coveragePathIgnorePatterns 过滤路径
在 jest.config.js 中添加正则规则,匹配你要排除的目录或文件类型:
-
node_modules/是必加项,排除所有 npm 包 - 可追加
/dist/、/lib/等构建产物目录 - 加上
.*.d.ts$排除 TypeScript 类型声明文件
示例配置:
module.exports = {
coveragePathIgnorePatterns: [
'<rootdir>/node_modules/',
'<rootdir>/dist/',
'<rootdir>/lib/',
'.*\.d\.ts$'
]
};
Vitest:用 coverage.exclude 设置 glob 模式
Vitest 的配置更贴近现代项目结构,支持通配符语法,推荐直接写明范围:
-
node_modules和dist必须排除 -
**/*.test.*可选,避免把测试文件本身也纳入统计(虽然一般不会) - 若项目有
e2e或scripts目录,也可一并加入
示例(vitest.config.ts):
export default defineConfig({
test: {
coverage: {
exclude: ['node_modules', 'dist', 'e2e', '**/*.test.*']
}
}
});
nyc / Istanbul:用 exclude 字段指定忽略模式
适用于搭配 Mocha、AVA 或自定义脚本的场景,在 .nycrc 或 package.json#nyc 中配置:
- 使用 glob 语法,
node_modules/**比只写node_modules更稳妥 - 可排除测试文件自身(如
**/*.spec.js),防止干扰主逻辑统计 - 注意不要误 exclude 自己的
src/下工具函数——它们属于自有代码
示例(.nycrc):
{
"exclude": [
"node_modules/**",
"dist/**",
"test/**",
"**/*.test.js"
]
}
关键提醒:排除 ≠ 不执行,也不等于不用 mock
即使第三方库被排除在覆盖率之外,你在测试中仍会 import 并调用它(比如 axios.get())。这时必须做两件事:
- 用
jest.mock('axios')或vi.mock('axios')显式模拟,保证测试隔离 - 确保 mock 覆盖所有分支(成功、失败、超时),否则未被 mock 的
catch块可能漏测
排除只是让 axios 内部代码不参与统计,你自己的调用逻辑(比如 await api.fetchUser())依然会被覆盖——这才是真正要关注的部分。


















