Bun 作为一个新兴的 JavaScript 运行时,不仅提供了快速的执行性能,还内置了强大的测试功能,使其成为 JavaScript 库测试的理想选择。以下是基于 Bun 进行 JavaScript 库测试的全面指南。
Bun 内置了一个兼容 Jest 的测试框架,可以直接运行 JavaScript、TypeScript 和 JSX 应用程序的测试工作。它的主要特点包括:
基本测试示例:
import { test, expect } from "bun:test";
test("2 + 2", () => {
expect(2 + 2).toBe(4);
});
test("异步示例", async () => {
const data = await fetchData();
expect(data).toEqual({ success: true });
});
Bun 1.2 版本对测试功能进行了多项改进:
JUnit 支持:可以生成 JUnit 兼容的报告形式,便于在 CI/CD 工具链中使用 bun test --reporter=junit --reporter-outfile=junit.xml
或者在配置文件中设置:
[test.reporter] junit = "junit.xml"
LCOV 支持:增加了 LCOV 格式的测试覆盖报告,兼容 Codecov 等测试覆盖分析工具
test("toMatchInlineSnapshot()", () => {
expect(new Date()).toMatchInlineSnapshot();
});
执行 bun test -u 可以更新快照。 3. 选择性测试 使用 test.only 可以只运行指定的测试用例,简化开发阶段的测试流程:
test.only("test a", () => {
/_ Only run this test _/;
});
test("test b", () => {
/_ Don't run this test _/;
});
在 1.2 版本中,程序会自动识别并运行标记为 only 的测试,无需额外参数。 4. 新增匹配器 1.2 版本增加了多种新的匹配器,使测试编写更加方便:
// Contain 匹配器
const object = new Set(["bun", "node", "npm"]);
expect(object).toContainValue("bun");
expect(object).toContainValues(["bun", "node"]);
expect(object).toContainAllValues(["bun", "node", "npm"]);
expect(object).not.toContainAnyValues(["done"]);
// Contain Key 匹配器
const object = new Map([
["bun", "1.2.0"],
["node", "22.13.0"],
["npm", "9.1.2"],
]);
expect(object).toContainKey("bun");
expect(object).toContainKeys(["bun", "node"]);
expect(object).toContainAllKeys(["bun", "node", "npm"]);
expect(object).not.toContainAnyKeys(["done"]);
// Mock 返回值测试
const mock = jest.fn(() => "foo");
mock();
expect(mock).toHaveReturned();
expect(mock).toHaveReturnedTimes(1);
test("custom error message", () => {
expect(0.1 + 0.2, "Floating point has precision error").toBe(0.3);
});
// 使用 jest 方法
jest.setTimeout(60 \* 1000); // 1 分钟
// 或使用 bun 方法
import { setDefaultTimeout } from "bun:test";
setDefaultTimeout(60 \* 1000); // 1 分钟
Bun 测试环境可以与 fast-check 等库结合,实现基于属性的测试(Property-Based Testing)。这种方法通过定义被测代码应该满足的通用属性,然后自动生成大量输入数据来验证这些属性是否始终成立。 安装 fast-check:
bun install -D fast-check
示例:测试一个质因数分解函数
import { describe, it, expect } from 'bun:test';
import fc from 'fast-check';
describe('decompose 函数', () => {
it('质因数数组的乘积应等于原始输入值', () => {
fc.assert(
fc.property(
fc.integer({ min: 2, max: 2 \*_ 31 - 1 }), (n) => {
const factors = decompose(n);
const productOfFactors = factors.reduce((a, b) => a _ b, 1);
return productOfFactors === n;
}
)
);
});
});
Bun 提供了对 PostgreSQL 和 SQLite 的原生支持,优化了数据库相关测试:
这些优化使得在 Bun 中进行数据库相关的测试更加高效。
相比于传统的测试工具链,Bun 测试具有以下优势:
虽然 Bun 测试功能强大,但在使用时仍需注意以下几点:
Bun 提供了一个快速、高效且功能丰富的 JavaScript 库测试环境。其内置的测试框架兼容 Jest API,降低了学习成本,同时通过 1.2 版本的新增功能进一步提升了测试的便利性和表现力。无论是传统的单元测试还是高级的基于属性的测试,Bun 都能提供优秀的支持。结合 Bun 本身的高性能特点,它能够显著提升 JavaScript 库的测试效率和质量保障能力。 对于新项目,特别是注重开发效率和性能的项目,Bun 测试是一个值得考虑的选择。对于现有项目,也可以逐步尝试将测试迁移到 Bun 环境,体验其带来的速度提升和开发便利。