tddlisted
Install: claude install-skill kingkingburger/plugin-mh
# TDD: Test-Driven Development
테스트를 먼저 쓴다. 실패를 확인한다. 최소한의 코드로 통과시킨다.
> **핵심 원칙**: 테스트가 실패하는 걸 보지 않았다면, 그 테스트가 올바른 것을 검증하는지 알 수 없다.
---
## 절대 법칙
```
실패하는 테스트 없이 프로덕션 코드를 작성하지 않는다.
```
테스트 전에 코드를 썼다면? **삭제하고 다시 시작한다.**
- "참고용"으로 남기지 않는다
- "적응"시키면서 테스트를 쓰지 않는다
- 보지도 않는다
- 삭제는 삭제다
## 적��� 대상
**항상 적용:**
- 새 기능 구현
- 버그 수정
- 리팩토링
- 동작 변경
**예외 (사용자 확인 필요):**
- 일회용 프로토타입
- 생성된 코드 (codegen)
- 설정 파일
## RED → GREEN → REFACTOR
### RED: 실패하는 테스트 작성
하나의 동작을 검증하는 최소한의 테스트를 작성한다.
**좋은 테스트:**
- 이름이 동작을 설명한다
- 하나의 것만 테스트한다
- 실제 코드를 사용한다 (mock은 불가피할 때만)
**나쁜 테스트:**
- `test('works')` — 이름이 모호
- 이름에 "and"가 있다 → 분리해야 한다
- mock을 테스트하지 실제 코드를 테스트하지 않는다
### RED 검증: 실패를 확인한다
**필수. 절대 건너뛰지 않는다.**
```bash
# 테스트 실행
npm test path/to/test.test.ts # 또는 프로젝트의 테스트 명령
```
확인 사항:
- 테스트가 실패한다 (에러가 아니라 실패)
- 실패 메시지가 예상한 것과 같다
- 기능이 없어서 실패한다 (오타가 아니라)
**테스트가 통과한다면?** 이미 존재하는 동작을 테스트하고 있다. 테스트를 수정해라.
### GREEN: 최소한의 코드
테스트를 통과시키는 **가장 단순한** 코드를 작성한다.
- 기능을 추가하지 않는다
- 다른 코드를 리팩토링하지 않는다
- 테스트 범위를 넘어서 "개선"하지 않는다
### GREEN 검증: 통과를 확인한다
**필수.**
```bash
npm test path/to/test.test.ts
```
확인 사항:
- 테스트가 통과한다
- 다른 테스트도 여전히 통과한다
- 경고나 에러 없이 깨끗하다
**테스트 실패?** 코드를 수정한다, 테스트를 수정하지 않는다.
**다른 테스트 실패?** 지금 바로 수정한다.
### REFACTOR: 정리
GREEN 이후에만:
- 중복 제거
- 이름 개선
- 헬퍼 추출
테스트를 GREEN으로 유지한다. 동작을 추가하지 않는다.
### 반복
다음 기능을 위한 다음 실패하는 테스트로.
## 버그 수정 예시
**버그:** 빈 이메일이 허용됨
**RED**
```typescript
test('빈 이메일을 거부한다', async () => {
const result = await submitForm({ email: '' });
expect(result.error).toBe('이메일은