Bun

编写测试

使用从内置 bun:test 模块导入的类似 Jest 的 API 定义测试。从长远来看,Bun 旨在完全兼容 Jest;目前,支持 expect 匹配器的有限集合

基本用法

定义一个简单的测试

math.test.ts
import { expect, test } from "bun:test";

test("2 + 2", () => {
  expect(2 + 2).toBe(4);
});

Jest 样式全局变量

可以使用 describe 将测试分组到套件中。

math.test.ts
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()。仔细选择 skipIftodoIf 可以显示不同之处,例如,“此目标无效”和“已计划但尚未实现”。

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
});

根据用例的类型,有许多选项可用于设置用例标签的格式。

%ppretty-format
%s字符串
%d数字
%i整数
%f浮点数
%jJSON
%o对象
%#测试用例的索引
%%单个百分号 (%)

匹配器

Bun 实现以下匹配器。完全兼容 Jest 是路线图中的一部分;在此处跟踪进度 此处