Claude Code가 테스트 실패를 자동 감지·수정하고, 린트 오류를 반복 해결하는 자동 루프(Read-Plan-Fix-Verify) 구성 방법.
테스트·린트 자동 루프 — 오류 없을 때까지 반복하기
개발에서 가장 반복적인 작업 중 하나가 "코드 수정 → 테스트 실행 → 실패 확인 → 수정 → 재실행"의 사이클입니다. 이 루프를 Claude Code에게 맡기면 사람은 초기 목표 설정과 최종 검토만 담당하고 중간 반복 과정은 자동화됩니다. 2024년 Anthropic 연구에 따르면 이 방식으로 테스트 통과 시간이 평균 67% 단축되었습니다.
테스트 자동 루프 기본 패턴
claude -p "
목표: 모든 테스트를 통과시킬 것
절차:
1. npm run test 실행
2. 실패한 테스트 분석
3. 원인 파악 후 코드 수정
4. 다시 npm run test 실행
5. 모든 테스트 통과 시 완료, 실패 시 2로 돌아가
6. 10번 반복 후에도 실패하면 실패 원인 요약 후 종료
제약: 테스트 코드 자체는 수정하지 말 것 (구현 코드만 수정)
" \
--allowedTools "Read,Edit,Bash(npm run test*),Glob,Grep" \
--output-format stream-json
"테스트 코드 자체는 수정하지 말 것" 제약이 중요합니다. 이 지시 없이는 Claude가 테스트 기대값을 바꿔 통과시키는 우회책을 선택할 수 있습니다.
린트 자동 수정 루프
claude -p "
ESLint 오류를 모두 수정해줘.
1. npm run lint 2>&1 실행해서 오류 목록 파악
2. 파일별로 오류 분류 (unused vars / any타입 / missing deps 등)
3. 각 파일 열어서 해당 오류만 수정 (다른 코드 변경 금지)
4. npm run lint 재실행
5. 오류 0개 확인 시 완료
6. 자동 수정 불가한 오류(디자인 결정 필요)는 목록으로 보고 후 종료
" \
--allowedTools "Read,Edit,Bash(npm run lint*),Glob,Grep"
타입 체크 + 빌드 전체 통과 루프
claude -p "
다음 순서로 코드 품질을 완전히 확보해줘:
단계 1 — TypeScript 타입 오류 수정
npx tsc --noEmit 실행 → 오류 수정 → 재실행 → 오류 0개
단계 2 — ESLint 오류 수정
npm run lint 실행 → 오류 수정 → 재실행 → 오류 0개
단계 3 — 빌드 통과
npm run build 실행 → 빌드 오류 수정 → 재실행 → 성공
각 단계 완료 시 '✅ 단계 N 완료'를 출력하고 다음 단계 진행.
수정 불가한 오류는 건너뛰고 목록 기록.
최종 요약: 수정된 파일 수, 남은 오류 목록.
" \
--allowedTools "Read,Edit,Glob,Grep,Bash(npx tsc*),Bash(npm run*)"
Watch 모드와 Hooks 조합
파일 저장 시마다 자동으로 테스트를 실행하는 Watch 루프입니다. 개발 중 실시간 피드백을 원할 때 사용합니다.
# 터미널 1: Claude Code 편집 작업
claude "UserCard 컴포넌트에 로딩 스켈레톤 추가해줘"
# 터미널 2: Jest Watch 모드 (별도 실행)
npm run test -- --watch --testPathPattern="UserCard"
# 또는 Hooks로 통합
# .claude/settings.json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "if [[ '$FILE' == *.test.ts || '$FILE' == *.test.tsx ]]; then npx jest '$FILE' --passWithNoTests 2>&1 | tail -5; fi"
}
]
}
]
}
}
테스트 생성 → 구현 TDD 루프
테스트를 먼저 작성하고 통과할 구현을 만드는 TDD 방식도 자동화할 수 있습니다.
claude -p "
formatCurrency(amount, currency) 유틸리티 함수를 TDD로 구현해줘.
1. __tests__/formatCurrency.test.ts 먼저 작성
- USD: '$1,234.56' 형식
- KRW: '₩1,234' 형식 (소수점 없음)
- EUR: '€1,234.56' 형식
- 음수, 0, 매우 큰 수 엣지 케이스
2. 테스트 실행 → 실패 확인 (Red)
3. utils/formatCurrency.ts 구현
- Intl.NumberFormat 사용
- TypeScript 타입 완전 명시
4. 테스트 실행 → 통과 확인 (Green)
5. 중복 제거·가독성 개선 리팩토링 (Refactor)
리팩토링 후 테스트 여전히 통과 확인
" \
--allowedTools "Read,Write,Edit,Bash(npx jest*),Glob"
CI 실패 자동 수정 패턴
#!/bin/bash
# CI 로그를 파싱해서 Claude에게 수정 요청
CI_LOG=$(cat ci-failure.log)
claude -p "
다음 CI 실패 로그를 분석하고 원인을 수정해줘.
실패 로그:
$CI_LOG
제약:
- 테스트 기대값 변경 금지
- 린트 규칙 비활성화(@eslint-disable) 금지
- 타입 단언(as any) 추가 금지
수정 후 로컬에서 동일 명령 재실행해서 통과 확인.
" \
--allowedTools "Read,Edit,Glob,Grep,Bash(npm run*),Bash(npx*)"
자동 루프에서 가장 중요한 설계 결정은 "무엇을 바꾸면 안 되는가"를 명시하는 것입니다. 제약 없이 "테스트를 통과시켜줘"라고 하면 Claude는 가장 쉬운 방법(테스트 삭제, 기대값 변경)을 선택할 수 있습니다. 좋은 자동화 프롬프트는 목표만큼 제약도 명확합니다.
핵심 정리
- 테스트 루프 프롬프트에 "테스트 코드 수정 금지" 제약 필수 — 목표(통과)만큼 제약(방법 제한)이 품질을 결정
- 단계별 순서(타입 체크 → 린트 → 빌드) 명시로 의존성 오류 방지 — 중간 완료 시 체크포인트 출력해 진행 상황 추적
- Hooks + PostToolUse로 파일 저장마다 관련 테스트 자동 실행 — 개발 중 실시간 피드백 루프 구성
관련 검색어 · 클로드 코드 · Claude Code · 테스트 자동화 · 린트 자동 루프 · Jest 자동화 · TDD 자동화 · 자동 테스트 통과