Skip to content

bun test 는 Bun 런타임과 깊이 통합되어 있습니다. 이것이 bun test 가 빠르고 사용하기 쉬운 이유의 일부입니다.

환경 변수

NODE_ENV

bun test 는 환경이나 .env 파일에서 이미 설정되지 않은 한 자동으로 $NODE_ENV"test" 로 설정합니다. 이는 대부분의 테스트 러너의 표준 동작이며 일관된 테스트 동작을 보장하는 데 도움이 됩니다.

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 실행은 TZ 환경 변수로 재정의되지 않는 한 UTC(Etc/UTC) 를 시간대로 사용합니다. 이는 다른 개발 환경에서 일관된 날짜 및 시간 동작을 보장합니다.

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

테스트 타임아웃

각 테스트는 명시적으로 재정의되지 않는 한 기본 타임아웃이 5000ms(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 는 테스트 간에 발생하는 처리되지 않은 promise 거부와 오류를 추적합니다. 이러한 오류가 발생하면 모든 테스트가 통과해도 최종 종료 코드는 0 이 아닌 값 (특히 이러한 오류의 수) 이 됩니다.

이는 그렇지 않으면 눈에 띄지 않을 수 있는 비동기 코드의 오류를 잡는 데 도움이 됩니다.

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

test("테스트 1", () => {
  // 이 테스트는 통과합니다
  expect(true).toBe(true);
});

// 테스트 외부에서 이 오류가 발생합니다
setTimeout(() => {
  throw new Error("처리되지 않은 오류");
}, 0);

test("테스트 2", () => {
  // 이 테스트도 통과합니다
  expect(true).toBe(true);
});

// 처리되지 않은 오류로 인해 테스트 실행은 0 이 아닌 종료 코드로 실패합니다

Promise 거부

처리되지 않은 promise 거부도 잡힙니다.

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 플래그 통합

여러 Bun CLI 플래그를 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

워치 및 핫 리로딩

워치 모드

--watch 플래그와 함께 bun test 를 실행하면 테스트 러너는 파일 변경을 감시하고 영향을 받은 테스트를 다시 실행합니다.

bash
bun test --watch

테스트 러너는 어떤 테스트를 다시 실행할지 똑똑하게 판단합니다.

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

test("addition", () => {
  expect(add(2, 3)).toBe(5);
});

math.js 를 수정하면 모든 테스트가 아닌 math.test.ts 만 다시 실행됩니다.

핫 리로딩

--hot 플래그는 실행 간 상태를 보존하려고 더 적극적으로 시도하는 유사한 기능을 제공합니다.

bash
bun test --hot

대부분의 테스트 시나리오에서는 --watch 가 더 나은 격리를 제공하므로 권장되는 옵션입니다.

전역 변수

다음 globals 는 가져오기 없이도 테스트 파일에서 자동으로 사용 가능합니다 (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  # 메모리 푸트프린트 감소

# 대규모 테스트 스위트의 경우 파일 분할 고려
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 by www.bunjs.com.cn 편집