Bun

Lifecycle hooks

The test runner supports the following lifecycle hooks. This is useful for loading test fixtures, mocking data, and configuring the test environment.

HookDescription
beforeAllRuns once before all tests.
beforeEachRuns before each test.
afterEachRuns after each test.
afterAllRuns once after all tests.

Perform per-test setup and teardown logic with beforeEach and afterEach.

import { beforeEach, afterEach } from "bun:test";

beforeEach(() => {
  console.log("running test.");
});

afterEach(() => {
  console.log("done with test.");
});

// tests...

Perform per-scope setup and teardown logic with beforeAll and afterAll. The scope is determined by where the hook is defined.

To scope the hooks to a particular describe block:

import { describe, beforeAll } from "bun:test";

describe("test group", () => {
  beforeAll(() => {
    // setup
  });

  // tests...
});

To scope the hooks to a test file:

import { describe, beforeAll } from "bun:test";

beforeAll(() => {
  // setup
});

describe("test group", () => {
  // tests...
});

To scope the hooks to an entire multi-file test run, define the hooks in a separate file.

setup.ts
import { beforeAll, afterAll } from "bun:test";

beforeAll(() => {
  // global setup
});

afterAll(() => {
  // global teardown
});

Then use --preload to run the setup script before any test files.

$ bun test --preload ./setup.ts

To avoid typing --preload every time you run tests, it can be added to your bunfig.toml:

[test]
preload = ["./setup.ts"]