Bun

代码覆盖率

Bun 的测试运行器现在支持内置的代码覆盖率报告。这使得查看测试覆盖了多少代码库以及找到当前未充分测试的区域变得很容易。

启用覆盖率

bun:test 支持查看哪些代码行被测试覆盖。要使用此功能,请将 --coverage 传递给 CLI。它将在控制台打印一份覆盖率报告。

$ bun test --coverage
-------------|---------|---------|-------------------
File         | % Funcs | % Lines | Uncovered Line #s
-------------|---------|---------|-------------------
All files    |   38.89 |   42.11 |
 index-0.ts  |   33.33 |   36.84 | 10-15,19-24
 index-1.ts  |   33.33 |   36.84 | 10-15,19-24
 index-10.ts |   33.33 |   36.84 | 10-15,19-24
 index-2.ts  |   33.33 |   36.84 | 10-15,19-24
 index-3.ts  |   33.33 |   36.84 | 10-15,19-24
 index-4.ts  |   33.33 |   36.84 | 10-15,19-24
 index-5.ts  |   33.33 |   36.84 | 10-15,19-24
 index-6.ts  |   33.33 |   36.84 | 10-15,19-24
 index-7.ts  |   33.33 |   36.84 | 10-15,19-24
 index-8.ts  |   33.33 |   36.84 | 10-15,19-24
 index-9.ts  |   33.33 |   36.84 | 10-15,19-24
 index.ts    |  100.00 |  100.00 |
-------------|---------|---------|-------------------

要始终默认启用覆盖率报告,请在您的 bunfig.toml 文件中添加以下行:

[test]

# always enable coverage
coverage = true

默认情况下,覆盖率报告将包含测试文件并排除源映射。这通常是您想要的,但可以在 bunfig.toml 中进行配置。

[test]
coverageSkipTestFiles = true       # default false

覆盖率阈值

可以在 bunfig.toml 中指定覆盖率阈值。如果您的测试套件未达到或超过此阈值,bun test 将以非零退出码退出,以指示失败。

[test]

# to require 90% line-level and function-level coverage
coverageThreshold = 0.9

# to set different thresholds for lines and functions
coverageThreshold = { lines = 0.9, functions = 0.9, statements = 0.9 }

设置任何这些阈值都会启用 fail_on_low_coverage,导致测试运行在覆盖率低于阈值时失败。

源映射

内部,Bun 默认会转译所有文件,因此 Bun 会自动生成一个内部 源映射,将您的原始源代码行映射到 Bun 的内部表示。如果出于任何原因您想禁用此功能,请将 test.coverageIgnoreSourcemaps 设置为 true;在高级用例之外,这很少是可取的。

[test]
coverageIgnoreSourcemaps = true   # default false

从覆盖率中排除文件

跳过测试文件

默认情况下,测试文件本身包含在覆盖率报告中。您可以使用以下方法排除它们:

[test]
coverageSkipTestFiles = true   # default false

这将从覆盖率报告中排除匹配测试模式(例如,_.test.ts,__spec.js)的文件。

忽略特定的路径和模式

您可以使用 coveragePathIgnorePatterns 排除特定的文件或文件模式,使其不被包含在覆盖率报告中。

[test]
# Single pattern
coveragePathIgnorePatterns = "**/*.spec.ts"

# Multiple patterns
coveragePathIgnorePatterns = [
  "**/*.spec.ts",
  "**/*.test.ts",
  "src/utils/**",
  "*.config.js"
]

此选项接受 glob 模式,其工作方式类似于 Jest 的 collectCoverageFrom 忽略模式。匹配任何这些模式的文件将被排除在文本和 LCOV 输出的覆盖率计算和报告之外。

常见用例

  • 排除工具文件: "src/utils/**"
  • 排除配置文件: "*.config.js"
  • 排除特定的测试模式: "**/*.spec.ts"
  • 排除构建工件: "dist/**"

覆盖率默认设置

默认情况下,覆盖率报告

  1. 排除 node_modules 目录
  2. 排除通过非 JS/TS 加载器加载的文件(例如,.css、.txt),除非指定了自定义 JS 加载器
  3. 包含测试文件本身(可以通过 coverageSkipTestFiles = true 禁用,如上所示)
  4. 可以使用 coveragePathIgnorePatterns 排除其他文件(如上所示)

覆盖率报告器

默认情况下,覆盖率报告将打印到控制台。

要在 CI 环境中使用持久的代码覆盖率报告,或者与其他工具集成,您可以传递 --coverage-reporter=lcov CLI 选项,或者在 bunfig.toml 中配置 coverageReporter 选项。

[test]
coverageReporter  = ["text", "lcov"]  # default ["text"]
coverageDir = "path/to/somewhere"  # default "coverage"
报告器描述
text将覆盖率的文本摘要打印到控制台。
lcovlcov 格式保存覆盖率。

lcov 覆盖率报告器

要生成 lcov 报告,您可以使用 lcov 报告器。这将生成一个 lcov.info 文件在 coverage 目录中。

[test]
coverageReporter = "lcov"