bun test 는 Bun 런타임과 깊이 통합되어 있습니다. 이것이 bun test 가 빠르고 사용하기 쉬운 이유의 일부입니다.
환경 변수
NODE_ENV
bun test 는 환경이나 .env 파일에서 이미 설정되지 않은 한 자동으로 $NODE_ENV 를 "test" 로 설정합니다. 이는 대부분의 테스트 러너의 표준 동작이며 일관된 테스트 동작을 보장하는 데 도움이 됩니다.
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 실행은 TZ 환경 변수로 재정의되지 않는 한 UTC(Etc/UTC) 를 시간대로 사용합니다. 이는 다른 개발 환경에서 일관된 날짜 및 시간 동작을 보장합니다.
import { test, expect } from "bun:test";
test("기본적으로 시간대는 UTC", () => {
const date = new Date();
expect(date.getTimezoneOffset()).toBe(0);
});특정 시간대로 테스트하려면.
TZ=America/New_York bun test테스트 타임아웃
각 테스트는 명시적으로 재정의되지 않는 한 기본 타임아웃이 5000ms(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 는 테스트 간에 발생하는 처리되지 않은 promise 거부와 오류를 추적합니다. 이러한 오류가 발생하면 모든 테스트가 통과해도 최종 종료 코드는 0 이 아닌 값 (특히 이러한 오류의 수) 이 됩니다.
이는 그렇지 않으면 눈에 띄지 않을 수 있는 비동기 코드의 오류를 잡는 데 도움이 됩니다.
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 거부도 잡힙니다.
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 플래그 통합
여러 Bun CLI 플래그를 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워치 및 핫 리로딩
워치 모드
--watch 플래그와 함께 bun test 를 실행하면 테스트 러너는 파일 변경을 감시하고 영향을 받은 테스트를 다시 실행합니다.
bun test --watch테스트 러너는 어떤 테스트를 다시 실행할지 똑똑하게 판단합니다.
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 플래그는 실행 간 상태를 보존하려고 더 적극적으로 시도하는 유사한 기능을 제공합니다.
bun test --hot대부분의 테스트 시나리오에서는 --watch 가 더 나은 격리를 제공하므로 권장되는 옵션입니다.
전역 변수
다음 globals 는 가져오기 없이도 테스트 파일에서 자동으로 사용 가능합니다 (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 # 메모리 푸트프린트 감소
# 대규모 테스트 스위트의 경우 파일 분할 고려
bun test src/unit/
bun test src/integration/테스트 격리
테스트가 동일한 프로세스에서 실행되므로 적절한 정리를 보장하세요.
import { afterEach } from "bun:test";
afterEach(() => {
// 전역 상태 정리
global.myGlobalVar = undefined;
delete process.env.TEST_VAR;
// 필요시 모듈 재설정
jest.resetModules();
});