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 方法。