test · diff

git:20260924.677af4e to git:20260926.64cea16

0 added, 2 removed. Audit A to A.

---
name: test
description: Run tests and auto-fix failures. Detects the test framework, executes tests, and iterates on fixes until all pass.
- model: sonnet
- effort: medium
---
# 테스트 실행
호출되면 바로 파이프라인을 시작한다. 단계가 바뀔 때 한 줄로 진행을 알린다.
대상: $ARGUMENTS
---
## 파이프라인 구조
```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 테스트 실행 │ → │ verify-code │ → │ fix-bugs │
│ (Bash) │ │ (haiku) │ │ (sonnet) │
└──────────────┘ └──────────────┘ └──────────────┘
│ │
▼ │
실패 분석 필요 ─────────────┘
```
---
## 1단계: 프로젝트 타입 감지 및 테스트 실행
프로젝트에 맞는 테스트 명령 실행:
```bash
# Python 프로젝트
pytest $ARGUMENTS -v --tb=short
# Node.js 프로젝트
npm test $ARGUMENTS
# Go 프로젝트
go test $ARGUMENTS ./...
# Rust 프로젝트
cargo test $ARGUMENTS
```
---
---
## 위임 수단이 없는 하네스 — 강등 경로 (이 스킬의 **모든** 위임 블록에 적용)
아래 단계들은 `Task tool 사용:` / `subagent_type:` 형태로 전용 에이전트에게 위임한다.
**그 위임은 계약을 실행하는 한 가지 운송 수단일 뿐이고, 불변식은 각 블록의 `prompt:`
본문에 적힌 계약이다** — 페르소나·검사 항목·출력 형식·완료 선언이 그것이다.
운송은 **사다리**다. 위에서부터 쓸 수 있는 것을 쓰고, **한 칸씩 내려간다 — 건너뛰지 않는다.**
쓸 수 있는 수단은 호스트에 직접 확인한다 — 이 문서는 위임이 가능하다고 보증하지 않는다.
**1단 — 네이티브 서브에이전트.** 아래 블록을 그대로 쓴다. **격리 있음.**
**2단 — 호스트가 제공하는 위임 수단.** 네이티브 서브에이전트가 없어도, **격리된 별도
작업을 띄우는 수단을 호스트가 제공할 수 있다.** 있으면 그것을 쓴다 — 수단의 이름은
하네스마다 다르므로 여기 적지 않는다(배포물이 특정 하네스를 전제하면 다른 하네스에서
그 지시가 죽는다). 넘기는 방법이 이 단의 전부다:
- 지시문은 **에이전트 정의 파일의 본문을 그대로** 넘긴다 — 설치본의
`<플러그인 루트>/agents/<카테고리>/<이름>.md`. `$CLAUDE_PLUGIN_ROOT` 가 설정돼
있으면 그것이 플러그인 루트지만 **빈 값일 수 있으니 파일 존재를 확인하고**, 없으면
플러그인 캐시에서 같은 상대경로를 찾는다.
- **요약해서 넘기지 마라.** 페르소나·검사 항목·출력 형식·완료 선언이 그 본문에 있고,
요약하면 그 계약이 손실된다 — 그러면 2단은 운송이 아니라 다른 작업이 된다.
- 정의 본문 **뒤에** 이 블록의 `prompt:` 를 붙여 대상·범위를 준다.
- **회신은 자기보고다.** 위임 수단이 "했다"고 돌려준 요약이 아니라 **계약이 요구하는
산출물 자체**(리포트 본문·완료 선언·파일)로 판정하라.
- **격리는 유지된다** — 별도 컨텍스트에서 돌므로 사각지대 분리 효과가 살아 있다.
따라서 아래 3단의 강등 표시를 붙이지 않는다.
**3단 — 이 세션에서 직접 수행.** 1·2단이 **모두** 없을 때만 여기로 내려온다.
**서브에이전트 위임 수단이 없는 하네스에서는 같은 계약을 이 세션에서 직접 수행한다.**
각 블록의 `prompt:` 를 자기 지시로 읽고, 같은 항목을 같은 형식으로 산출한다.
**수단이 없다고 단계를 건너뛰지 마라. 하지 않은 위임을 했다고 보고하지도 마라.**
> **3단(직접 수행)의 대가 — 격리 이점은 사라진다.** 직접 수행은 이 세션의 컨텍스트를
> 공유하므로 별도 에이전트의 **사각지대 분리** 효과가 없다. 테스트를 돌린 세션이 그 결과를 검증하므로 *통과했다고 믿는 것* 과 *통과를 확인한 것* 이 섞인다. 상쇄책: 판정을 요약으로 대체하지 말고 **테스트 러너의 실제 마지막 줄을 그대로 인용**하라(종료코드를 파이프로 죽이지 말 것).
> 없는 이점을 있다고 쓰지 않기 위해 명시한다.
## 2단계: 결과 검증
러너의 요약 줄과 종료 코드를 직접 읽어 통과/실패/스킵 수를 확정한다(별도 에이전트 불필요).
실패가 있으면 실패 출력을 그대로 3단계로 넘긴다 — 원인 분석은 fix-bugs 가 한다.
---
## 3단계: 실패 시 버그 수정
실패가 있으면 fix-bugs 에이전트로 수정:
```
Task tool 사용:
subagent_type: fix-bugs
model: sonnet
prompt: |
다음 테스트 실패를 수정해주세요:
[실패한 테스트 출력]
각 실패에 대해:
1. 실패한 테스트명
2. 에러 메시지
3. 예상 vs 실제 값
4. 코드 수정
```
---
## 출력 형식
### 테스트 결과
| 항목 | 결과 |
| --------- | ---- |
| 총 테스트 | N개 |
| 통과 | N개 |
| 실패 | N개 |
| 스킵 | N개 |
### 실패 상세 (있으면)
[테스트별 원인과 수정 방안]
### 수정 결과 (실패 시)
[fix-bugs 에이전트 적용 결과]