bun test глубоко интегрирован со средой выполнения Bun. Это часть того, что делает bun test быстрым и простым в использовании.
Переменные окружения
NODE_ENV
bun test автоматически устанавливает $NODE_ENV в "test", если он уже не установлен в окружении или через файлы .env. Это стандартное поведение для большинства средств запуска тестов и помогает обеспечить согласованное поведение тестов.
import { test, expect } from "bun:test";
test("NODE_ENV установлен в test", () => {
expect(process.env.NODE_ENV).toBe("test");
});Вы можете переопределить это, установив NODE_ENV явно:
NODE_ENV=development bun testTZ (Часовой пояс)
По умолчанию все запуски bun test используют UTC (Etc/UTC) в качестве часового пояса, если не переопределено переменной окружения TZ. Это обеспечивает согласованное поведение даты и времени в различных средах разработки.
import { test, expect } from "bun:test";
test("часовой пояс по умолчанию UTC", () => {
const date = new Date();
expect(date.getTimezoneOffset()).toBe(0);
});Для тестирования с конкретным часовым поясом:
TZ=America/New_York bun testТаймауты тестов
Каждый тест имеет таймаут по умолчанию 5000 мс (5 секунд), если не переопределён явно. Тесты, превышающие этот таймаут, завершатся неудачей.
Глобальный таймаут
Измените таймаут глобально с помощью флага --timeout:
bun test --timeout 10000 # 10 секундТаймаут для каждого теста
Установите таймаут для каждого теста в качестве третьего параметра функции теста:
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 для отключения таймаута:
test("тест без таймаута", async () => {
// Этот тест может выполняться неограниченно
await someVeryLongOperation();
}, 0);Обработка ошибок
Необработанные ошибки
bun test отслеживает необработанные отклонения промисов и ошибки, возникающие между тестами. Если такие ошибки возникают, код выхода будет ненулевым (конкретно, количество таких ошибок), даже если все тесты пройдут.
Это помогает обнаруживать ошибки в асинхронном коде, которые иначе могли бы остаться незамеченными:
import { test } from "bun:test";
test("тест 1", () => {
// Этот тест проходит
expect(true).toBe(true);
});
// Эта ошибка происходит вне любого теста
setTimeout(() => {
throw new Error("Необработанная ошибка");
}, 0);
test("тест 2", () => {
// Этот тест также проходит
expect(true).toBe(true);
});
// Запуск теста всё равно завершится неудачей с ненулевым кодом выхода
// из-за необработанной ошибкиОтклонения промисов
Необработанные отклонения промисов также перехватываются:
import { test } from "bun:test";
test("проходящий тест", () => {
expect(1).toBe(1);
});
// Это приведёт к неудаче запуска теста
Promise.reject(new Error("Необработанное отклонение"));Пользовательская обработка ошибок
Вы можете настроить пользовательские обработчики ошибок в вашей настройке тестов:
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 для изменения его поведения:
Использование памяти
# Уменьшает использование памяти для VM средства запуска тестов
bun test --smolОтладка
# Прикрепляет отладчик к процессу средства запуска тестов
bun test --inspect
bun test --inspect-brkЗагрузка модулей
# Запускает скрипты перед тестовыми файлами (полезно для глобальной настройки/моков)
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Флаги, связанные с установкой
# Влияют на любые сетевые запросы или автоматические установки во время выполнения теста
bun test --prefer-offline
bun test --frozen-lockfileНаблюдение и горячая перезагрузка
Режим наблюдения
При запуске bun test с флагом --watch средство запуска тестов будет следить за изменениями файлов и повторно запускать затронутые тесты.
bun test --watchСредство запуска тестов достаточно умно для определения того, какие тесты перезапускать:
import { add } from "./math.js";
import { test, expect } from "bun:test";
test("сложение", () => {
expect(add(2, 3)).toBe(5);
});Если вы измените math.js, только math.test.ts будет перезапущен, а не все тесты.
Горячая перезагрузка
Флаг --hot предоставляет аналогичную функциональность, но более агрессивно пытается сохранить состояние между запусками:
bun test --hotДля большинства сценариев тестирования рекомендуется опция --watch, так как она обеспечивает лучшую изоляцию между запусками тестов.
Глобальные переменные
Следующие глобальные объекты автоматически доступны в тестовых файлах без импорта (хотя их можно импортировать из bun:test, если предпочитаете):
// Все они доступны глобально
test("глобальная функция теста", () => {
expect(true).toBe(true);
});
describe("глобальный describe", () => {
beforeAll(() => {
// глобальный beforeAll
});
it("глобальная функция it", () => {
// it — это псевдоним для test
});
});
// Совместимость с Jest
jest.fn();
// Совместимость с Vitest
vi.fn();Вы также можете импортировать их явно, если предпочитаете:
import { test, it, describe, expect, beforeAll, beforeEach, afterAll, afterEach, jest, vi } from "bun:test";Интеграция с процессом
Коды выхода
bun test использует стандартные коды выхода:
0: Все тесты пройдены, нет необработанных ошибок1: Произошли неудачи тестов>1: Количество необработанных ошибок (даже если тесты пройдены)
Обработка сигналов
Средство запуска тестов правильно обрабатывает распространённые сигналы:
# Грациозно останавливает выполнение теста
kill -SIGTERM <test-process-pid>
# Немедленно останавливает выполнение теста
kill -SIGKILL <test-process-pid>Обнаружение окружения
Bun автоматически определяет определённые окружения и корректирует поведение:
// Обнаружение GitHub Actions
if (process.env.GITHUB_ACTIONS) {
// Bun автоматически выводит аннотации GitHub Actions
}
// Обнаружение CI
if (process.env.CI) {
// Определённое поведение может быть скорректировано для сред CI
}Соображения производительности
Один процесс
Средство запуска тестов запускает все тесты в одном процессе по умолчанию. Это обеспечивает:
- Более быстрый запуск — Не нужно порождать несколько процессов
- Общая память — Эффективное использование ресурсов
- Простая отладка — Все тесты в одном процессе
Однако это означает:
- Тесты разделяют глобальное состояние (используйте хуки жизненного цикла для очистки)
- Один сбой теста может повлиять на другие
- Нет настоящей параллелизации отдельных тестов
Управление памятью
# Мониторинг использования памяти
bun test --smol # Уменьшает footprint памяти
# Для больших наборов тестов рассмотрите разделение файлов
bun test src/unit/
bun test src/integration/Изоляция тестов
Поскольку тесты выполняются в одном процессе, обеспечьте правильную очистку:
import { afterEach } from "bun:test";
afterEach(() => {
// Очистка глобального состояния
global.myGlobalVar = undefined;
delete process.env.TEST_VAR;
// Сброс модулей при необходимости
jest.resetModules();
});