Smart Test Runner v2: 하이브리드 워크플로우로 테스트 시간 40% 단축

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 스킬

GitHub: https://github.com/greeun/smart-test-runner

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤