TL;DR
- 테스트 실패 시 전체 테스트를 반복 실행하는 비효율을 해결
- 실패한 테스트만 먼저 수정/재실행 → 성공 시 도메인별 전체 테스트 수행
- unit, integration, api, e2e, security, performance 등 모든 테스트 도메인 지원
- 테스트 프레임워크 자동 감지 (Jest, Vitest, Pytest, Go test 등)
왜 이 스킬을 만들었나?
개발하다 보면 테스트를 돌리고, 실패하면 고치고, 다시 전체 테스트를 돌리는 과정을 반복하게 됩니다. 문제는 이 과정이 생각보다 비효율적이라는 것입니다.
기존 방식의 문제점
전체 테스트 실행 (5분)
→ 2개 실패 발견
→ 첫 번째 버그 수정
→ 전체 테스트 실행 (5분) ← 불필요한 재실행
→ 아직 1개 실패
→ 두 번째 버그 수정
→ 전체 테스트 실행 (5분) ← 또 불필요한 재실행
→ 통과!
총 소요: 15분 (실제 수정 시간 제외)
2개의 버그를 고치는데 전체 테스트를 3번이나 돌렸습니다. 테스트 suite가 클수록 이 낭비는 기하급수적으로 늘어납니다.
Smart Test Runner 방식
전체 테스트 실행 (5분)
→ 2개 실패 발견
→ 첫 번째 버그 수정
→ 실패한 테스트만 실행 (3초) ← 핵심!
→ 통과
→ 두 번째 버그 수정
→ 실패한 테스트만 실행 (3초)
→ 통과
→ 도메인 전체 테스트 실행 (5분) ← 최종 검증
→ 모두 통과!
총 소요: 10분 + 6초
같은 작업인데 시간이 거의 절반으로 줄었습니다.
핵심 기능
1. 도메인별 테스트 자동 감지
프로젝트 구조를 분석하여 어떤 종류의 테스트가 있는지 자동으로 파악합니다.
| 도메인 | 감지 패턴 |
|---|---|
| unit | test/unit/, __tests__/, *.spec.ts |
| integration | test/integration/ |
| api | test/api/, api.test.* |
| api-e2e | test/api-e2e/, e2e/api/ |
| browser-e2e | cypress/, playwright/ |
| security | test/security/ |
| performance | test/performance/, k6/ |
| oapi | openapi.yaml, contract tests |
2. 실패 우선 재실행 전략
핵심 워크플로우는 다음과 같습니다:
1. 도메인별 테스트 실행
↓
2. 실패 감지 → 원인 분석
↓
3. 코드/테스트 수정
↓
4. 실패한 테스트만 재실행 ← 핵심
↓
5. 통과? → 도메인 전체 테스트 재실행
↓
6. 다음 도메인으로 이동
3. 테스트 프레임워크별 실패 테스트만 실행
각 테스트 러너에 맞는 명령어를 자동으로 사용합니다:
# Jest - 특정 테스트만 실행
npx jest --testNamePattern="should parse JSON correctly"
npx jest path/to/failed.test.ts
# Vitest
npx vitest run -t "should parse JSON correctly"
# Pytest
pytest path/to/test_file.py::test_function_name
pytest -k "test_parse_json"
# Go
go test -run TestParseJSON ./pkg/parser/
4. 실패 원인 자동 분류
테스트 실패 시 원인을 분석하고 해결 방향을 제시합니다:
| 실패 유형 | 지표 | 일반적인 해결책 |
|---|---|---|
| Assertion mismatch | expected X, got Y |
로직 수정 또는 기대값 업데이트 |
| Type error | TypeError, undefined |
타입 수정, null 체크 추가 |
| Timeout | Timeout exceeded |
타임아웃 증가 또는 비동기 수정 |
| Mock issue | mock not called |
Mock 설정 또는 구현 수정 |
| Environment | ENOENT, connection refused |
환경 설정 또는 CI에서 skip |
실행 결과 리포트
테스트 실행 결과를 구조화된 형태로 보여줍니다:
## Test Execution Report
### Domain: unit
- Total: 45 tests
- Passed: 43
- Failed: 2
- Status: FIXING
#### Failed Tests
1. `src/utils/parser.test.ts` - "should parse JSON correctly"
- Error: Expected { a: 1 }, got { a: "1" }
- Cause: Type coercion issue in parseJSON()
- Fix: Added parseInt() conversion
- Re-run: PASSED
2. `src/api/client.test.ts` - "should retry on failure"
- Error: Timeout after 5000ms
- Cause: Missing mock for fetch
- Fix: Added fetch mock
- Re-run: PASSED
#### Full Suite Re-run: PASSED (45/45)
### Domain: integration
- Status: RUNNING...
사용 방법
Claude Code에서 다음과 같이 요청하면 됩니다:
- “테스트 돌리고 에러 수정해줘”
- “run tests and fix”
- “unit 테스트 실행해줘”
- “테스트 실패 원인 분석해줘”
스킬이 자동으로 트리거되어 효율적인 테스트 워크플로우를 실행합니다.
마치며
테스트는 코드 품질을 보장하는 핵심 도구입니다. 하지만 비효율적인 테스트 실행 방식은 개발 속도를 저하시킵니다. Smart Test Runner는 “실패 우선 재실행” 전략으로 이 문제를 해결합니다.
핵심은 간단합니다: 고친 것만 먼저 확인하고, 확인되면 전체를 검증한다.
전체 코드는 GitHub에서 확인할 수 있습니다: https://github.com/greeun/smart-test-runner