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
你不能在同一个测试上同时使用
retry 和 repeats。🧟 僵尸进程终结者
当测试超时时,Bun 会杀死测试中使用Bun.spawn、Bun.spawnSync 或 node: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
terminal
test.if
要有条件地运行测试,请使用test.if()。如果条件为真值,则测试运行。用于应仅在特定架构或操作系统上运行的测试。
example.test.ts
test.skipIf
要基于某个条件跳过测试,请使用test.skipIf() 或 describe.skipIf()。
example.test.ts
test.todoIf
要将测试标记为 TODO,请使用test.todoIf() 或 describe.todoIf()。在 skipIf 和 todoIf 之间选择能传达意图:“此目标无效”与”已计划但尚未实现”。
example.test.ts
test.failing
当你已知测试失败但想要跟踪它并在它开始通过时收到通知时,请使用test.failing()。这会反转测试结果:
- 标记了
.failing()的失败测试会通过 - 标记了
.failing()的通过测试会失败,并显示一条消息,表明它现在通过了应该修复
math.test.ts
Describe 块的条件测试
条件修饰符.if()、.skipIf() 和 .todoIf() 也适用于 describe 块,影响套件中的所有测试:
example.test.ts
参数化测试
test.each 和 describe.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
expectTypeOf 函数提供由 TypeScript 的类型检查器检查的类型级断言。要测试你的类型:
- 使用
expectTypeOf编写类型断言 - 运行
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