Bun ships with a built-in test runner. ## Run tests ```bash $ bun test ``` Tests are written in JavaScript or TypeScript with a Jest-like API. Refer to [Writing tests](/docs/test/writing) for full documentation. ```ts#math.test.ts import { expect, test } from "bun:test"; test("2 + 2", () => { expect(2 + 2).toBe(4); }); ``` The runner recursively searches the working directory for files that match the following patterns: - `*.test.{js|jsx|ts|tsx}` - `*_test.{js|jsx|ts|tsx}` - `*.spec.{js|jsx|ts|tsx}` - `*_spec.{js|jsx|ts|tsx}` You can filter the set of tests to run by passing additional positional arguments to `bun test`. Any file in the directory with an _absolute path_ that contains one of the filters will run. Commonly, these filters will be file or directory names; glob patterns are not yet supported. ```bash $ bun test ... ``` ## Snapshot testing Snapshots are supported by `bun test`. First, write a test using the `.toMatchSnapshot()` matcher: ```ts import { test, expect } from "bun:test"; test("snap", () => { expect("foo").toMatchSnapshot(); }); ``` Then generate snapshots with the following command: ```bash bun test --update-snapshots ``` Snapshots will be stored in a `__snapshots__` directory next to the test file. ## Watch mode Similar to `bun run`, you can pass the `--watch` flag to `bun test` to watch for changes and re-run tests. ```bash $ bun test --watch ``` ## Performance Bun's test runner is fast. {% image src="/images/buntest.jpeg" caption="Running 266 React SSR tests faster than Jest can print its version number." /%}