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
要改为将测试标记为待办事项,请使用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 兼容性;请参阅跟踪 issue。基本匹配器
字符串和数组匹配器
对象匹配器
数字匹配器
函数和类匹配器
Promise 匹配器
模拟函数匹配器
快照匹配器
工具匹配器
未实现
最佳实践
使用描述性的测试名称
example.test.ts
分组相关测试
auth.test.ts
使用合适的匹配器
auth.test.ts
测试错误情况
example.test.ts
使用初始化和清理
example.test.ts