运行时包管理器打包器测试运行器代码检查格式化指南参考博客反馈

从 Jest 迁移到 Bun 的测试运行器

在许多情况下,Bun 的测试运行器可以在不修改代码的情况下运行 Jest 测试套件。使用 bun test 代替 npx jest 或 yarn test。

terminal
npx jest # [!code --]
yarn test # [!code --]
bun test # [!code ++]

你的测试文件通常可以直接运行。

  • Bun 会在内部将从 @jest/globals 导入的内容重写为对应的 bun:test 内容。
  • 如果你依赖 Jest 注入 test 和 expect 等全局变量,Bun 也会执行相同的操作。

如果你更愿意直接从 bun:test 导入,请更新导入语句。

test.ts
import { test, expect } from "@jest/globals"; // [!code --]
import { test, expect } from "bun:test"; // [!code ++]

从 Bun v1.2.19 开始,三斜线指令可以为全局测试函数启用 TypeScript 支持。将它添加到项目中的_一个文件_,例如:

  • 项目根目录下的 global.d.ts 文件
  • 你的测试 preload.ts 设置文件(如果在 bunfig.toml 中使用了 preload)
  • TypeScript 编译时包含的任意一个 .ts 文件
global.d.ts
/// <reference types="bun-types/test-globals" />

添加后,项目中的每个测试文件都会获得 Jest 全局函数的 TypeScript 支持:

math.test.ts
describe("my test suite", () => {
  test("should work", () => {
    expect(1 + 1).toBe(2);
  });

  beforeAll(() => {
    // 设置代码
  });

  afterEach(() => {
    // 清理代码
  });
});

Bun 实现了 Jest 的大多数匹配器,但兼容性并非 100%。请参阅编写测试中的兼容性表。


如果你使用 testEnvironment: "jsdom" 在类似浏览器的环境中运行测试,请按照 Bun 和 happy-dom 进行 DOM 测试指南,将浏览器 API 注入全局作用域。该指南使用 happy-dom,这是 jsdom 的一个更轻量、更快速的替代方案。

bunfig.toml
[test]
preload = ["./happydom.ts"]

将 Jest 配置中的 bail 替换为 --bail 命令行参数。

terminal
bun test --bail=3

将 collectCoverage 替换为 --coverage 命令行参数。

terminal
bun test --coverage

将 testTimeout 替换为 --timeout CLI 标志。

terminal
bun test --timeout 10000

许多其他 Jest 设置在 bun test 中并不适用。

  • transform — Bun 支持 TypeScript 和 JSX。使用插件配置其他文件类型。
  • extensionsToTreatAsEsm
  • haste — Bun 使用其自己的模块解析器
  • watchman、watchPlugins、watchPathIgnorePatterns — 使用 --watch 以监视模式运行测试
  • verbose — bun test 默认会报告每个测试。使用 --only-failures 或 --dots 以减少输出(请参阅测试报告器)。

许多其他设置在 bunfig.toml 的 [test] 部分中都有对应项。例如:

  • setupFiles/setupFilesAfterEnv → preload
  • testPathIgnorePatterns → pathIgnorePatterns
  • rootDir → root
  • coverageDirectory → coverageDir
  • coverageReporters → coverageReporter
  • coverageThreshold → coverageThreshold(使用 0.9 这样的分数,而非百分比)

请参阅测试配置。没有对应项的设置不受支持。如果缺少你需要的功能,请提交功能请求。


另见: