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
使用此标志时,失败的待办测试不会导致错误,但通过的待办测试会被标记为失败,以便你可以移除待办标记或修复测试。

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

要将测试标记为 TODO,请使用 test.todoIf()describe.todoIf()。在 skipIftodoIf 之间选择能传达意图:“此目标无效”与”已计划但尚未实现”。
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 兼容性;参见跟踪问题

基本匹配器

字符串和数组匹配器

对象匹配器

数字匹配器

函数和类匹配器

Promise 匹配器

模拟函数匹配器

快照匹配器

工具匹配器

尚未实现

最佳实践

使用描述性测试名称

example.test.ts

分组相关测试

auth.test.ts

使用合适的匹配器

auth.test.ts

测试错误条件

example.test.ts

使用设置和清理

example.test.ts