목표 : 클로드에게 클로드 스스로 검증을 완료(검증 루프를 종료)할 수 있는 기준 주기
여기서 테스트란 클로드가 직접 코드를 돌려보고, 실패하면 고치고, 다시 돌리는 일을 사용자 없이 클로드 스스로 반복하는 것이다.
Step 1. 테스트 안 된 곳 찾기
새 대화를 열고 다음 프롬프트를 보내면
@app/pricing.py @tests/test_pricing.py
pricing.py에서 테스트로 확인되지 않는 동작을 찾아줘. 아직 코드는 쓰지 마.
다음과 같이 coupon_rate에 범위 검증이 없기 때문에 1.5나 음수가 들어가도 그대로 계산되는 설계 구멍이 있다.

이제 이걸 구멍을 메울 것이다.
Step 2. 실패하는 테스트 먼저 작성하기
클로드는 구현을 먼저 하고 그 구현에 맞는 테스트를 나중에 한다.
그런데 그렇게 하면 이미 작성된 코드가 하라는 대로 테스트가 진행되기 때문에 코드에 실수가 있어도 테스트는 그 실수를 그대로 따라가면서 "통과"라고 말하게 된다.
이러한 문제를 해결하기 위해 순서를 뒤집을 것이다. (구현 → 테스트)에서 (테스트 → 구현)으로
- 테스트를 먼저 쓰면, 테스트가 "코드가 어떻게 동작해야 하는가"를 먼저 정해준다.
- 그 다음 코드는 그 기준을 맞추기만 하면 된다.
클로드에게 그냥 맡기면 원래 순서(구현 → 테스트)대로 가기 깨문에 명시적으로 막아야 한다.
이제 다음과 같이 클로드에게 프롬프트를 보낸다.
coupon_rate 범위 검증에 대한 테스트를 먼저 작성해줘.
- 0.0 미만이면 ValueError
- 1.0 초과면 ValueError
- 0.0과 1.0은 유효한 값
구현은 절대 하지 마. pricing.py는 건드리지 마.
tests/test_pricing.py에 테스트만 추가해.
그러면 tests/test_pricing.py에 대한 변경 내역이 화면에 뜨고 확인하고 승인한다.

클로드에게 "구현은 절대 하지 마"라고 했기 때문에 pricing.py는 고치지 않고 tests/test_pricing.py만 고쳤다.
"구현은 절대 하지 마"라는 문장이 없으면 클로드는 거의 확실히 pricing.py도 같이 고친다.
Step 3. 실패하는지 확인하고 커밋하기
터미널을 열고 다음 명령어를 입력하여 테스트를 직접 실행한다.
pytest -q

여기서는 실패하는 것이 정상이다.
pricing.py에는 아직 검증 코드가 없으므로 ValueError가 발생하지 않는다.
따라서 테스트 코드의 with pytest.raises(ValueError): 에 잡히지 않으므로
Failed: DID NOT RAISE ValueError가 발생한다.
이제 실패 테스트에 대하여 커밋한다.
git add .
git commit -m "test: coupon_rate 유효성 검사에 대한 실패 테스트를 추가"
Step 4. 테스트를 통과하도록 구현하기
이제 다음과 같이 프롬프트를 작성하여 클로드에게 보낸다.
이제 테스트가 통과하도록 pricing.py를 구현해줘.
테스트 파일은 절대 수정하지 마. 전부 통과할 때까지 계속해.
테스트 파일은 절대 수정하지 마.
클로드는 구현을 고치는 대신 테스트를 고쳐서 통과시키는 쪽으로 갈 때가 있다.
이는 문제를 해결하는 것이 아니므로 명시적으로 테스트를 수정하지 못하도록 한다.
전부 통과할 때까지 계속해.
클로드에게 작업 완료 조건을 명시하는 문장이다.
이게 있으면 클로드는 pytest를 직접 실행하고, 실패 내용을 읽고, 코드를 고치고, 다시 실행한다.
필요하면 여러 번 반복하며, 그동안 사용자가 할 일은 없다.

이제 다시 터미널에서 다음 명령어를 입력하여 테스트를 돌려본다.
pytest -q

테스트를 전부 통과한 것을 확인할 수 있다.
이제 테스트를 통과하였으니 다음 명령어를 통해 테스트 코드 test_pricing.py 를 건드려서 통과시키지는 않았는지 확인한다.
git diff tests/test_pricing.py

테스트 코드를 수정하지 않았기 때문에 변경 사항이 없는 것을 볼 수 있다.
Step 5. 검증 규칙을 CLAUDE.md에 작성하기
- 구현을 고쳐 테스트를 통과시킨다. 테스트를 고쳐 통과시키지 않는다.
이제 해당 프로젝트에서 새 대화를 열더라도 이 지시가 자동으로 전달되므로 매번 타이핑하지 않아도 된다.
마무리 커밋:
git add .
git commit -m "fix: coupon_rate 범위 검증"
Step 6. 검증 과정 요약
1. [검증 루프 실행 전 준비(한번)]
테스트 코드 작성 → 테스트 실행 → 테스트 실패 확인
2. [검증 루프]
구현 코드 수정 → 테스트 실행 → 테스트 결과 확인 → 테스트 실패 시 검증 루프 처음으로
핵심 정리
1. 테스트 코드(ex. tests/test_pricing.py)는 클로드가 판단하는 검증 루프 완료 기준이다.
diff 는 사용자가 화면을 보고 있어야 하지만, pytest 통과 여부는 클로드가 직접 확인할 수 있다.
2. 테스트를 먼저 써야 테스트가 기준이 된다.
구현 코드를 먼저 쓰면 테스트가 그 코드를 따라가면서 실수까지 함께 통과시킨다. 순서를 뒤집으면 테스트가 "어떻게 동작해야 하는가"를 먼저 정한다.
3. 검증 순서를 뒤집으려면 명시해야 한다.
테스트 과정에서 클로드에게 "구현은 절대 하지 마"라고 지시하지 않으면 없으면 클로드는 원래 순서대로 구현 코드부터 고친다.
4. 새 테스트는 처음에 실패해야 한다.
바로 통과했다면 그 테스트는 아무것도 확인하지 않고 있다는 뜻이다.
5. 실패하는 테스트를 커밋해두면 안전장치가 된다.
클로드가 구현 코드 대신 테스트 코드를 고쳐서 통과시켰는지를 git diff tests/로 확인할 수 있다.
6. 검증 루프가 끝나는 조건을 말로 알려준다.
"전부 통과할 때까지 계속해"라는 문장이 클로드를 검증 루프(실행-확인-수정의 반복) 속으로 넣는다.
7. 반복되는 지시는 CLAUDE.md로 옮긴다.
구현 과정에서 "테스트를 수정하지 마"가 그런 경우였다.
8. 이러한 검증 방식은 입력과 기대 출력을 명확히 적을 수 있는 작업에 특히 잘 맞는다.
금액 계산, 값 검증, 데이터 변환, 문자열 파싱 같은 것들. 이번에 다룬 coupon_rate 검증이 그런 예다.
'개발 > Claude Code' 카테고리의 다른 글
| [Claude Code] 서브에이전트(Subagent) (8) (0) | 2026.09.01 |
|---|---|
| [Claude Code] 스킬(Skill) (7) (0) | 2026.08.31 |
| [Claude Code] 체크포인트와 컨텍스트 관리 (5) (0) | 2026.08.28 |
| [Claude Code] CLAUDE.md (4) (0) | 2026.08.28 |
| [Claude Code] Plan 모드 (3) (0) | 2026.08.27 |