TL;DR
- Phase 1 (Fast Fix):
--bail옵션으로 첫 실패 시 즉시 중단 → 수정 → 나머지 테스트 이어서 실행 - Phase 2 (Regression Check): 전체 테스트 1회 실행으로 회귀 버그 감지
- 새로운 스크립트:
list_tests.py(테스트 목록 수집),detect_test_config.sh(bail 명령어 자동 감지) - 효율성: 실패 5개 기준 기존 대비 40% 시간 절감
개선 배경: 기존 방식의 한계
이전 버전의 Smart Test Runner는 “실패한 테스트만 재실행 → 전체 도메인 재실행”이라는 전략을 사용했습니다. 그러나 이 방식에도 비효율이 있었습니다.
문제 상황
100개 테스트 실행 → #30에서 실패
→ 수정 → #30만 재실행 → 통과
→ 전체 100개 다시 실행 (1~100 전부) ← 비효율!
└── 이미 통과한 1~29, 31~100을 또 실행
테스트가 여러 개 실패할 경우, 이 비효율은 더욱 심각해집니다.
해결책: 하이브리드 워크플로우
새로운 접근법은 두 단계로 나뉩니다:
┌─────────────────────────────────────────────────────────────────┐
│ PHASE 1: Fast Fix (bail mode) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 테스트 실행 (--bail 옵션) │
│ ↓ │
│ 2. 실패 발생? ──No──→ 도메인 완료, 다음 도메인으로 │
│ │ │
│ Yes (즉시 중단) │
│ ↓ │
│ 3. 실패 분석 & 수정 │
│ ↓ │
│ 4. 해당 테스트만 재실행 │
│ ↓ │
│ 5. 통과? ──No──→ 3번으로 │
│ │ │
│ Yes │
│ ↓ │
│ 6. 나머지 테스트 이어서 실행 (처음부터 X) │
│ ↓ │
│ 7. 또 실패? ──Yes──→ 3번으로 │
│ │ │
│ No → Phase 1 완료 │
│ │
├─────────────────────────────────────────────────────────────────┤
│ PHASE 2: Regression Check (회귀 검증) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 8. 전체 테스트 실행 (bail 없이) │
│ ↓ │
│ 9. 새로운 실패? ──Yes──→ Phase 1의 3번으로 (회귀 버그 수정) │
│ │ │
│ No │
│ ↓ │
│ ✅ 도메인 완료, 다음 도메인으로 │
│ │
└─────────────────────────────────────────────────────────────────┘
Phase 1: Fast Fix (빠른 수정)
--bail 옵션을 사용하여 첫 번째 실패 시 즉시 중단합니다. 이렇게 하면:
- ✅ 실패 지점까지만 실행 (나머지 대기 시간 절약)
- ✅ 즉시 수정에 집중 가능
- ✅ 수정 후 나머지 테스트만 이어서 실행
Phase 2: Regression Check (회귀 검증)
Phase 1에서 모든 테스트가 개별적으로 통과했더라도, 수정 과정에서 회귀 버그가 발생할 수 있습니다. 예를 들어, #30 수정이 #15를 깨뜨릴 수 있습니다.
따라서 Phase 2에서 전체 테스트를 1회 실행하여 회귀를 감지합니다.
효율성 비교
| 시나리오 | 기존 방식 | 하이브리드 방식 | 절감률 |
|---|---|---|---|
| 100개 중 2개 실패 | 15분 | 12분 | 20% |
| 100개 중 5개 실패 | 30분 | 18분 | 40% |
| 100개 중 10개 실패 | 55분 | 25분 | 55% |
실패 수가 많을수록 하이브리드 방식의 효율이 극대화됩니다.
상세 시간 비교 (100개 테스트, 2개 실패 기준)
📊 기존 방식 (총 15분 30초)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[████████████████████] 전체 실행 5분
[█] 수정 30초
[████████████████████] 전체 재실행 5분
[█] 수정 30초
[████████████████████] 전체 재실행 5분
📊 하이브리드 방식 (총 11분 42초)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Phase 1:
[██████] --bail 실행 1.5분 (#30에서 중단)
[█] 수정 30초
[.] #30 재실행 3초
[██████████████] #31~100 실행 3.5분 (#70에서 중단)
[█] 수정 30초
[.] #70 재실행 3초
[██████] #71~100 실행 1.5분
Phase 2:
[████████████████████] 전체 회귀 검증 5분
프레임워크별 Bail 옵션
| 프레임워크 | 일반 명령어 | Bail 명령어 |
|---|---|---|
| Jest | npx jest |
npx jest --bail |
| Vitest | npx vitest run |
npx vitest run --bail |
| Pytest | pytest |
pytest -x |
| Go | go test ./... |
go test -failfast ./... |
| Playwright | npx playwright test |
npx playwright test --max-failures=1 |
새로운 스크립트
1. detect_test_config.sh (업데이트)
기존 스크립트에 bail_command 필드가 추가되었습니다.
bash ~/.claude/skills/smart-test-runner/scripts/detect_test_config.sh .
출력 예시:
{
"frameworks": {"javascript": "jest"},
"domains": [
{
"name": "unit",
"command": "npx jest",
"bail_command": "npx jest --bail",
"priority": 1
}
]
}
2. list_tests.py (신규)
“이어서 실행” 기능을 위해 테스트 목록을 사전에 수집합니다.
# 테스트 목록 수집
python ~/.claude/skills/smart-test-runner/scripts/list_tests.py -f jest --pretty
# 특정 인덱스 이후 나머지 테스트 명령어 생성
python ~/.claude/skills/smart-test-runner/scripts/list_tests.py -f jest -r 15
출력 예시:
{
"framework": "jest",
"total": 50,
"tests": [
{"id": "src/utils/parser.test.ts", "name": "parser"},
{"id": "src/api/client.test.ts", "name": "client"}
],
"bail_command": "npx jest --bail",
"remaining": {
"remaining_count": 35,
"run_remaining_command": "npx jest src/api/client.test.ts ..."
}
}
3. parse_test_output.py (기존)
테스트 결과를 파싱하여 실패 정보를 추출합니다.
npx jest --bail 2>&1 | python ~/.claude/skills/smart-test-runner/scripts/parse_test_output.py --pretty
스킬 구조
smart-test-runner/
├── SKILL.md # 스킬 정의 (310 lines)
└── scripts/
├── detect_test_config.sh # 환경 감지 + bail 명령어
├── list_tests.py # 테스트 목록 + 이어서 실행
└── parse_test_output.py # 결과 파싱
실제 사용 예시
Step 1: 환경 감지
bash ~/.claude/skills/smart-test-runner/scripts/detect_test_config.sh .
Step 2: 테스트 목록 수집
python ~/.claude/skills/smart-test-runner/scripts/list_tests.py -f jest --pretty
Step 3: Phase 1 실행 (bail 모드)
npx jest --bail
Step 4: 실패 시 수정 후 나머지 실행
# 실패한 테스트만 재실행
npx jest src/utils/parser.test.ts
# 나머지 테스트 이어서 실행
python list_tests.py -f jest -r 15 | jq -r '.remaining.run_remaining_command' | bash
Step 5: Phase 2 실행 (전체 회귀 검증)
npx jest # bail 없이 전체 실행
결과 리포트 형식
## Test Execution Report
### Domain: unit
#### Phase 1: Fast Fix
| # | Test | Status | Error | Fix | Re-run |
|---|------|--------|-------|-----|--------|
| 30 | parser.test.ts | FAILED → FIXED | Type coercion | Added parseInt | ✅ |
| 70 | client.test.ts | FAILED → FIXED | Timeout | Added mock | ✅ |
Remaining tests after #70: 30 tests → ✅ All passed
#### Phase 2: Regression Check
Full suite: 100/100 ✅
### Progress
- [x] [P1] unit (fixed 2)
- [x] [P2] unit (100/100)
- [ ] [P1] integration
- [ ] [P2] integration
회귀 버그 처리
⚠️ Phase 2에서 새로운 실패 발생 시
이는 회귀 버그입니다. #30 수정이 #15를 깨뜨렸을 수 있습니다.
- Phase 1 Step 3 (분석 & 수정)으로 돌아갑니다
- 수정 후 다시 Phase 2를 실행합니다
- 이 과정은 모든 테스트가 통과할 때까지 반복됩니다
마무리
하이브리드 워크플로우는 테스트 실행 시간을 대폭 줄이면서도 회귀 버그를 놓치지 않는 균형 잡힌 전략입니다.
- ✅ Phase 1: bail 모드로 빠르게 실패 수정
- ✅ Phase 2: 전체 실행으로 회귀 검증
- ✅ 스크립트 자동화: 테스트 목록 관리, bail 명령어 자동 감지
이전 포스트: Smart Test Runner: 테스트 실패 시 효율적인 재실행 전략을 위한 Claude Code 스킬