Bun currently has four different kinds of tests
To run the tests:
make test-all
bun wiptest
Browser tests run end-to-end inside of Puppeteer and execute code transpiled by bun dev
. These tests are in ./snippets.
The interface is:
// this function is called after import()
// if testDone() is never called, the test fails
export function test() {
return testDone(import.meta.url);
}
On success, it saves a snapshot to ./snapshots which is checked into git.
- Create a new file in the
snippets
directory. - Append the filename to ./scripts/snippets.json
- Run
bun dev
inside this folder in one terminal window - Run
make integration-test-dev
These tests are run twice. Once with HMR enabled and once with HMR disabled. HMR changes the output enough to warrant it's own special treatment.
To run the browser tests with HMR on a production build:
make test-with-hmr
To run the browser tests without HMR on a production build:
make test-with-no-hmr
To run the browser tests with HMR on a debug build:
make test-dev-with-hmr
To run the browser tests without HMR on a debug build:
make test-dev-no-hmr
To run the browser tests on whatever version of bun is running on port 3000:
make integration-test-dev
These were the first tests bun started with
These tests are in ./bun.js and are files which are either .test.js
or .test.ts
files.
These test that the runtime behaves as expected. These also test the transpiler, both because test files are transpiled and directly by running the transpiler via Bun.Transpiler
.
- Create a new file in ./bun.js with
.test
in the name.
These test use bun:test
as the import (though you can also import from vitest
or jest and it will work).
This will eventually be a public test runner for bun, but the reporter isn't very good yet and it doesn't run in parallel.
The syntax intends for Jest compatibility.
import { describe, expect, it } from "bun:test";
describe("Example", () => {
it("should work", () => {
expect(1).toBe(1);
});
});
Run bun wiptest ${part-of-file-name}
If you run the test in the top-level bun repo directory, it will take an extra couple seconds because bun wiptest
will scan through all of WebKit recursively. Consider running it in the bun.js
directory instead.
These run the bash files in the apps
directory.
They check end-to-end that the CLI works as expected.
# Install dependencies for running tests
# Does not run tests
make test-install
# Check a Create React App created via `bun create react ./foo` returns HTML
make test-create-react
# Check a Next.js app created via `bun create next ./foo` SSRs successfully
make test-create-next
# Check that bun run works for the same CLI args passed to npm run
make test-bun-run
# Check that "react" installed via bun install loads successfully
# and that deleting/adding updates the lockfile as expected
make test-bun-install
# Check that serving public paths works correctly
# and that files which should be transpiled are transpiled and files which shouldn't be aren't
make test-bun-dev
These tests live in various .zig
files throughout Bun's codebase, leveraging Zig's builtin test
keyword.
Currently, they're not run automatically nor is there a simple way to run all of them.
This is an area bun needs to improve in.