Skip to content

이 가이드에서는 concurrentTestGlob 옵션을 사용하여 파일 명명 패턴에 따라 선택적으로 테스트를 동시에 실행하는 방법을 보여줍니다.

프로젝트 구조

sh
my-project/
├── bunfig.toml
├── tests/
   ├── unit/
   ├── math.test.ts          # 순차적
   └── utils.test.ts         # 순차적
   └── integration/
       ├── concurrent-api.test.ts     # 동시
       └── concurrent-database.test.ts # 동시

설정

bunfig.toml 을 구성하여 "concurrent-" 접두사가 있는 테스트 파일을 동시에 실행하도록 설정합니다.

toml
[test]
# "concurrent-" 접두사가 있는 모든 테스트 파일을 동시에 실행
concurrentTestGlob = "**/concurrent-*.test.ts"

테스트 파일

단위 테스트 (순차적)

순차적 테스트는 상태 공유나 특정 순서 요구 사항이 있는 테스트에 적합합니다.

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

// 이 테스트는 기본적으로 순차적으로 실행됩니다
let sharedState = 0;

test("addition", () => {
  sharedState = 5 + 3;
  expect(sharedState).toBe(8);
});

test("uses previous state", () => {
  // 이 테스트는 이전 테스트의 상태에 의존합니다
  expect(sharedState).toBe(8);
});

통합 테스트 (동시)

Glob 패턴과 일치하는 파일의 테스트는 자동으로 동시에 실행됩니다.

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

// 이 테스트들은 파일명이 concurrentTestGlob 과 일치하므로 자동으로 동시에 실행됩니다.
// test() 사용은 concurrentTestGlob 과 일치하는 파일에서 test.concurrent() 와 동일합니다.
// 각 테스트는 독립적이며 병렬로 실행할 수 있습니다.

test("fetch user data", async () => {
  const response = await fetch("/api/user/1");
  expect(response.ok).toBe(true);
});

// 명시적으로 동시로 표시하기 위해 test.concurrent() 를 사용할 수도 있습니다
test.concurrent("fetch posts", async () => {
  const response = await fetch("/api/posts");
  expect(response.ok).toBe(true);
});

// 명시적으로 순차적으로 표시하기 위해 test.serial() 을 사용할 수도 있습니다
test.serial("fetch comments", async () => {
  const response = await fetch("/api/comments");
  expect(response.ok).toBe(true);
});

테스트 실행

bash
# 모든 테스트 실행 - concurrent-*.test.ts 파일은 동시에 실행됩니다
bun test

# 재정의: 모든 테스트를 강제로 동시에 실행
# 참고: 이는 bunfig.toml 을 재정의하고 glob 에 관계없이 모든 테스트를 동시에 실행합니다
bun test --concurrent

# 단위 테스트만 실행 (순차적)
bun test tests/unit

# 통합 테스트만 실행 (glob 패턴으로 인해 동시 실행)
bun test tests/integration

장점

  1. 점진적 마이그레이션: 파일 이름을 변경하여 파일별로 동시 테스트로 마이그레이션
  2. 명확한 조직: 파일 명명 규칙이 실행 모드를 나타냄
  3. 성능: 통합 테스트가 병렬로 더 빠르게 실행됨
  4. 안전성: 단위 테스트는 필요한 경우 순차적으로 유지됨
  5. 유연성: 파일 이름 변경으로 실행 모드 쉽게 변경

마이그레이션 전략

기존 테스트를 동시 실행으로 마이그레이션하려면:

  1. 독립적인 통합 테스트부터 시작 - 이들은 일반적으로 상태를 공유하지 않음
  2. Glob 패턴과 일치하도록 파일 이름 변경: mv api.test.ts concurrent-api.test.ts
  3. 테스트가 여전히 통과하는지 확인 - bun test 실행하여 경쟁 조건 없음 확인
  4. 상태 공유 문제 모니터링 - 불안정한 테스트나 예기치 않은 실패 감시
  5. 안정적인 테스트를 점진적으로 계속 마이그레이션 - 서두르지 않기

  • 설명적인 접두사 사용: concurrent-, parallel-, async-
  • 관련된 순차적 테스트는 같은 디렉터리에 함께 유지
  • 특정 테스트가 순차적으로 유지되어야 하는 이유를 주석으로 문서화
  • 순차적 파일에서 세분화된 제어를 위해 test.concurrent() 사용 (참고: concurrentTestGlob 에 의해 일치되는 파일에서는 일반 test() 도 동시에 실행됩니다)

여러 패턴

다른 테스트 카테고리에 대해 여러 패턴을 지정할 수 있습니다.

toml
[test]
concurrentTestGlob = [
  "**/integration/*.test.ts",
  "**/e2e/*.test.ts",
  "**/concurrent-*.test.ts"
]

이 설정은 다음 패턴 중 하나와 일치하는 경우 테스트를 동시에 실행합니다.

  • integration/ 디렉터리의 모든 테스트
  • e2e/ 디렉터리의 모든 테스트
  • 프로젝트 어디에나 있는 concurrent- 접두사가 있는 모든 테스트

Bun by www.bunjs.com.cn 편집