启用覆盖率
bun:test 可以报告你的测试覆盖了哪些代码行。传递 --coverage 可以将覆盖率报告打印到控制台:
terminal
默认启用
要默认启用覆盖率报告,请将此内容添加到你的bunfig.toml:
bunfig.toml
bunfig.toml 中配置。
bunfig.toml
覆盖率阈值
在bunfig.toml 中设置覆盖率阈值。如果你的测试套件未达到或超过该阈值,bun test 会以非零退出码退出。
简单阈值
bunfig.toml
详细阈值
bunfig.toml
fail_on_low_coverage,如果覆盖率低于阈值,则导致测试运行失败。
覆盖率报告器
默认情况下,Bun 将覆盖率报告打印到控制台。 要为 CI 或其他工具保存报告,请在命令行传递--coverage-reporter=lcov 或在 bunfig.toml 中设置 coverageReporter。
bunfig.toml
可用的报告器
LCOV 覆盖率报告器
lcov 报告器将lcov.info 文件写入覆盖率目录。
bunfig.toml
terminal
- 代码编辑器:VS Code 扩展可以内联显示覆盖率
- CI/CD 服务:GitHub Actions、GitLab CI、CircleCI
- 覆盖率服务:Codecov、Coveralls
- IDE:WebStorm、IntelliJ IDEA
在 GitHub Actions 中使用 LCOV
.github/workflows/test.yml
从覆盖率中排除文件
跳过测试文件
默认情况下,覆盖率报告排除测试文件。要包含它们:bunfig.toml
coverageSkipTestFiles 为 true(默认值)时,匹配测试模式的文件(例如 *.test.ts、*.spec.js)会被排除在覆盖率报告之外。
忽略特定路径和模式
coveragePathIgnorePatterns 从覆盖率报告中排除特定文件或文件模式:
bunfig.toml
collectCoverageFrom 忽略模式。匹配任一模式的文件将从文本和 LCOV 输出的覆盖率计算和报告中排除。
常见用例
bunfig.toml
源码映射
Bun 默认会转译所有文件,生成一个内部源码映射,将原始源代码行映射到 Bun 的内部表示。要禁用此功能,请将test.coverageIgnoreSourcemaps 设置为 true;除非在高级用例中,否则很少需要这样做。
bunfig.toml
覆盖率默认值
默认情况下,覆盖率报告:- 排除
node_modules目录 - 排除使用非 JS/TS 加载器加载的文件(例如
.css、.txt),除非指定了自定义 JS 加载器 - 排除测试文件本身(可以通过
coverageSkipTestFiles = false包含) - 可以通过
coveragePathIgnorePatterns排除其他文件
高级配置
自定义覆盖率目录
bunfig.toml
多个报告器
bunfig.toml
带特定测试模式的覆盖率
terminal
CI/CD 集成
GitHub Actions 示例
.github/workflows/coverage.yml
GitLab CI 示例
.gitlab-ci.yml
解读覆盖率报告
文本输出说明
- % Funcs:测试期间被调用的函数百分比
- % Lines:测试期间执行的可执行代码行百分比
- Uncovered Line #s:从未被执行的行号
目标值参考
- 80%+ 整体覆盖率:通常认为良好
- 90%+ 关键路径:重要业务逻辑应充分测试
- 100% 工具函数:纯函数和工具函数易于完整测试
- UI 组件覆盖率较低:通常可接受,因为它们可能需要集成测试
最佳实践
关注质量而非数量
test.ts
测试边界情况
test.ts
使用覆盖率发现缺失的测试
terminal
结合其他质量指标
覆盖率只是一个指标。同时还要考虑:- 代码审查质量
- 集成测试覆盖
- 错误处理测试
- 性能测试
- 类型安全
故障排除
某些文件未显示覆盖率
如果文件未出现在覆盖率报告中,你的测试可能没有导入它们。覆盖率仅跟踪已加载的文件。test.ts
覆盖率报告不准确
如果你看到的覆盖率报告与预期不符:- 检查源码映射是否正常工作
- 验证
coveragePathIgnorePatterns中的文件模式 - 确保测试文件确实在导入要测试的代码
大型代码库的性能问题
对于大型项目,收集覆盖率可能会拖慢测试:bunfig.toml