Bun

bun test

Bun 附带了一个快速、内置的、兼容 Jest 的测试运行器。测试使用 Bun 运行时执行,并支持以下功能。

  • TypeScript 和 JSX
  • 生命周期钩子
  • 快照测试
  • UI 和 DOM 测试
  • 使用 --watch 的监视模式
  • 使用 --preload 的脚本预加载

Bun 旨在与 Jest 兼容,但并非所有功能都已实现。要跟踪兼容性,请参阅 此跟踪问题

运行测试

bun test

测试使用类似 Jest 的 API 以 JavaScript 或 TypeScript 编写。有关完整文档,请参阅 编写测试

math.test.ts
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 的测试运行器很快。

比 Jest 打印其版本号的速度更快地运行 266 个 React SSR 测试。