使用从内置 bun:test
模块导入的类似 Jest 的 API 定义测试。从长远来看,Bun 旨在完全兼容 Jest;目前,支持 expect
匹配器的有限集合。
基本用法
定义一个简单的测试
import { expect, test } from "bun:test";
test("2 + 2", () => {
expect(2 + 2).toBe(4);
});
Jest 样式全局变量
可以使用 describe
将测试分组到套件中。
import { expect, test, describe } from "bun:test";
describe("arithmetic", () => {
test("2 + 2", () => {
expect(2 + 2).toBe(4);
});
test("2 * 2", () => {
expect(2 * 2).toBe(4);
});
});
测试可以是 async
。
import { expect, test } from "bun:test";
test("2 * 2", async () => {
const result = await Promise.resolve(2 * 2);
expect(result).toEqual(4);
});
或者,使用 done
回调来发出完成信号。如果将 done
回调作为测试定义中的一个参数,则必须调用它,否则测试会挂起。
import { expect, test } from "bun:test";
test("2 * 2", done => {
Promise.resolve(2 * 2).then(result => {
expect(result).toEqual(4);
done();
});
});
超时
可以通过将一个数字作为 test
的第三个参数来选择指定每个测试的超时时间(以毫秒为单位)。
import { test } from "bun:test";
test("wat", async () => {
const data = await slowOperation();
expect(data).toBe(42);
}, 500); // test must run in <500ms
test.skip
使用 test.skip
跳过单个测试。不会运行这些测试。
import { expect, test } from "bun:test";
test.skip("wat", () => {
// TODO: fix this
expect(0.1 + 0.2).toEqual(0.3);
});
test.todo
使用 test.todo
将测试标记为待办事项。将运行这些测试,并且测试运行器会期望它们失败。如果它们通过,系统会提示你将其标记为常规测试。
import { expect, test } from "bun:test";
test.todo("fix this", () => {
myTestFunction();
});
要专门运行标记为待办事项的测试,请使用 bun test --todo
。
bun test --todo
test.only
要运行特定的测试或测试套件,请使用 test.only()
或 describe.only()
。声明后,运行 bun test --only
将仅执行已使用 .only()
标记的测试/套件。在声明了 test.only()
的情况下运行 bun test
而没有 --only
选项,将导致执行给定套件中的所有测试,直到带有 .only()
的测试。describe.only()
在两种执行场景中的功能相同。
import { test, describe } from "bun:test";
test("test #1", () => {
// does not run
});
test.only("test #2", () => {
// runs
});
describe.only("only", () => {
test("test #3", () => {
// runs
});
});
以下命令将仅执行测试 #2 和 #3。
bun test --only
以下命令将仅执行测试 #1、#2 和 #3。
bun test
test.if
要根据条件运行测试,请使用 test.if()
。如果条件为真,则会运行测试。这对于仅在特定架构或操作系统上运行的测试特别有用。
test.if(Math.random() > 0.5)("runs half the time", () => {
// ...
});
const macOS = process.arch === "darwin";
test.if(macOS)("runs on macOS", () => {
// runs if macOS
});
test.skipIf
要根据某个条件跳过测试,请使用 test.skipIf()
或 describe.skipIf()
。
const macOS = process.arch === "darwin";
test.skipIf(macOS)("runs on non-macOS", () => {
// runs if *not* macOS
});
test.todoIf
如果您想将测试标记为 TODO,请使用 test.todoIf()
或 describe.todoIf()
。仔细选择 skipIf
或 todoIf
可以显示不同之处,例如,“此目标无效”和“已计划但尚未实现”。
const macOS = process.arch === "darwin";
// TODO: we've only implemented this for Linux so far.
test.todoIf(macOS)("runs on posix", () => {
// runs if *not* macOS
});
test.each
要在测试表中为多个用例返回一个函数,请使用 test.each
。
const cases = [
[1, 2, 3],
[3, 4, 5],
];
test.each(cases)("%p + %p should be %p", (a, b, expected) => {
// runs once for each test case provided
});
根据用例的类型,有许多选项可用于设置用例标签的格式。
%p | pretty-format |
%s | 字符串 |
%d | 数字 |
%i | 整数 |
%f | 浮点数 |
%j | JSON |
%o | 对象 |
%# | 测试用例的索引 |
%% | 单个百分号 (% ) |
匹配器
Bun 实现以下匹配器。完全兼容 Jest 是路线图中的一部分;在此处跟踪进度 此处。