Skip to main content
使用从内置 bun:test 模块导入的类似 Jest 的 API 定义测试。从长远来看,Bun 旨在完全兼容 Jest;目前仅支持有限的一组 expect 匹配器。

基本用法

定义测试:
math.test.ts

测试分组

使用 describe 将测试分组到测试套件中。
math.test.ts

异步测试

测试可以是异步的。
math.test.ts
或者,使用 done 回调来表示完成。如果测试函数接收 done 参数,则必须调用它,否则测试会一直挂起。
math.test.ts

超时

可通过给 test 传入第三个参数数字来指定单个测试的超时时间(毫秒)。
math.test.ts
bun:test 中,超时会抛出无法捕获的异常,以强制测试停止运行并失败。Bun 还会终止测试中生成的所有子进程,因此它们不会作为僵尸进程残留。 如果未通过此超时选项或 jest.setTimeout() 覆盖,每个测试的默认超时时间为 5000ms(5 秒)。

重试和重复执行

test.retry

使用 retry 选项可在不稳定的测试失败时自动重试。测试在指定的尝试次数内成功即可通过。
example.test.ts

test.repeats

使用 repeats 选项可多次运行测试,而不论测试通过还是失败;如果任何一次迭代失败,测试就会失败。可使用此选项检测不稳定的测试或进行压力测试。repeats: N 总共运行测试 N+1 次(1 次初始运行 + N 次重复运行)。
example.test.ts
同一个测试不能同时使用 retryrepeats

🧟 僵尸进程清理器

当测试超时时,Bun 会终止其中通过 Bun.spawnBun.spawnSyncnode:child_process 启动且仍在运行的所有进程,并向控制台记录一条消息。这可以防止僵尸进程在测试超时后继续残留。

测试修饰符

test.skip

使用 test.skip 跳过单个测试。这些测试不会运行。
math.test.ts

test.todo

使用 test.todo 将测试标记为待办事项。这些测试不会运行。
math.test.ts
要运行待办测试并找出其中通过的测试,请使用 bun test --todo
terminal
使用此标志时,失败的待办测试不会导致错误,但通过的待办测试会被标记为失败,以便你移除 todo 标记或修复测试。

test.only

要运行特定测试或测试套件,请使用 test.only()describe.only()
example.test.ts
以下命令只运行测试 #2 和 #3。
terminal

test.if

要有条件地运行测试,请使用 test.if()。当条件为真值时,测试才会运行。对于仅应在特定架构或操作系统上运行的测试,可以使用它。
example.test.ts

test.skipIf

条件跳过测试,使用 test.skipIf()describe.skipIf()
example.test.ts

test.todoIf

要改为将测试标记为待办事项,请使用 test.todoIf()describe.todoIf()。选择 skipIf 还是 todoIf 表明了不同意图:“对该目标无效”与“计划实现但尚未实现”。
example.test.ts

test.failing

当你知道某个测试会失败,但希望跟踪它并在它开始通过时收到通知,请使用 test.failing()。这会反转测试结果:
  • 标记了 .failing() 的失败测试会通过
  • 标记了 .failing() 的通过测试会失败,并显示它现在已经通过、应当进行修复的消息
math.test.ts
可以使用它跟踪计划稍后修复的已知 bug,或用于测试驱动开发。

describe 块中的条件测试

条件修饰符 .if().skipIf().todoIf() 同样适用于 describe 块,会影响套件中的所有测试:
example.test.ts

参数化测试

test.eachdescribe.each

使用 test.each 可针对多个数据集运行相同测试。每个测试用例都会运行一次。
math.test.ts
describe.each 创建一个参数化测试套件,每个测试用例运行一次:
sum.test.ts

参数传递

如何将参数传递给测试函数,依赖于测试用例的结构:
  • 如果表格行是数组(例如 [1, 2, 3]),则每个元素作为单独参数传入
  • 如果行不是数组(如对象),则作为单个参数传入
example.test.ts

格式化占位符

使用以下格式说明符来格式化测试标题:

示例

example.test.ts

断言计数

Bun 支持验证测试期间调用的断言数量:

expect.hasAssertions()

使用 expect.hasAssertions() 验证测试中至少调用过一次断言:
example.test.ts
这对于异步测试尤其有用,可以确保断言确实执行。

expect.assertions(count)

使用 expect.assertions(count) 验证测试中调用了指定数量的断言:
example.test.ts
尤其适合复杂异步代码中确保所有断言都执行。

类型测试

Bun 包含用于测试 TypeScript 类型的 expectTypeOf,兼容 Vitest。

expectTypeOf

这些函数在运行时不会执行任何操作。请单独运行 TypeScript 以验证类型检查。
expectTypeOf 函数提供类型级别的断言,由 TypeScript 的类型检查器检查。测试类型的方法:
  1. 使用 expectTypeOf 编写类型断言
  2. 运行 bunx tsc --noEmit 检查类型是否正确
example.test.ts
有关 expectTypeOf 匹配器的完整文档,请参阅 API 参考

匹配器

Bun 实现了以下匹配器。计划实现完整的 Jest 兼容性;请参阅跟踪 issue

基本匹配器

字符串和数组匹配器

对象匹配器

数字匹配器

函数和类匹配器

Promise 匹配器

模拟函数匹配器

快照匹配器

工具匹配器

未实现

最佳实践

使用描述性的测试名称

example.test.ts

分组相关测试

auth.test.ts

使用合适的匹配器

auth.test.ts

测试错误情况

example.test.ts

使用初始化和清理

example.test.ts