test · diff
git:20260926.64cea16 to git:20260928.21afea3
12 added, 44 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.
---
# 테스트 실행
호출되면 바로 파이프라인을 시작한다. 단계가 바뀔 때 한 줄로 진행을 알린다.
대상: $ARGUMENTS
---
## 파이프라인 구조
```
- ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
- │ 테스트 실행 │ → │ verify-code │ → │ fix-bugs │
- │ (Bash) │ │ (haiku) │ │ (sonnet) │
- └──────────────┘ └──────────────┘ └──────────────┘
- │ │
- ▼ │
- 실패 분석 필요 ─────────────┘
+ 테스트 실행 (Bash) → 결과 판독 (이 세션, 러너 요약 줄·종료코드)
+ │ 실패가 있으면
+ ▼
+ fix-bugs 위임 → 재실행 (전부 통과할 때까지)
```
---
## 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단(직접 수행)의 대가 — 격리 이점은 사라진다.** 직접 수행은 이 세션의 컨텍스트를
- > 공유하므로 별도 에이전트의 **사각지대 분리** 효과가 없다. 테스트를 돌린 세션이 그 결과를 검증하므로 *통과했다고 믿는 것* 과 *통과를 확인한 것* 이 섞인다. 상쇄책: 판정을 요약으로 대체하지 말고 **테스트 러너의 실제 마지막 줄을 그대로 인용**하라(종료코드를 파이프로 죽이지 말 것).
- > 없는 이점을 있다고 쓰지 않기 위해 명시한다.
+ 아래 `subagent_type:` 블록은 운송 수단일 뿐이고, 불변식은 블록의 `prompt:` 계약(검사 항목·출력
+ 형식·완료 선언)이다. 쓸 수 있는 수단을 호스트에 확인하고 위에서부터 한 칸씩 내려간다:
+ **① 네이티브 서브에이전트**(블록 그대로) → **② 호스트의 다른 격리 위임 수단**(에이전트 정의
+ 본문 `<플러그인 루트>/agents/<카테고리>/<이름>.md` 를 **요약 없이** 넘기고 뒤에 `prompt:` 를
+ 붙인다 — `$CLAUDE_PLUGIN_ROOT` 가 비면 플러그인 캐시에서 찾는다. 회신 요약이 아니라 계약
+ 산출물로 판정한다) → **③ 이 세션에서 같은 계약을 직접 수행.** 수단이 없다고 단계를 건너뛰거나
+ 하지 않은 위임을 했다고 보고하지 않는다. ③은 격리가 없다 — 판정을 요약으로 대체하지 말고 테스트 러너의 실제 마지막 줄을 그대로 인용한다(종료코드를 파이프로 죽이지 말 것).
## 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 에이전트 적용 결과]