Skip to content

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).

Запуск тестов

bash
bun test

Тесты пишутся на JavaScript или TypeScript с использованием API, подобного Jest. Полную документацию см. в разделе Написание тестов.

ts
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 пока не поддерживаются.

bash
bun test <filter> <filter> ...

Для фильтрации по имени теста используйте флаг -t/--test-name-pattern.

sh
# запустить все тесты или наборы тестов с "addition" в имени
bun test --test-name-pattern addition

Для запуска конкретного файла в средстве запуска тестов убедитесь, что путь начинается с ./ или /, чтобы отличить его от имени фильтра.

bash
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 добавьте следующий шаг:

yaml
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.

sh
bun test --reporter=junit --reporter-outfile=./bun.xml

Это продолжит вывод в stdout/stderr как обычно, а также запишет отчёт JUnit XML в указанный путь в самом конце запуска тестов.

JUnit XML — популярный формат для отчётов о результатах тестирования в конвейерах CI/CD.

Таймауты

Используйте флаг --timeout для указания таймаута для каждого теста в миллисекундах. Если время теста истекает, он будет помечен как неудачный. Значение по умолчанию — 5000.

bash
# значение по умолчанию 5000
bun test --timeout 20

Параллельное выполнение тестов

По умолчанию Bun запускает все тесты последовательно в каждом тестовом файле. Вы можете включить параллельное выполнение для запуска асинхронных тестов параллельно, что значительно ускорит наборы тестов с независимыми тестами.

Флаг --concurrent

Используйте флаг --concurrent для запуска всех тестов параллельно в соответствующих файлах:

sh
bun test --concurrent

Когда этот флаг включён, все тесты будут выполняться параллельно, если явно не помечены с test.serial.

Флаг --max-concurrency

Управляйте максимальным количеством тестов, запускаемых одновременно, с помощью флага --max-concurrency:

sh
# Ограничить до 4 параллельных тестов
bun test --concurrent --max-concurrency 4

# По умолчанию: 20
bun test --concurrent

Это помогает предотвратить исчерпание ресурсов при запуске многих параллельных тестов. Значение по умолчанию — 20.

test.concurrent

Пометьте отдельные тесты для параллельного запуска, даже если флаг --concurrent не используется:

ts
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 включён:

ts
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 для многократного запуска каждого теста. Это полезно для обнаружения нестабильных или недетерминированных сбоев тестов.

sh
bun test --rerun-each 100

Рандомизация порядка выполнения тестов

Используйте флаг --randomize для запуска тестов в случайном порядке. Это помогает обнаружить тесты, которые зависят от общего состояния или порядка выполнения.

sh
bun test --randomize

При использовании --randomize сид, используемый для рандомизации, будет отображён в сводке тестов:

sh
bun test --randomize
txt
# ... вывод теста ...
 --seed=12345
 2 pass
 8 fail
Ran 10 tests across 2 files. [50.00ms]

Воспроизводимый случайный порядок с --seed

Используйте флаг --seed для указания сида для рандомизации. Это позволяет воспроизвести тот же порядок тестов при отладке сбоев, зависящих от порядка.

sh
# Воспроизвести предыдущий рандомизированный запуск
bun test --seed 123456

Флаг --seed подразумевает --randomize, поэтому вам не нужно указывать оба. Использование одного и того же значения сида всегда будет давать одинаковый порядок выполнения тестов, что упрощает отладку периодических сбоев, вызванных взаимозависимостями тестов.

Прерывание с --bail

Используйте флаг --bail для досрочного прерывания запуска тестов после заранее определённого количества неудач тестов. По умолчанию Bun запускает все тесты и сообщает обо всех неудачах, но иногда в средах CI предпочтительнее завершить раньше, чтобы уменьшить использование CPU.

sh
# прервать после 1 неудачи
bun test --bail

# прервать после 10 неудач
bun test --bail=10

Режим наблюдения

Подобно bun run, вы можете передать флаг --watch в bun test для наблюдения за изменениями и повторного запуска тестов.

bash
bun test --watch

Хуки жизненного цикла

Bun поддерживает следующие хуки жизненного цикла:

ХукОписание
beforeAllВыполняется один раз перед всеми тестами.
beforeEachВыполняется перед каждым тестом.
afterEachВыполняется после каждого теста.
afterAllВыполняется один раз после всех тестов.

Эти хуки могут быть определены внутри тестовых файлов или в отдельном файле, который предварительно загружается с помощью флага --preload.

sh
bun test --preload ./setup.ts

Полную документацию см. в разделе Тест > Жизненный цикл.

Мокирование

Создавайте мок-функции с помощью функции mock.

ts
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(), он ведёт себя идентично.

ts
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.

ts
// пример использования toMatchSnapshot
import { test, expect } from "bun:test";

test("snapshot", () => {
  expect({ a: 1 }).toMatchSnapshot();
});

Для обновления снимков используйте флаг --update-snapshots.

sh
bun test --update-snapshots

Полную документацию см. в разделе Тест > Снимки.

Тестирование UI и DOM

Bun совместим с популярными библиотеками тестирования UI:

Полную документацию см. в разделе Тест > Тестирование DOM.

Производительность

Средство запуска тестов Bun быстрое.

Интеграция с AI-агентами

При использовании средства запуска тестов Bun с AI-ассистентами кодирования вы можете включить более тихий вывод для улучшения читаемости и уменьшения шума контекста. Эта функция минимизирует многословность вывода тестов, сохраняя при этом важную информацию о неудачах.

Переменные окружения

Установите любую из следующих переменных окружения для включения AI-дружественного вывода:

  • CLAUDECODE=1 — для Claude Code
  • REPL_ID=1 — для Replit
  • AGENT=1 — общий флаг AI-агента

Поведение

При обнаружении среды AI-агента:

  • Только неудачи тестов отображаются подробно
  • Индикаторы прошедших, пропущенных и todo тестов скрыты
  • Сводная статистика остаётся неизменной
bash
# Пример: Включить тихий вывод для Claude Code
CLAUDECODE=1 bun test

# Всё ещё показывает неудачи и сводку, но скрывает многословный вывод прошедших тестов

Эта функция особенно полезна в рабочих процессах разработки с AI-ассистентами, где уменьшенная многословность вывода улучшает эффективность контекста, сохраняя при этом видимость неудач тестов.

Bun от www.bunjs.com.cn