import Test from "/ru/snippets/cli/test.mdx";
Bun поставляется с быстрым встроенным совместимым с Jest средством запуска тестов. Тесты выполняются с помощью среды выполнения Bun и поддерживают следующие функции.
- TypeScript и JSX
- Хуки жизненного цикла
- Снимковое тестирование
- Тестирование UI и DOM
- Режим наблюдения с
--watch - Предварительная загрузка скриптов с
--preload
NOTE
Bun стремится к совместимости с Jest, но не всё реализовано. Для отслеживания совместимости см. [этот отслеживающий вопрос](https://github.com/oven-sh/bun/issues/1825).Запуск тестов
bun testТесты пишутся на JavaScript или TypeScript с использованием API, подобного Jest. Полную документацию см. в разделе Написание тестов.
import { expect, test } from "bun:test";
test("2 + 2", () => {
expect(2 + 2).toBe(4);
});Средство запуска рекурсивно ищет в рабочем каталоге файлы, соответствующие следующим шаблонам:
*.test.{js|jsx|ts|tsx}*_test.{js|jsx|ts|tsx}*.spec.{js|jsx|ts|tsx}*_spec.{js|jsx|ts|tsx}
Вы можете отфильтровать набор тестовых файлов для запуска, передав дополнительные позиционные аргументы в bun test. Будет запущен любой тестовый файл, путь которого соответствует одному из фильтров. Обычно эти фильтры будут именами файлов или каталогов; шаблоны glob пока не поддерживаются.
bun test <filter> <filter> ...Для фильтрации по имени теста используйте флаг -t/--test-name-pattern.
# запустить все тесты или наборы тестов с "addition" в имени
bun test --test-name-pattern additionДля запуска конкретного файла в средстве запуска тестов убедитесь, что путь начинается с ./ или /, чтобы отличить его от имени фильтра.
bun test ./test/specific-file.test.tsСредство запуска тестов запускает все тесты в одном процессе. Оно загружает все скрипты --preload (подробности см. в разделе Жизненный цикл), затем запускает все тесты. Если тест не проходит, средство запуска тестов завершится с ненулевым кодом выхода.
Интеграция с CI/CD
bun test поддерживает различные интеграции с CI/CD.
GitHub Actions
bun test автоматически определяет, работает ли он внутри GitHub Actions, и выводит аннотации GitHub Actions в консоль.
Никакой дополнительной настройки не требуется, кроме установки bun в рабочем процессе и запуска bun test.
Как установить bun в рабочем процессе GitHub Actions
Для использования bun test в рабочем процессе GitHub Actions добавьте следующий шаг:
jobs:
build:
name: build-app
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install bun
uses: oven-sh/setup-bun@v2
- name: Install dependencies # (предполагая, что у вашего проекта есть зависимости)
run: bun install # Вы можете использовать npm/yarn/pnpm вместо этого, если предпочитаете
- name: Run tests
run: bun testПосле этого вы получите аннотации GitHub Actions.
Отчёты JUnit XML (GitLab и др.)
Для использования bun test с репортёром JUnit XML вы можете использовать --reporter=junit в сочетании с --reporter-outfile.
bun test --reporter=junit --reporter-outfile=./bun.xmlЭто продолжит вывод в stdout/stderr как обычно, а также запишет отчёт JUnit XML в указанный путь в самом конце запуска тестов.
JUnit XML — популярный формат для отчётов о результатах тестирования в конвейерах CI/CD.
Таймауты
Используйте флаг --timeout для указания таймаута для каждого теста в миллисекундах. Если время теста истекает, он будет помечен как неудачный. Значение по умолчанию — 5000.
# значение по умолчанию 5000
bun test --timeout 20Параллельное выполнение тестов
По умолчанию Bun запускает все тесты последовательно в каждом тестовом файле. Вы можете включить параллельное выполнение для запуска асинхронных тестов параллельно, что значительно ускорит наборы тестов с независимыми тестами.
Флаг --concurrent
Используйте флаг --concurrent для запуска всех тестов параллельно в соответствующих файлах:
bun test --concurrentКогда этот флаг включён, все тесты будут выполняться параллельно, если явно не помечены с test.serial.
Флаг --max-concurrency
Управляйте максимальным количеством тестов, запускаемых одновременно, с помощью флага --max-concurrency:
# Ограничить до 4 параллельных тестов
bun test --concurrent --max-concurrency 4
# По умолчанию: 20
bun test --concurrentЭто помогает предотвратить исчерпание ресурсов при запуске многих параллельных тестов. Значение по умолчанию — 20.
test.concurrent
Пометьте отдельные тесты для параллельного запуска, даже если флаг --concurrent не используется:
import { test, expect } from "bun:test";
// Эти тесты выполняются параллельно друг другу
test.concurrent("concurrent test 1", async () => {
await fetch("/api/endpoint1");
expect(true).toBe(true);
});
test.concurrent("concurrent test 2", async () => {
await fetch("/api/endpoint2");
expect(true).toBe(true);
});
// Этот тест выполняется последовательно
test("sequential test", () => {
expect(1 + 1).toBe(2);
});test.serial
Принудительно выполняйте тесты последовательно, даже если флаг --concurrent включён:
import { test, expect } from "bun:test";
let sharedState = 0;
// Эти тесты должны выполняться по порядку
test.serial("first serial test", () => {
sharedState = 1;
expect(sharedState).toBe(1);
});
test.serial("second serial test", () => {
// Зависит от предыдущего теста
expect(sharedState).toBe(1);
sharedState = 2;
});
// Этот тест может выполняться параллельно, если включён --concurrent
test("independent test", () => {
expect(true).toBe(true);
});
// Цепочка квалификаторов тестов
test.failing.each([1, 2, 3])("chained qualifiers %d", input => {
expect(input).toBe(0); // Этот тест должен завершиться неудачей для каждого входного значения
});Повторный запуск тестов
Используйте флаг --rerun-each для многократного запуска каждого теста. Это полезно для обнаружения нестабильных или недетерминированных сбоев тестов.
bun test --rerun-each 100Рандомизация порядка выполнения тестов
Используйте флаг --randomize для запуска тестов в случайном порядке. Это помогает обнаружить тесты, которые зависят от общего состояния или порядка выполнения.
bun test --randomizeПри использовании --randomize сид, используемый для рандомизации, будет отображён в сводке тестов:
bun test --randomize# ... вывод теста ...
--seed=12345
2 pass
8 fail
Ran 10 tests across 2 files. [50.00ms]Воспроизводимый случайный порядок с --seed
Используйте флаг --seed для указания сида для рандомизации. Это позволяет воспроизвести тот же порядок тестов при отладке сбоев, зависящих от порядка.
# Воспроизвести предыдущий рандомизированный запуск
bun test --seed 123456Флаг --seed подразумевает --randomize, поэтому вам не нужно указывать оба. Использование одного и того же значения сида всегда будет давать одинаковый порядок выполнения тестов, что упрощает отладку периодических сбоев, вызванных взаимозависимостями тестов.
Прерывание с --bail
Используйте флаг --bail для досрочного прерывания запуска тестов после заранее определённого количества неудач тестов. По умолчанию Bun запускает все тесты и сообщает обо всех неудачах, но иногда в средах CI предпочтительнее завершить раньше, чтобы уменьшить использование CPU.
# прервать после 1 неудачи
bun test --bail
# прервать после 10 неудач
bun test --bail=10Режим наблюдения
Подобно bun run, вы можете передать флаг --watch в bun test для наблюдения за изменениями и повторного запуска тестов.
bun test --watchХуки жизненного цикла
Bun поддерживает следующие хуки жизненного цикла:
| Хук | Описание |
|---|---|
beforeAll | Выполняется один раз перед всеми тестами. |
beforeEach | Выполняется перед каждым тестом. |
afterEach | Выполняется после каждого теста. |
afterAll | Выполняется один раз после всех тестов. |
Эти хуки могут быть определены внутри тестовых файлов или в отдельном файле, который предварительно загружается с помощью флага --preload.
bun test --preload ./setup.tsПолную документацию см. в разделе Тест > Жизненный цикл.
Мокирование
Создавайте мок-функции с помощью функции mock.
import { test, expect, mock } from "bun:test";
const random = mock(() => Math.random());
test("random", () => {
const val = random();
expect(val).toBeGreaterThan(0);
expect(random).toHaveBeenCalled();
expect(random).toHaveBeenCalledTimes(1);
});В качестве альтернативы вы можете использовать jest.fn(), он ведёт себя идентично.
import { test, expect, mock } from "bun:test";
import { test, expect, jest } from "bun:test";
const random = mock(() => Math.random());
const random = jest.fn(() => Math.random()); Полную документацию см. в разделе Тест > Моки.
Снимковое тестирование
Снимки поддерживаются bun test.
// пример использования toMatchSnapshot
import { test, expect } from "bun:test";
test("snapshot", () => {
expect({ a: 1 }).toMatchSnapshot();
});Для обновления снимков используйте флаг --update-snapshots.
bun test --update-snapshotsПолную документацию см. в разделе Тест > Снимки.
Тестирование UI и DOM
Bun совместим с популярными библиотеками тестирования UI:
Полную документацию см. в разделе Тест > Тестирование DOM.
Производительность
Средство запуска тестов Bun быстрое.
Интеграция с AI-агентами
При использовании средства запуска тестов Bun с AI-ассистентами кодирования вы можете включить более тихий вывод для улучшения читаемости и уменьшения шума контекста. Эта функция минимизирует многословность вывода тестов, сохраняя при этом важную информацию о неудачах.
Переменные окружения
Установите любую из следующих переменных окружения для включения AI-дружественного вывода:
CLAUDECODE=1— для Claude CodeREPL_ID=1— для ReplitAGENT=1— общий флаг AI-агента
Поведение
При обнаружении среды AI-агента:
- Только неудачи тестов отображаются подробно
- Индикаторы прошедших, пропущенных и todo тестов скрыты
- Сводная статистика остаётся неизменной
# Пример: Включить тихий вывод для Claude Code
CLAUDECODE=1 bun test
# Всё ещё показывает неудачи и сводку, но скрывает многословный вывод прошедших тестовЭта функция особенно полезна в рабочих процессах разработки с AI-ассистентами, где уменьшенная многословность вывода улучшает эффективность контекста, сохраняя при этом видимость неудач тестов.