Skip to main content
Bun 的测试运行器内置了代码覆盖率报告。使用它可以了解你的测试覆盖了多少代码库,并发现未测试的代码。

启用覆盖率

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
读取 LCOV 格式的工具和服务包括:
  • 代码编辑器:VS Code 扩展可以内联显示覆盖率
  • CI/CD 服务:GitHub Actions、GitLab CI、CircleCI
  • 覆盖率服务:Codecov、Coveralls
  • IDE:WebStorm、IntelliJ IDEA

在 GitHub Actions 中使用 LCOV

.github/workflows/test.yml

从覆盖率中排除文件

跳过测试文件

默认情况下,覆盖率报告排除测试文件。要包含它们:
bunfig.toml
coverageSkipTestFilestrue(默认值)时,匹配测试模式的文件(例如 *.test.ts*.spec.js)会被排除在覆盖率报告之外。

忽略特定路径和模式

coveragePathIgnorePatterns 从覆盖率报告中排除特定文件或文件模式:
bunfig.toml
该选项接受 glob 模式,工作方式类似于 Jest 的 collectCoverageFrom 忽略模式。匹配任一模式的文件将从文本和 LCOV 输出的覆盖率计算和报告中排除。

常见用例

bunfig.toml

源码映射

Bun 默认会转译所有文件,生成一个内部源码映射,将原始源代码行映射到 Bun 的内部表示。要禁用此功能,请将 test.coverageIgnoreSourcemaps 设置为 true;除非在高级用例中,否则很少需要这样做。
bunfig.toml
使用此选项时,你可能需要在源文件顶部添加 // @bun 注释以退出转译过程。

覆盖率默认值

默认情况下,覆盖率报告:
  • 排除 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

覆盖率报告不准确

如果你看到的覆盖率报告与预期不符:
  1. 检查源码映射是否正常工作
  2. 验证 coveragePathIgnorePatterns 中的文件模式
  3. 确保测试文件确实在导入要测试的代码

大型代码库的性能问题

对于大型项目,收集覆盖率可能会拖慢测试:
bunfig.toml
考虑仅在 CI 或特定分支上运行覆盖率,而不是在开发期间的每次测试运行时都运行。