Skip to content

bun test глубоко интегрирован со средой выполнения Bun. Это часть того, что делает bun test быстрым и простым в использовании.

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

NODE_ENV

bun test автоматически устанавливает $NODE_ENV в "test", если он уже не установлен в окружении или через файлы .env. Это стандартное поведение для большинства средств запуска тестов и помогает обеспечить согласованное поведение тестов.

ts
import { test, expect } from "bun:test";

test("NODE_ENV установлен в test", () => {
  expect(process.env.NODE_ENV).toBe("test");
});

Вы можете переопределить это, установив NODE_ENV явно:

bash
NODE_ENV=development bun test

TZ (Часовой пояс)

По умолчанию все запуски bun test используют UTC (Etc/UTC) в качестве часового пояса, если не переопределено переменной окружения TZ. Это обеспечивает согласованное поведение даты и времени в различных средах разработки.

ts
import { test, expect } from "bun:test";

test("часовой пояс по умолчанию UTC", () => {
  const date = new Date();
  expect(date.getTimezoneOffset()).toBe(0);
});

Для тестирования с конкретным часовым поясом:

bash
TZ=America/New_York bun test

Таймауты тестов

Каждый тест имеет таймаут по умолчанию 5000 мс (5 секунд), если не переопределён явно. Тесты, превышающие этот таймаут, завершатся неудачей.

Глобальный таймаут

Измените таймаут глобально с помощью флага --timeout:

bash
bun test --timeout 10000  # 10 секунд

Таймаут для каждого теста

Установите таймаут для каждого теста в качестве третьего параметра функции теста:

ts
import { test, expect } from "bun:test";

test("быстрый тест", () => {
  expect(1 + 1).toBe(2);
}, 1000); // таймаут 1 секунда

test("медленный тест", async () => {
  await new Promise(resolve => setTimeout(resolve, 8000));
}, 10000); // таймаут 10 секунд

Бесконечный таймаут

Используйте 0 или Infinity для отключения таймаута:

ts
test("тест без таймаута", async () => {
  // Этот тест может выполняться неограниченно
  await someVeryLongOperation();
}, 0);

Обработка ошибок

Необработанные ошибки

bun test отслеживает необработанные отклонения промисов и ошибки, возникающие между тестами. Если такие ошибки возникают, код выхода будет ненулевым (конкретно, количество таких ошибок), даже если все тесты пройдут.

Это помогает обнаруживать ошибки в асинхронном коде, которые иначе могли бы остаться незамеченными:

ts
import { test } from "bun:test";

test("тест 1", () => {
  // Этот тест проходит
  expect(true).toBe(true);
});

// Эта ошибка происходит вне любого теста
setTimeout(() => {
  throw new Error("Необработанная ошибка");
}, 0);

test("тест 2", () => {
  // Этот тест также проходит
  expect(true).toBe(true);
});

// Запуск теста всё равно завершится неудачей с ненулевым кодом выхода
// из-за необработанной ошибки

Отклонения промисов

Необработанные отклонения промисов также перехватываются:

ts
import { test } from "bun:test";

test("проходящий тест", () => {
  expect(1).toBe(1);
});

// Это приведёт к неудаче запуска теста
Promise.reject(new Error("Необработанное отклонение"));

Пользовательская обработка ошибок

Вы можете настроить пользовательские обработчики ошибок в вашей настройке тестов:

ts
process.on("uncaughtException", error => {
  console.error("Необработанное исключение:", error);
  process.exit(1);
});

process.on("unhandledRejection", (reason, promise) => {
  console.error("Необработанное отклонение:", promise, "причина:", reason);
  process.exit(1);
});

Интеграция с флагами CLI

Несколько флагов CLI Bun могут быть использованы с bun test для изменения его поведения:

Использование памяти

bash
# Уменьшает использование памяти для VM средства запуска тестов
bun test --smol

Отладка

bash
# Прикрепляет отладчик к процессу средства запуска тестов
bun test --inspect
bun test --inspect-brk

Загрузка модулей

bash
# Запускает скрипты перед тестовыми файлами (полезно для глобальной настройки/моков)
bun test --preload ./setup.ts

# Устанавливает константы времени компиляции
bun test --define "process.env.API_URL='http://localhost:3000'"

# Настраивает пользовательские загрузчики
bun test --loader .special:special-loader

# Использует другой tsconfig
bun test --tsconfig-override ./test-tsconfig.json

# Устанавливает условия package.json для разрешения модулей
bun test --conditions development

# Загружает переменные окружения для тестов
bun test --env-file .env.test

Флаги, связанные с установкой

bash
# Влияют на любые сетевые запросы или автоматические установки во время выполнения теста
bun test --prefer-offline
bun test --frozen-lockfile

Наблюдение и горячая перезагрузка

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

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

bash
bun test --watch

Средство запуска тестов достаточно умно для определения того, какие тесты перезапускать:

ts
import { add } from "./math.js";
import { test, expect } from "bun:test";

test("сложение", () => {
  expect(add(2, 3)).toBe(5);
});

Если вы измените math.js, только math.test.ts будет перезапущен, а не все тесты.

Горячая перезагрузка

Флаг --hot предоставляет аналогичную функциональность, но более агрессивно пытается сохранить состояние между запусками:

bash
bun test --hot

Для большинства сценариев тестирования рекомендуется опция --watch, так как она обеспечивает лучшую изоляцию между запусками тестов.

Глобальные переменные

Следующие глобальные объекты автоматически доступны в тестовых файлах без импорта (хотя их можно импортировать из bun:test, если предпочитаете):

ts
// Все они доступны глобально
test("глобальная функция теста", () => {
  expect(true).toBe(true);
});

describe("глобальный describe", () => {
  beforeAll(() => {
    // глобальный beforeAll
  });

  it("глобальная функция it", () => {
    // it — это псевдоним для test
  });
});

// Совместимость с Jest
jest.fn();

// Совместимость с Vitest
vi.fn();

Вы также можете импортировать их явно, если предпочитаете:

ts
import { test, it, describe, expect, beforeAll, beforeEach, afterAll, afterEach, jest, vi } from "bun:test";

Интеграция с процессом

Коды выхода

bun test использует стандартные коды выхода:

  • 0: Все тесты пройдены, нет необработанных ошибок
  • 1: Произошли неудачи тестов
  • >1: Количество необработанных ошибок (даже если тесты пройдены)

Обработка сигналов

Средство запуска тестов правильно обрабатывает распространённые сигналы:

bash
# Грациозно останавливает выполнение теста
kill -SIGTERM <test-process-pid>

# Немедленно останавливает выполнение теста
kill -SIGKILL <test-process-pid>

Обнаружение окружения

Bun автоматически определяет определённые окружения и корректирует поведение:

ts
// Обнаружение GitHub Actions
if (process.env.GITHUB_ACTIONS) {
  // Bun автоматически выводит аннотации GitHub Actions
}

// Обнаружение CI
if (process.env.CI) {
  // Определённое поведение может быть скорректировано для сред CI
}

Соображения производительности

Один процесс

Средство запуска тестов запускает все тесты в одном процессе по умолчанию. Это обеспечивает:

  • Более быстрый запуск — Не нужно порождать несколько процессов
  • Общая память — Эффективное использование ресурсов
  • Простая отладка — Все тесты в одном процессе

Однако это означает:

  • Тесты разделяют глобальное состояние (используйте хуки жизненного цикла для очистки)
  • Один сбой теста может повлиять на другие
  • Нет настоящей параллелизации отдельных тестов

Управление памятью

bash
# Мониторинг использования памяти
bun test --smol  # Уменьшает footprint памяти

# Для больших наборов тестов рассмотрите разделение файлов
bun test src/unit/
bun test src/integration/

Изоляция тестов

Поскольку тесты выполняются в одном процессе, обеспечьте правильную очистку:

ts
import { afterEach } from "bun:test";

afterEach(() => {
  // Очистка глобального состояния
  global.myGlobalVar = undefined;
  delete process.env.TEST_VAR;

  // Сброс модулей при необходимости
  jest.resetModules();
});

Bun от www.bunjs.com.cn