이 가이드에서는 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장점
- 점진적 마이그레이션: 파일 이름을 변경하여 파일별로 동시 테스트로 마이그레이션
- 명확한 조직: 파일 명명 규칙이 실행 모드를 나타냄
- 성능: 통합 테스트가 병렬로 더 빠르게 실행됨
- 안전성: 단위 테스트는 필요한 경우 순차적으로 유지됨
- 유연성: 파일 이름 변경으로 실행 모드 쉽게 변경
마이그레이션 전략
기존 테스트를 동시 실행으로 마이그레이션하려면:
- 독립적인 통합 테스트부터 시작 - 이들은 일반적으로 상태를 공유하지 않음
- Glob 패턴과 일치하도록 파일 이름 변경:
mv api.test.ts concurrent-api.test.ts - 테스트가 여전히 통과하는지 확인 -
bun test실행하여 경쟁 조건 없음 확인 - 상태 공유 문제 모니터링 - 불안정한 테스트나 예기치 않은 실패 감시
- 안정적인 테스트를 점진적으로 계속 마이그레이션 - 서두르지 않기
팁
- 설명적인 접두사 사용:
concurrent-,parallel-,async- - 관련된 순차적 테스트는 같은 디렉터리에 함께 유지
- 특정 테스트가 순차적으로 유지되어야 하는 이유를 주석으로 문서화
- 순차적 파일에서 세분화된 제어를 위해
test.concurrent()사용 (참고:concurrentTestGlob에 의해 일치되는 파일에서는 일반test()도 동시에 실행됩니다)
여러 패턴
다른 테스트 카테고리에 대해 여러 패턴을 지정할 수 있습니다.
toml
[test]
concurrentTestGlob = [
"**/integration/*.test.ts",
"**/e2e/*.test.ts",
"**/concurrent-*.test.ts"
]이 설정은 다음 패턴 중 하나와 일치하는 경우 테스트를 동시에 실행합니다.
integration/디렉터리의 모든 테스트e2e/디렉터리의 모든 테스트- 프로젝트 어디에나 있는
concurrent-접두사가 있는 모든 테스트