Finding tests

Learn how Bun's test runner discovers and filters test files in your project

bun test decides which files to run as tests by matching their paths against a set of patterns.

Default Discovery Logic#

By default, bun test recursively searches the project directory for files that match these patterns:

  • *.test.{js|jsx|ts|tsx|mjs|cjs|mts|cts} - Files ending with .test.js, .test.jsx, .test.ts, .test.tsx, .test.mjs, .test.cjs, .test.mts, or .test.cts
  • *_test.{js|jsx|ts|tsx|mjs|cjs|mts|cts} - Files ending with _test.js, _test.jsx, _test.ts, _test.tsx, _test.mjs, _test.cjs, _test.mts, or _test.cts
  • *.spec.{js|jsx|ts|tsx|mjs|cjs|mts|cts} - Files ending with .spec.js, .spec.jsx, .spec.ts, .spec.tsx, .spec.mjs, .spec.cjs, .spec.mts, or .spec.cts
  • *_spec.{js|jsx|ts|tsx|mjs|cjs|mts|cts} - Files ending with _spec.js, _spec.jsx, _spec.ts, _spec.tsx, _spec.mjs, _spec.cjs, _spec.mts, or _spec.cts

Exclusions#

By default, bun test ignores:

  • node_modules directories
  • Hidden directories (those starting with a period .)
  • Files that don't have JavaScript-like extensions (based on available loaders)

Customizing Test Discovery#

Position Arguments as Filters#

To filter which test files run, pass additional positional arguments to bun test:

terminal
bun test <filter> <filter> ...

Any test file with a path that contains one of the filters runs. Filters are substring matches, not glob patterns.

For example, to run all tests in a utils directory:

terminal
bun test utils

This matches files like src/utils/string.test.ts and lib/utils/array_test.js.

Specifying Exact File Paths#

To run a specific file in the test runner, make sure the path starts with ./ or / to distinguish it from a filter name:

terminal
bun test ./test/specific-file.test.ts

Filter by Test Name#

To filter tests by name rather than file path, use the -t/--test-name-pattern flag with a regex pattern:

terminal
# run all tests with "addition" in the name
bun test --test-name-pattern addition

bun test matches the pattern against the test name prefixed with the labels of all its parent describe blocks, separated by spaces. For example, a test defined as:

math.test.ts
describe("Math", () => {
  describe("operations", () => {
    test("should add correctly", () => {
      // ...
    });
  });
});

For this test, bun test matches the pattern against the string "Math operations should add correctly".

Changing the Root Directory#

By default, Bun looks for test files starting from the current working directory. Change this with the root option in bunfig.toml:

bunfig.toml
[test]
root = "src"  # Only scan for tests in the src directory

Execution Order#

Tests run in the following order:

  1. Test files run sequentially, or across worker processes with --parallel
  2. Within each file, tests run sequentially in definition order