---
name: test-codegen
description: |
  함수·클래스·모듈에 대한 테스트 작성을 요청하거나, "테스트 만들어줘", "unit test", "테스트 코드", "test case 작성" 표현이 있을 때 활성화됩니다.
  수행 내용: 대상 코드를 분석해 Given-When-Then 패턴 기반의 단위 테스트를 자동 생성합니다. 정상 경로, 경계값, 예외 케이스를 모두 포함합니다.
  출력 형식: 테스트 프레임워크에 맞는 완성된 테스트 코드 + 각 케이스 설명.
---

# Test Codegen

## 목적

대상 코드를 분석해 빠뜨리기 쉬운 경계값·예외 케이스까지 포함한 완성도 높은 테스트를 자동 생성합니다.

## 테스트 케이스 분류

### 반드시 포함하는 케이스

| 분류 | 설명 |
|------|------|
| **Happy Path** | 정상 입력 → 기대 출력 |
| **Boundary Values** | 0, 빈 배열, 최대값, 최솟값, 문자열 경계 |
| **Error Cases** | null/undefined, 잘못된 타입, 유효성 실패 |
| **Edge Cases** | 중복 입력, 대용량, 동시 호출 등 |
| **Business Rules** | 도메인 규칙 검증 |

## 실행 절차

### 1단계: 코드 분석

- 함수 시그니처(입력 타입·반환 타입) 파악
- 내부 분기(if/else/switch) 경로 열거
- 외부 의존성(DB, API, 서비스) 식별 → mock 대상 결정
- 비즈니스 규칙 추출

### 2단계: 케이스 목록 작성

분석 결과에서 테스트해야 할 케이스를 모두 나열합니다.

### 3단계: 테스트 코드 생성

언어·프레임워크에 맞는 테스트 코드를 작성합니다.

**Given-When-Then 패턴:**
```
// Given: 초기 상태·입력 준비
// When: 동작 실행
// Then: 결과 검증
```

**프레임워크별 기본 선택:**
- Python → pytest
- JavaScript/TypeScript → Jest / Vitest
- Java → JUnit 5
- Go → testing 패키지

### 4단계: Mock 설계

외부 의존성은 최소한으로 mocking합니다.
DB는 가능하면 인메모리 DB 또는 실제 트랜잭션 롤백을 권장합니다.

## 출력 형식

```
## 테스트 케이스 목록
1. ✅ [케이스명]
2. ✅ [케이스명]
...

## 테스트 코드

```[언어]
[완성된 테스트 코드]
```

## 추가 권장 테스트
- [현재 범위에서 제외된 케이스와 이유]
```

## 사용 예시

**입력:**
> 이 함수 테스트 만들어줘:
> ```python
> def divide(a: float, b: float) -> float:
>     return a / b
> ```

**출력:**
> ```python
> import pytest
>
> def test_divide_normal():
>     # Given & When & Then
>     assert divide(10, 2) == 5.0
>
> def test_divide_by_zero():
>     with pytest.raises(ZeroDivisionError):
>         divide(10, 0)
>
> def test_divide_negative():
>     assert divide(-10, 2) == -5.0
>
> def test_divide_float():
>     assert divide(1, 3) == pytest.approx(0.333, rel=1e-3)
> ```

## 주의사항

- 테스트 대상 코드가 없으면 먼저 코드를 제공해달라고 요청합니다.
- 외부 의존성이 많은 경우 통합 테스트 vs 단위 테스트 범위를 사용자와 합의합니다.
- 이미 테스트가 있는 경우 기존 패턴을 파악해 일관성을 유지합니다.
