- TypeScript 和 JSX
- 生命周期钩子
- 快照测试
- UI 与 DOM 测试
- 使用
--watch的监视模式 - 使用
--preload的脚本预加载
Bun 旨在兼容 Jest,但并非所有功能均已实现。要跟踪兼容性,请查看此跟踪问题。
运行测试
terminal
math.test.ts
*.test.{js|jsx|ts|tsx|mjs|cjs|mts|cts}*_test.{js|jsx|ts|tsx|mjs|cjs|mts|cts}*.spec.{js|jsx|ts|tsx|mjs|cjs|mts|cts}*_spec.{js|jsx|ts|tsx|mjs|cjs|mts|cts}
bun test 传递其他位置参数。路径与任一筛选条件匹配的测试文件都会运行。筛选条件通常是文件名或目录名;目前尚不支持 glob 模式。
terminal
-t/--test-name-pattern 标志。
terminal
./ 或 / 开头,以区别于筛选名。
terminal
--preload 脚本(请参阅生命周期),然后在一个共享全局环境中运行每个文件。传入 --parallel 可将文件分散到各个 CPU 核心上运行。如果测试失败,测试运行器会以非零退出代码退出。
CI/CD 集成
bun test 支持多种 CI/CD 集成方案。
GitHub Actions
bun test 会自动检测其是否在 GitHub Actions 中运行,并直接向控制台输出 GitHub Actions 注释。
无需额外配置,只需在工作流程中安装 bun 并运行 bun test。
如何在 GitHub Actions 工作流程中安装 bun
要在 GitHub Actions 工作流程中使用 bun test,添加如下步骤:
.github/workflows/test.yml
JUnit XML 报告(GitLab 等)
要写入 JUnit XML 报告,请将--reporter=junit 与 --reporter-outfile 一起传入。
terminal
bun test 仍会像往常一样写入 stdout/stderr,并在运行结束时将 JUnit XML 报告写入指定路径。
JUnit XML 是 CI/CD 管道中报告测试结果的流行格式。
超时设置
使用--timeout 标志以毫秒为单位指定_每个测试_的超时时间。如果测试超时,则会被标记为失败。默认值为 5000。
terminal
并发测试执行
要跨 CPU 核运行测试文件,请参阅--parallel。以下标志控制文件_内部_测试的并发性。
默认情况下,Bun 会在每个测试文件中按顺序运行所有测试。并发执行会并行运行异步测试,从而加快包含相互独立测试的测试套件。
--concurrent 标志
使用 --concurrent 标志,实现各测试文件内部的所有测试并发执行:
terminal
test.serial,否则所有测试都会并行运行。
--max-concurrency 标志
用 --max-concurrency 标志控制最大并发测试数量:
terminal
test.concurrent
单独标记测试为并发执行,即使未使用 --concurrent 也能并行运行:
math.test.ts
test.serial
即使启用 --concurrent 标志,也强制测试顺序执行:
math.test.ts
重试失败的测试
使用--retry 标志自动重试失败的测试,最多指定次数。如果测试失败后,在后续尝试中通过,则报告为通过。
terminal
{ retry: N } 设置覆盖全局的 --retry 值:
bunfig.toml 中设置:
bunfig.toml
重新运行测试
使用--rerun-each 标志多次运行每个测试。这有助于发现不稳定或非确定性的测试失败。
terminal
随机化测试执行顺序
使用--randomize 标志以随机顺序运行测试,有助于发现依赖共享状态或执行顺序的测试。
terminal
--randomize 时,用于随机化的种子会显示在测试摘要中:
terminal
使用 --seed 实现可复现的随机顺序
使用 --seed 标志指定随机化种子,以便在调试依赖执行顺序的失败测试时复现相同的测试顺序。
terminal
--seed 标志会隐式启用 --randomize,因此无需同时指定这两个标志。相同的种子始终会产生相同的测试执行顺序。
失败即停止 --bail
使用 --bail 标志,在测试失败达到指定次数后中止测试运行。默认情况下,Bun 会运行所有测试并报告所有失败,但在 CI 中,提前停止测试并减少 CPU 使用量可能更为合适。
terminal
监视模式
与bun run 类似,bun test 接受 --watch 标志,以监视更改并重新运行测试。
terminal
生命周期钩子
Bun 支持以下生命周期钩子:
在测试文件中定义钩子,或在使用
--preload 标志预加载的单独文件中定义钩子。
terminal
模拟
使用mock 函数创建模拟函数。
math.test.ts
jest.fn();其行为完全相同。
math.test.ts
快照测试
bun test 支持快照测试。
math.test.ts
--update-snapshots 标志。
terminal
UI 与 DOM 测试
Bun 兼容流行的 UI 测试库: 请参阅 DOM 测试。大型代码库
对于包含数千个测试文件的测试套件,bun test 提供了多个可组合使用的调节项——工作进程、隔离级别、跨机器分片以及基于耗时的调度。每项内容都在并行与隔离测试运行中进行了深入介绍;以下大致按照收益高低说明它们如何配合使用:
1. 使用每个核心:--parallel。 每个核心使用一个工作进程,文件一次分配一个。
2. 决定所需的隔离程度。 --parallel 为每个文件提供一个全新的全局环境,这是安全的默认设置,也是 Jest/Vitest 的行为。如果你的文件之间不会泄漏状态(它们已经能够在共享一个全局环境的普通 bun test 下通过),--parallel --no-isolate 会让每个工作进程只评估一次导入和预加载脚本,而不是每个文件评估一次。对于由许多小文件组成的测试套件,这是最大的单项性能提升——请参阅对比方式。
3. 跨机器拆分:--shard=i/n。 该方式具有确定性且无需协调器;每个 CI 作业运行一个切片,并且每个切片仍会在本地使用 --parallel。
4. 按耗时而非数量进行平衡:--timings。 有了记录的耗时后,分片会被切分,使每个分片的总耗时大致相同(采用最长处理时间优先的方式,同时将路径相邻的文件放在一起,以保持工作进程的模块缓存处于热状态)。每个工作进程会先启动其耗时最长的文件,空闲工作进程则会获取剩余文件中耗时最长的文件——因此运行不会因为某个碰巧最后启动的长耗时文件而被拖慢。
5. 自动保持耗时数据最新:--update-timings。 每个分片会写入其运行文件的耗时;下一次运行会读取所有这些数据。在 GitHub Actions 中,看起来如下:
.github/workflows/test.yml
next/)。如果第 2 步适用于你,请将 --no-isolate 添加到 bun test 命令中。
6. 在文件内部:test.concurrent 适用于将大部分时间花在等待上的 I/O 密集型测试。
性能
Bun 的测试运行器非常快速。
AI 代理集成
当你将 Bun 的测试运行器与 AI 编程助手结合使用时,可以启用更安静的输出,在保留失败详情的同时去除其余噪音。环境变量
设置以下任一环境变量即可启用适合 AI 的输出:CLAUDECODE=1- 适用于 Claude CodeREPL_ID=1- 适用于 ReplitAGENT=1- 通用 AI 代理标志
行为
检测到 AI 代理环境时:- 只详细显示测试失败信息
- 隐藏通过、跳过及待办测试指示符
- 保留统计摘要
terminal
CLI 用法
执行控制
number
default:"5000"
设置每个测试的超时时间,单位为毫秒(默认 5000)
number
重新运行每个测试文件
NUMBER 次,以帮助发现某些错误number
最多重试失败的测试
NUMBER 次。可被每个测试的 覆盖boolean
将所有测试视为
test.concurrent() 测试boolean
以随机顺序运行测试
number
设置测试随机化的随机种子
number
default:"1"
在出现
NUMBER 次失败后退出测试套件。如果不指定数字,默认为 1。number
default:"20"
最大同时执行的测试数量(默认 20)
测试过滤
boolean
包含标记为
test.todo() 的测试string
只运行名称匹配给定正则表达式的测试。别名:
-t报告
string
测试输出报告格式。可用选项:
junit(需要 —reporter-outfile)、dots。默认:控制台输出。string
报告格式的输出文件路径(与 —reporter 一起使用时必需)
boolean
启用点状报告。—reporter=dots 的简写
覆盖率
boolean
生成覆盖率报告
string
default:"text"
以
text 和/或 lcov 格式报告覆盖率。默认 textstring
default:"coverage"
覆盖率文件的目录。默认
coverage快照
boolean
更新快照文件。别名:
-u示例
运行所有测试文件:terminal
terminal
terminal