tdd · git:20260826.34a9b20 · 2026-08-26 · sha256 eb6394db00b00bcc
tdd git:20260826.34a9b20A
Immutable. This exact content is served forever at /api/v1/blob/eb6394db00b00bcc.
---
name: tdd
description: Test-Driven Development 방법론 스킬
compatibility: omp
---
# TDD (Test-Driven Development) Skill
테스트를 먼저 작성하고 구현하는 RED-GREEN-REFACTOR 사이클을 적용하는 스킬입니다.
## 핵심 원칙
**테스트 없이 코드를 작성하지 않는다.** 이 규칙을 위반하면 작업을 거부합니다.
## RED-GREEN-REFACTOR 사이클
### RED 단계: 실패하는 테스트 작성
```
1. 구현하려는 동작을 테스트로 먼저 작성
2. 테스트가 실패하는지 확인 (컴파일 에러 포함)
3. 올바른 실패 이유인지 확인
```
테스트 작성 원칙:
- 테스트는 하나의 동작만 검증
- 이름은 `Test[Subject]_[Scenario]_[Expected]` 형식
- Given-When-Then 구조 사용
- Table-driven tests로 다양한 케이스 커버
```go
func TestCalculate_WithZeroInput_ReturnsError(t *testing.T) {
t.Parallel()
// Given
input := 0
// When
_, err := Calculate(input)
// Then
assert.Error(t, err)
assert.ErrorIs(t, err, ErrInvalidInput)
}
```
### GREEN 단계: 최소 구현으로 테스트 통과
```
1. 테스트를 통과시키는 가장 단순한 코드 작성
2. 과도한 최적화나 일반화 금지
3. 테스트 통과만을 목표로
```
### REFACTOR 단계: 코드 품질 개선
```
1. 중복 제거 (DRY 원칙)
2. 명명 개선
3. 복잡도 감소
4. 테스트는 항상 그린 상태 유지
```
## Go 테스트 패턴
```go
func TestMyFunction(t *testing.T) {
t.Parallel()
tests := []struct {
name string
input int
want int
wantErr bool
}{
{"정상 입력", 5, 25, false},
{"영 입력", 0, 0, true},
{"음수 입력", -1, 0, true},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
got, err := MyFunction(tt.input)
if tt.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
assert.Equal(t, tt.want, got)
})
}
}
```
## 완료 기준
- [ ] 모든 새 코드에 테스트 존재
- [ ] 테스트 커버리지 85% 이상
- [ ] `go test -race ./...` 통과
- [ ] 각 단계에서 커밋 생성