AgentSkillsCN

test-design

设计测试并生成 tdd-spec.md。采用自顶向下的方式设计测试,并借助 Mock 发现接口。 当收到“测试设计”、“测试用例提取”、“编写 tdd-spec”等请求时,即可使用此功能。

SKILL.md
--- frontmatter
name: test-design
description: |
  테스트 설계 및 tdd-spec.md 생성. Top-Down 방식으로 테스트를 설계하고 Mock을 통해 인터페이스를 발견합니다.
  "테스트 설계", "테스트 케이스 도출", "tdd-spec 작성" 요청 시 사용됩니다.

Test Design Skill

Top-Down 방식으로 테스트를 설계하고, Mock을 통해 인터페이스를 발견합니다.

Overview

이 스킬은 요구사항을 분석하여 테스트 케이스를 설계하고, .claude/tdd-spec.md 파일을 생성합니다. 생성된 spec 파일은 /tdd-impl 스킬이나 직접 구현 시 참조됩니다.

핵심 원칙: 테스트가 인터페이스를 정의한다

  • 상위 테스트 작성 시 -> 필요한 협력 객체 발견
  • Mock으로 협력 객체 대체 -> 인터페이스 계약 정의
  • Mock의 메서드 시그니처 = 실제 인터페이스
  • 하위 레벨에서 Mock을 실제 구현으로 교체

Workflow

code
요구사항 입력
     |
     v
+--------------------+
| 1. 요구사항 분석   |
|    - 충분성 확인   |
|    - 모호성 식별   |
+--------+-----------+
         |
         v
+--------------------+
| 2. 테스트 레벨별   |
|    케이스 설계     |
|    - Acceptance    |
|    - Integration   |
|    - Unit          |
+--------+-----------+
         |
         v
+--------------------+
| 3. 인터페이스 발견 |
|    - Mock 시그니처 |
|    - 의존성 식별   |
+--------+-----------+
         |
         v
+--------------------+
| 4. tdd-spec.md     |
|    생성/업데이트   |
+--------------------+

Phase 1: 요구사항 분석

제공된 요구사항을 분석하여 충분성을 검증합니다.

검증 항목:

  • 테스트 케이스 도출 가능 여부
  • 인터페이스 발견 가능 여부
  • 검증 기준 명확성

불충분시:

  • AskUserQuestion으로 누락된 정보 요청
  • 구체적으로 어떤 정보가 필요한지 명시

Phase 2: 테스트 레벨별 케이스 설계

Level 1: Acceptance Test (상위)

목적: 전체 기능의 동작 정의

  • 사용자 관점의 시나리오
  • End-to-End 동작 검증
  • 비즈니스 요구사항과 직접 매핑

설계 포인트:

  • Given-When-Then 패턴 활용
  • 외부 의존성은 Mock으로 대체
  • Mock이 드러내는 인터페이스 기록

Level 2: Integration Test (중간)

목적: 컴포넌트 간 통신 인터페이스 정의

  • 컴포넌트 경계의 동작 검증
  • 데이터 변환/전달 검증
  • 에러 전파 검증

설계 포인트:

  • 상위에서 발견된 인터페이스 구체화
  • 하위 의존성은 Mock으로 대체
  • 새로운 하위 인터페이스 발견

Level 3: Unit Test (하위)

목적: 개별 객체/함수의 인터페이스 정의

  • 단일 책임 검증
  • 경계 조건 검증
  • 에러 처리 검증

설계 포인트:

  • 상위에서 정의된 인터페이스 준수
  • 외부 의존성 최소화
  • 순수 함수 지향

Phase 3: 인터페이스 발견

code
+------------------------------------------------------------+
| Step 1: 요구사항에서 최상위 테스트 케이스 도출             |
|                                                            |
| 요구사항: "사용자가 로그인하면 대시보드를 보여준다"        |
|                      |                                     |
|                      v                                     |
| 테스트: "유효한 자격증명으로 로그인하면 대시보드 반환"     |
+------------------------------------------------------------+
                        |
                        v
+------------------------------------------------------------+
| Step 2: 테스트 작성 시 필요한 협력 객체 식별               |
|                                                            |
| LoginController 테스트 작성                                |
|   -> AuthService 필요 (Mock)                               |
|   -> UserRepository 필요 (Mock)                            |
+------------------------------------------------------------+
                        |
                        v
+------------------------------------------------------------+
| Step 3: Mock 메서드 시그니처 = 인터페이스 계약             |
|                                                            |
| mockAuthService.authenticate(credentials) -> AuthResult    |
| mockUserRepository.findById(userId) -> User                |
|                                                            |
| 이 시그니처가 실제 인터페이스가 됨                         |
+------------------------------------------------------------+
                        |
                        v
+------------------------------------------------------------+
| Step 4: 하위 레벨 테스트에서 Mock을 구체화                 |
|                                                            |
| AuthService 테스트 작성                                    |
|   -> TokenGenerator 필요 (Mock)                            |
|   -> PasswordHasher 필요 (Mock)                            |
|                                                            |
| 같은 과정 반복 (재귀적)                                    |
+------------------------------------------------------------+

Phase 4: tdd-spec.md 생성

분석된 요구사항과 설계된 테스트 케이스를 .claude/tdd-spec.md 파일로 영속화합니다.

형식: spec-format.md 참조

파일 위치: {project-root}/.claude/tdd-spec.md

내용:

  • 요구사항을 REQ-XXX 형식으로 구조화
  • 각 요구사항의 입력/출력/엣지케이스/에러케이스 정의
  • Verification Criteria 체크리스트

테스트 케이스 도출 기법

1. 등가 분할 (Equivalence Partitioning)

입력 도메인을 동등한 클래스로 분할하여 대표값 테스트

code
예: 나이 입력
- 유효: 0-150 -> 대표값: 25
- 무효(음수): < 0 -> 대표값: -1
- 무효(초과): > 150 -> 대표값: 200

2. 경계값 분석 (Boundary Value Analysis)

경계 지점과 그 주변값 테스트

code
예: 0-100 범위
- 경계값: -1, 0, 1, 99, 100, 101

3. 상태 전이 (State Transition)

상태 변화에 따른 동작 테스트

code
예: 주문 상태
- Created -> Paid -> Shipped -> Delivered
- Created -> Cancelled
- Paid -> Refunded

4. 결정 테이블 (Decision Table)

조건 조합에 따른 결과 테스트

code
예: 할인 적용
| VIP | 쿠폰 | 첫구매 | 할인율 |
|-----|------|--------|--------|
| Y   | Y    | -      | 30%    |
| Y   | N    | -      | 20%    |
| N   | Y    | Y      | 15%    |
| N   | Y    | N      | 10%    |
| N   | N    | Y      | 5%     |
| N   | N    | N      | 0%     |

테스트 명세 템플릿

markdown
## 테스트 케이스: [케이스 ID]

### 대상
- 컴포넌트: [테스트 대상]
- 메서드/기능: [테스트할 기능]

### 시나리오
- Given: [사전 조건]
- When: [실행 동작]
- Then: [기대 결과]

### Mock 의존성
- [Mock 객체]: [인터페이스 시그니처]

### 경계 조건
- [경계 케이스 목록]

### 에러 케이스
- [에러 상황]: [기대 동작]

Output

  1. .claude/tdd-spec.md: 구조화된 요구사항 명세
  2. 테스트 케이스 목록: 레벨별 테스트 케이스
  3. 인터페이스 정의: Mock에서 발견된 인터페이스
  4. 테스트 우선순위: 구현 순서 결정

다음 단계

spec 생성 완료 후:

  • /tdd-impl 스킬로 Red-Green-Refactor 구현 진행
  • 또는 직접 구현 시 tdd-spec.md 참조