Bun 附带了一个快速、内置的、兼容 Jest 的测试运行器。测试使用 Bun 运行时执行,并支持以下功能。
- TypeScript 和 JSX
- 生命周期钩子
- 快照测试
- UI 和 DOM 测试
- 使用
--watch
的监视模式 - 使用
--preload
的脚本预加载
Bun 旨在与 Jest 兼容,但并非所有功能都已实现。要跟踪兼容性,请参阅 此跟踪问题。
运行测试
bun test
测试使用类似 Jest 的 API 以 JavaScript 或 TypeScript 编写。有关完整文档,请参阅 编写测试。
import { expect, test } from "bun:test";
test("2 + 2", () => {
expect(2 + 2).toBe(4);
});
运行器会递归搜索工作目录,查找与以下模式匹配的文件
*.test.{js|jsx|ts|tsx}
*_test.{js|jsx|ts|tsx}
*.spec.{js|jsx|ts|tsx}
*_spec.{js|jsx|ts|tsx}
你可以通过向 bun test
传递其他位置参数来筛选要运行的测试文件集合。任何路径与其中一个筛选器匹配的测试文件都将运行。通常,这些筛选器将是文件或目录名称;目前不支持 glob 模式。
bun test <filter> <filter> ...
要按测试名称筛选,请使用 -t
/--test-name-pattern
标志。
# run all tests or test suites with "addition" in the name
bun test --test-name-pattern addition
要在测试运行器中运行特定文件,请确保路径以 ./
或 /
开头,以将其与筛选器名称区分开来。
bun test ./test/specific-file.test.ts
测试运行器在一个进程中运行所有测试。它加载所有 --preload
脚本(有关详细信息,请参阅 生命周期),然后运行所有测试。如果测试失败,测试运行器将退出,并带有非零退出代码。
超时
使用 --timeout
标志以毫秒为单位指定每个测试的超时时间。如果测试超时,它将被标记为失败。默认值为 5000
。
# default value is 5000
bun test --timeout 20
重新运行测试
使用 --rerun-each
标志多次运行每个测试。这对于检测不稳定或非确定性测试失败很有用。
bun test --rerun-each 100
使用 --bail
退出
使用 --bail
标志在预定的测试失败次数后提前中止测试运行。默认情况下,Bun 将运行所有测试并报告所有失败,但有时在 CI 环境中,为了减少 CPU 使用率,最好提前终止。
# bail after 1 failure
bun test --bail
# bail after 10 failure
bun test --bail 10
监视模式
类似于 bun run
,你可以将 --watch
标志传递给 bun test
以监视更改并重新运行测试。
bun test --watch
生命周期钩子
Bun 支持以下生命周期钩子
钩子 | 说明 |
---|---|
beforeAll | 在所有测试之前运行一次。 |
beforeEach | 在每个测试之前运行。 |
afterEach | 在每个测试之后运行。 |
afterAll | 在所有测试之后运行一次。 |
这些钩子可以在测试文件中定义,也可以在使用 --preload
标志预加载的单独文件中定义。
$ bun test --preload ./setup.ts
有关完整文档,请参见 测试 > 生命周期。
模拟
使用 mock
函数创建模拟函数。模拟在测试之间自动重置。
import { test, expect, mock } from "bun:test";
const random = mock(() => Math.random());
test("random", () => {
const val = random();
expect(val).toBeGreaterThan(0);
expect(random).toHaveBeenCalled();
expect(random).toHaveBeenCalledTimes(1);
});
或者,你可以使用 jest.fn()
,它的行为完全相同。
import { test, expect, mock } from "bun:test";
import { test, expect, jest } from "bun:test";
const random = mock(() => Math.random());
const random = jest.fn(() => Math.random());
有关完整文档,请参阅 测试 > 模拟。
快照测试
bun test
支持快照。
// example usage of toMatchSnapshot
import { test, expect } from "bun:test";
test("snapshot", () => {
expect({ a: 1 }).toMatchSnapshot();
});
要更新快照,请使用 --update-snapshots
标志。
bun test --update-snapshots
有关完整文档,请参阅 测试 > 快照。
UI 和 DOM 测试
Bun 与流行的 UI 测试库兼容
有关完整文档,请参阅 测试 > DOM 测试。
性能
Bun 的测试运行器很快。