agentsclimarketplace

Api auto testing

Skill deokjinlog/intent-locked-workflow/skills/api-auto-testing

기획 의도를 고정하고, 그 위에서만 코드가 자란다 — 기획·설계·계획·실행 4단계 게이트 Claude Code 워크플로 플러그인 (superpowers 5.0.7 계승)

Install
npx -y skills add deokjinlog/intent-locked-workflow --skill api-auto-testing

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • 27 days oldThe repository was created 27 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Use when /api-test is invoked after /executing-plans has implemented APIs. Drives the 6-step pipeline — API inventory from <slug>-implementation-plan.md and code → SQL guides for test data acquisition (user pastes results) → pytest scenario code generation (with conftest.py auth fixture auto-selected via detect_auth.py) → execution → result recording in <slug>-implementation-plan.md change-history → fail-handling proposal.

SKILL.md

7.8 KB, as published. Nobody here has run it

API Auto-Testing Pipeline

After /executing-plans implements new API endpoints, /api-test orchestrates a 6-step pipeline that generates pytest scenarios with auto-detected auth, runs them, and records results to <slug>-implementation-plan.md change-history.

<HARD-GATE> Triggered ONLY by explicit /api-test (no auto-run). DB access is via SQL-paste only — NEVER use MCP DB connectors or run SQL through the user's DB credentials directly. The user pastes SQL results into the conversation. </HARD-GATE>

When to Invoke

  • The user issues /api-test for the current feature folder
  • <slug>-implementation-plan.md exists and includes new/modified API endpoints (typically just after /executing-plans)

6-Step Pipeline

digraph api_test {
    "1. API inventory" [shape=box];
    "2. SQL guide for test data" [shape=box];
    "3. User pastes SQL results" [shape=box];
    "4. Generate scenario code\n(conftest + scenario-NNN.py)" [shape=box];
    "5. Execute pytest" [shape=box];
    "6. Record results in change-history" [shape=box];
    "Any failures?" [shape=diamond];
    "Propose code-fix re-execute-plan" [shape=box];
    "Done" [shape=doublecircle];

    "1. API inventory" -> "2. SQL guide for test data";
    "2. SQL guide for test data" -> "3. User pastes SQL results";
    "3. User pastes SQL results" -> "4. Generate scenario code\n(conftest + scenario-NNN.py)";
    "4. Generate scenario code\n(conftest + scenario-NNN.py)" -> "5. Execute pytest";
    "5. Execute pytest" -> "6. Record results in change-history";
    "6. Record results in change-history" -> "Any failures?";
    "Any failures?" -> "Propose code-fix re-execute-plan" [label="yes"];
    "Any failures?" -> "Done" [label="no"];
}

Step 1 — API Inventory

  • Read <slug>-implementation-plan.md ## 1. 단계별 작업 to identify new/modified endpoints introduced by recent tasks
  • Grep router decorators in code (@router.get|post|put|patch|delete, @app.get|post|..., FastAPI/Flask/Django patterns) to confirm endpoints exist in the implementation
  • For each endpoint, capture: HTTP method, path, path/query/body params, auth requirement

Step 2 — SQL Guide for Test Data

For each endpoint, identify the data dependencies (e.g., user_id, product_id, order_id) and present SQL to the user:

필요한 테스트 데이터를 백엔드 DB에서 조회 후 결과를 paste 해주세요:

-- active 사용자 1명 (정상 케이스)
SELECT id, email FROM users WHERE status='active' AND deleted_at IS NULL LIMIT 1;

-- 재고 있는 상품 1개
SELECT id, name, stock FROM products WHERE stock > 0 LIMIT 1;

-- (필요 시) 음수 잔액 케이스 — 시뮬용
SELECT id FROM users WHERE balance < 0 LIMIT 1;

The exact SQL depends on the inferred schema (read migrations, models, or ask once if unclear).

Step 3 — User Pastes Results

Wait for user paste. Parse rows into dict-form:

{"id": 12345, "email": "[email protected]"}
{"id": 67, "name": "Item A", "stock": 10}

Store in working memory for the next step.

Step 4 — Auto-Detect Auth + Generate Scenario Code

Run auth detection:

source .venv/bin/activate
python -m scripts.detect_auth .

Result branches:

  • jwt-login → activate Block A in conftest.py (login fixture)
  • static-env-token → activate Block B (env var fixture)
  • unknown → ask the user once: "어떻게 인증하나요? 로그인 엔드포인트 / 정적 토큰 / OAuth?"

Files to write under docs/features/<...>/api-tests/:

  1. conftest.py — copy from templates/api-tests/conftest.py.template, activate the right block, and append data fixtures matching the user's paste:
    @pytest.fixture
    def test_user() -> dict:
        return {"id": 12345, "email": "[email protected]"}
    
  2. scenario-001-<endpoint-name>.py — happy path test
  3. scenario-002-<endpoint-name>-edge.py — 2~3 edge cases (invalid input / missing perms / non-existent ID)

Example scenario:

def test_withdraw_success(api_client, test_user, test_product):
    r = api_client.post(
        "/api/wallet/withdraw",
        json={"user_id": test_user["id"], "amount": 1000},
    )
    assert r.status_code == 200
    body = r.json()
    assert body["balance"] >= 0
    assert "transaction_id" in body

Step 5 — Execute Pytest

source .venv/bin/activate
pytest docs/features/<...>/api-tests/scenario-*.py \
       -v --tb=short \
       --json-report \
       --json-report-file=docs/features/<...>/api-tests/results/$(date +%Y-%m-%d-%H%M).json

Dependencies are listed in repo-root requirements-dev.txt. If a user's project lacks them, instruct: pip install pytest requests pytest-json-report and rerun.

Step 6 — Record Results

Invoke change-history skill to append a [API테스트] entry to <slug>-implementation-plan.md:

### [2026-05-02 15:30] [API테스트]
- **id**: CH-20260502-009
- **시나리오 파일**: api-tests/scenario-001-withdraw.py (4 tests)
- **결과**: PASS 3 / FAIL 1 / ERROR 0
- **실패 상세**: test_withdraw_negative_amount → 422 기대, 200 응답
- **결과 파일**: api-tests/results/2026-05-02-1530.json
- **다음 액션**: 음수 amount 검증 누락 → /executing-plans 재진입 권장

Failure Handling

When the JSON report shows failures, surface them to the user:

1건 실패 — test_withdraw_negative_amount 가 음수 amount에 대해 422를 기대했으나 200을 받았습니다.
원인: src/wallet/service.py의 withdraw에 음수 검증 누락으로 보입니다.

선택:
A) /executing-plans 재진입 → 수정 후 재테스트
B) 시나리오 자체가 잘못 → 시나리오 코드 수정
C) 무시하고 마무리

The user's choice routes back to either /executing-plans (cascading code fix) or scenario edit (scoped to api-tests folder).

Anti-Patterns

WrongRight
Use MCP DB connector to query directlyForbidden by HARD-GATE. SQL-paste only.
Embed secrets in scenario filesUse env vars (API_BASE_URL, API_TOKEN, TEST_USER_EMAIL) loaded from .env.test (in .gitignore).
Report only PASS countsInclude FAIL/ERROR detail. The whole point is failure visibility.
Auto-run on every /executing-plansManual trigger only. The user runs /api-test when they want it.

Red Flags

ThoughtReality
"Just hardcode test data"Hardcoded data drifts from prod schema. SQL-paste from real DB.
"Skip auth fixture, this is a public endpoint"Public today, auth-gated tomorrow. Always include the auth fixture (it's no-op for public).
"Use prod base URL for testing"NEVER. local/staging only. If unclear, ask before sending requests.

Acceptance

After /api-test completes:

  1. ≥ 1 scenario file under docs/features/<...>/api-tests/
  2. ≥ 1 JSON result file under docs/features/<...>/api-tests/results/
  3. <slug>-implementation-plan.md ## 변경이력 has a fresh [API테스트] entry with PASS/FAIL/ERROR counts
  4. Failure cases (if any) surfaced with concrete next-action options

Related Skills

  • executing-plans — produced the code under test
  • change-history — invoked at Step 6 to append [API테스트] entry
  • change-propagation — invoked when failures lead to code/spec edits

Helper Scripts

  • scripts/detect_auth.py — auth pattern detection (called at Step 4)
  • templates/api-tests/conftest.py.template — fixture skeleton copied into each feature's api-tests folder

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.