aboutsummaryrefslogtreecommitdiff
path: root/docs/cli/test.md
blob: d19a45a12dea48548921399deaa0c761ceef27ab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Bun ships with a fast built-in test runner. Tests are executed with the Bun runtime, and support the following features.

- TypeScript and JSX
- Lifecycle hooks
- Snapshot testing
- UI & DOM testing
- Watch mode with `--watch`
- Script pre-loading with `--preload`

## 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 <filter> <filter> ...
```

The test runner runs all tests in a single process. It loads all `--preload` scripts (see [Lifecycle](/docs/test/lifecycle) for details), then runs all tests. If a test fails, the test runner will exit with a non-zero exit code.

## 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
```

## Lifecycle hooks

Bun supports the following lifecycle hooks:

| Hook         | Description                 |
| ------------ | --------------------------- |
| `beforeAll`  | Runs once before all tests. |
| `beforeEach` | Runs before each test.      |
| `afterEach`  | Runs after each test.       |
| `afterAll`   | Runs once after all tests.  |

These hooks can be define inside test files, or in a separate file that is preloaded with the `--preload` flag.

```ts
$ bun test --preload ./setup.ts
```

See [Test > Lifecycle](/docs/test/lifecycle) for complete documentation.

## Snapshot testing

Snapshots are supported by `bun test`. See [Test > Snapshots](/docs/test/snapshots) for complete documentation.

## UI & DOM testing

Bun is compatible with popular UI testing libraries:

- [HappyDOM](https://github.com/capricorn86/happy-dom)
- [DOM Testing Library](https://testing-library.com/docs/dom-testing-library/intro/)
- [React Testing Library](https://testing-library.com/docs/react-testing-library/intro)

See [Test > DOM Testing](/docs/test/dom) for complete documentation.

## 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." /%}

<!--
Consider the following directory structure:

```
.
├── a.test.ts
├── b.test.ts
├── c.test.ts
└── foo
    ├── a.test.ts
    └── b.test.ts
```

To run both `a.test.ts` files:

```
$ bun test a
```

To run all tests in the `foo` directory:

```
$ bun test foo
```

Any test file in the directory with an _absolute path_ that contains one of the targets will run. Glob patterns are not yet supported. -->
d4?s=13&d=retro' width='13' height='13' alt='Gravatar' /> Arsh 8-39/+150 2024-04-01[ci] formatGravatar Ben Holmes 3-3/+3 2024-04-01db: Better error messages when querying remote (#10636)Gravatar Ben Holmes 6-32/+69 2024-04-01Give proper error when seed missing default export (#10635)Gravatar Matthew Phillips 2-1/+6 2024-04-01[ci] formatGravatar Matthew Phillips 2-4/+4 2024-04-01Make ASTRO_DATABASE_FILE work with file paths (#10631)Gravatar Matthew Phillips 4-4/+43 2024-04-01Make `@astrojs/markdown-remark` a dep in `@astrojs/markdoc` (#10632)Gravatar Bjorn Lu 3-4/+9 2024-04-01[ci] formatGravatar Ben Holmes 1-2/+2 2024-04-01db: Seed on dev server startup (#10599)Gravatar Ben Holmes 3-11/+54 2024-04-01Remove deprecated APIs from `@astrojs/markdown-remark` (#10629)Gravatar Bjorn Lu 7-81/+23 2024-04-01Lazy loaded shiki languages during syntax highlighting (#10618)Gravatar James Garbutt 16-110/+169 2024-04-01Move nft warnings behind verbose logging (#10609)Gravatar Matthew Phillips 2-2/+7 2024-04-01Fixes issue with head content being pushed into body (#10608)Gravatar Matthew Phillips 3-7/+12 2024-04-01feat: rework child rendering to use class (#10624)Gravatar James Garbutt 2-33/+51 2024-04-01refactor: Drop Preact compat hack, remove incorrect alias (#10585)Gravatar Ryan Christian 2-8/+7 2024-04-01[ci] formatGravatar ktym4a 1-1/+1 2024-04-01fix(starlog): Correct layout syntax. (#10627)Gravatar ktym4a 2-7/+7 2024-04-01fix: use ReadableStream for response object if deno (#10495)Gravatar Satya Rohith 3-2/+13 2024-03-29Remove the ssr external for vue (#10601)Gravatar Tyler van der Hoeven 2-1/+5 2024-03-29reset history title after push/replace but prior to assignment to location (#...Gravatar Martin Trapp 2-1/+6 2024-03-29fix: dont error on nullish prop values in jsx runtime (#10584)Gravatar duanwilliam 2-1/+6 2024-03-28[ci] release (#10598)astro@4.5.12@astrojs/vercel@7.5.0@astrojs/markdoc@0.9.3@astrojs/internal-helpers@0.4.0@astrojs/db@0.9.8Gravatar Houston (Bot) 6-50/+52 2024-03-28[ci] formatGravatar TK 1-2/+2 2024-03-28feat: allow dynamic route segments in isr.exclude array (#10513)Gravatar TK 5-3/+69 2024-03-28[ci] formatGravatar Houston (Bot) 2-3/+3 2024-03-28[ci] release (#10597)Gravatar Houston (Bot) 37-66/+89 2024-03-28db: Rework index config with generated index names (#10589)Gravatar Ben Holmes 6-68/+344