Bun

运行时行为

bun test 与 Bun 的运行时环境深度集成。这也是 bun test 快速且易于使用的原因之一。

$NODE_ENV 环境变量

bun test 会自动将 $NODE_ENV 设置为 "test",除非它已在环境中或通过 .env 文件设置。这是大多数测试运行器的标准行为,有助于确保测试行为的一致性。

import { test, expect } from "bun:test";

test("NODE_ENV is set to test", () => {
  expect(process.env.NODE_ENV).toBe("test");
});

NODE_ENV 设置为 "test" 时,Bun 不会加载 .env.local 文件。这可以防止在测试期间进行本地覆盖,从而确保不同执行环境下的测试配置一致。相反,请使用 .env.test 来设置特定于测试的环境变量,该文件应提交到您的仓库中,以确保所有开发人员和 CI 环境的一致性。

$TZ 环境变量

默认情况下,所有 bun test 运行都使用 UTC (Etc/UTC) 作为时区,除非被 TZ 环境变量覆盖。这确保了不同开发环境下的日期和时间行为的一致性。

测试超时

除非显式覆盖,否则每个测试的默认超时时间为 5000 毫秒(5 秒)。超过此超时的测试将失败。可以使用 --timeout 标志全局更改,或在每个测试中作为 test 函数的第三个参数进行更改。

错误处理

未处理的错误

bun test 会跟踪未处理的 Promise 拒绝和在测试之间发生的错误。如果发生此类错误,最终的退出代码将非零(具体来说,是此类错误的计数),即使所有测试都通过。

这有助于捕获异步代码中可能被忽略的错误。

import { test } from "bun:test";

test("test 1", () => {
  // This test passes
});

// This error happens outside any test
setTimeout(() => {
  throw new Error("Unhandled error");
}, 0);

test("test 2", () => {
  // This test also passes
});

// The test run will still fail with a non-zero exit code
// because of the unhandled error

在内部,这比 process.on("unhandledRejection")process.on("uncaughtException") 具有更高的优先级,这使得与现有代码的集成更加简单。

将通用 CLI 标志与测试一起使用

可以使用多个 Bun CLI 标志与 bun test 一起使用来修改其行为。

内存使用

  • --smol:降低测试运行器 VM 的内存使用。

调试

  • --inspect, --inspect-brk:将调试器附加到测试运行器进程。

模块加载

  • --preload:在测试文件之前运行脚本(对于全局设置/模拟很有用)。
  • --define:设置编译时常量。
  • --loader:配置自定义加载器。
  • --tsconfig-override:使用不同的 tsconfig。
  • --conditions:设置 package.json 条件以进行模块解析。
  • --env-file:为测试加载环境变量。
  • --prefer-offline, --frozen-lockfile 等:影响测试执行期间的任何网络请求或自动安装。

监视和热重载

使用 --watch 标志运行 bun test 时,测试运行器将监视文件更改并重新运行受影响的测试。

--hot 标志提供类似功能,但在尝试在运行之间保留状态方面更为激进。对于大多数测试场景,推荐使用 --watch 选项。

全局变量

以下全局变量在测试文件中无需导入即可自动可用(尽管如果愿意,可以从 bun:test 导入它们)。

  • test, it:定义测试。
  • describe:分组测试。
  • expect:进行断言。
  • beforeAll, beforeEach, afterAll, afterEach:生命周期钩子。
  • jest:Jest 全局对象。
  • vi:Vitest 兼容的别名,用于常见的 jest 方法。