ワンクリックで
fe-test
frontend/src 코드에 테스트를 작성하는 스킬. "테스트 작성해줘", "test 짜줘", "테스트 추가해줘", "이거 테스트 커버해줘", "spec 작성" 요청 시 트리거한다. 대상에 맞는 도구를 골라 계약 중심 테스트를 작성한다.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
frontend/src 코드에 테스트를 작성하는 스킬. "테스트 작성해줘", "test 짜줘", "테스트 추가해줘", "이거 테스트 커버해줘", "spec 작성" 요청 시 트리거한다. 대상에 맞는 도구를 골라 계약 중심 테스트를 작성한다.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
현재 PR의 리뷰 코멘트를 분석해 타당한 것만 반영하는 스킬. "리뷰 반영해줘", "PR 리뷰 처리해줘", "코드래빗 리뷰 봐줘", "리뷰 코멘트 반영", "follow review", "apply review" 요청 시 트리거한다. 사람 리뷰는 존중하고 AI 리뷰는 선별해 반영하며, 수정 후 검증한다.
백엔드 API를 frontend/src에 연동하는 스킬. "API 연동해줘", "백엔드 연결해줘", "엔드포인트 붙여줘", "쿼리 훅 만들어줘", "mutation 추가해줘", "이 API 호출하게 해줘" 요청 시 트리거한다. 타입·schema·API 함수·훅·MSW 핸들러를 기존 패턴대로 작성한다.
Figma 디자인을 가져와 frontend/src에 컴포넌트로 구현하는 스킬. "피그마 적용", "figma 디자인 구현해줘", "이 화면 만들어줘", "캡쳐한 디자인대로 만들어줘", figma.com URL 제공 시 트리거한다. 기존 디자인 토큰과 shared/ui 컴포넌트를 재사용해 구현한다.
frontend/.claude/skills/ 아래에 새 프론트엔드 스킬을 만드는 메타 스킬. "스킬 만들어줘", "skill 생성", "새 스킬 추가", "fe 스킬 만들어줘", "스킬 크리에이터" 요청 시 트리거한다. 기존 fe- 스킬과 형식·말투·범위를 일치시켜 SKILL.md를 생성한다.
frontend/src 변경을 시니어 개발자 시선으로 검증하는 QA 스킬. "QA 해줘", "검증해줘", "코드 리뷰", "리뷰해줘", "merge 전에 봐줘" 요청 시 트리거한다. 구현하지 않고 검증과 보고만 수행한다.
Notion에서 백엔드 모듈의 API 명세를 MCP로 가져와 docs/backend/api-docs/{module}.md에 저장하는 스킬. "Notion API 가져와줘", "api-docs 동기화", "API 명세 불러와줘", "[모듈] API 문서 받아와", "api-docs 업데이트", "Notion에서 [모듈] 명세 내려받아" 요청 시 트리거한다. be-orchestrate가 Phase 1에서 내부적으로 사용하며 독립적으로도 트리거 가능하다.
| name | fe-test |
| description | frontend/src 코드에 테스트를 작성하는 스킬. "테스트 작성해줘", "test 짜줘", "테스트 추가해줘", "이거 테스트 커버해줘", "spec 작성" 요청 시 트리거한다. 대상에 맞는 도구를 골라 계약 중심 테스트를 작성한다. |
대상에 맞는 도구를 골라 작고 빠른 계약 테스트를 작성한다.
이 스킬은 frontend/ 범위에서만 동작한다. backend/ 파일은 수정하지 않는다.
규칙 기준:
AGENTS.md"테스트", "MSW"
| 검증한다 (안정적) | 검증하지 않는다 (쉽게 바뀜) |
|---|---|
| 로직·분기·상태 전이 (disabled, 에러 표시) | 컬러 토큰·border 두께·radius 등 스타일 값 |
접근성 (role, aria-*, label) | 화면에 보이는 문구 텍스트 그 자체 |
안정적 식별자 (role, data-testid, id) | DOM 구조·클래스명·마크업 깊이 |
getByText('저장') 대신 getByRole('button')·data-testid·로직 결과로 단언한다.| 대상 | 도구 | 위치 규칙 |
|---|---|---|
| 순수 함수/schema/query key | Vitest | 대상 파일 옆 *.test.ts |
| React 컴포넌트/hook | Testing Library + jsdom | 대상 파일 옆 *.test.tsx |
| API 함수 | axios-mock-adapter | *-api.test.ts |
| 사용자 흐름 + 네트워크 | MSW server | feature/흐름 단위 테스트 |
| focus trap/portal/scroll/caret | Playwright | tests/ (실제 브라우저 필요 시) |
테스트 설명(describe/it)은 구현 절차가 아니라 계약과 로직이 보이게 적는다. "조건 → 기대 결과" 형태로 쓴다.
✅ 유효한 입력에서 회원가입 폼은 제출 버튼을 활성화한다
✅ 빈 코드일 때 초대 수락은 disabled 상태를 유지한다
❌ 버튼을 테스트한다 / 렌더링 확인
src/entities/band/api/band-api.test.ts 패턴을 따른다. apiClient를 mock하고 응답을 schema로 검증한 뒤 반환값을 단언한다.
import { afterEach, describe, expect, it } from 'vitest';
import MockAdapter from 'axios-mock-adapter';
import { apiClient } from '@/shared/api/client';
import { getBands } from './band-api';
const mock = new MockAdapter(apiClient);
afterEach(() => mock.reset());
describe('getBands 어댑터', () => {
it('GET /bands 응답을 schema로 검증한 뒤 bands를 반환한다', async () => {
mock.onGet('/bands').reply(200, {
status: 'success',
error: null,
data: { totalCount: 1, items: [/* ... */] },
});
await expect(getBands()).resolves.toEqual([/* ... */]);
});
it('필수 필드가 누락되면 reject된다', async () => {
mock.onGet('/bands').reply(200, { data: { items: [{}] } });
await expect(getBands()).rejects.toThrow();
});
});
src/shared/ui/button/button.test.tsx 패턴을 따른다. DOM 렌더링·기본 이벤트·상태 표시를 role 쿼리로 검증한다.
import { render, screen } from '@testing-library/react';
import { describe, expect, it } from 'vitest';
import { Button } from './button';
describe('Button', () => {
it('isLoading=true이면 버튼이 disabled 상태가 된다', () => {
render(<Button isLoading>저장</Button>);
expect(screen.getByRole('button')).toBeDisabled();
});
});
접근성 단언(role, aria-*)을 우선 사용한다.
작은 계약을 직접 단언한다.
import { describe, expect, it } from 'vitest';
import { bandKeys } from './useBands';
describe('bandKeys', () => {
it('lists는 all을 prefix로 가진다', () => {
expect(bandKeys.lists()).toEqual(['bands', 'list']);
});
});
사용자 흐름 + 네트워크를 함께 검증할 때만 MSW server를 쓴다. 개별 핸들러 변경은 server.use(...)로 override하고 src/test/setup.ts의 reset 흐름을 깨지 않는다.
pnpm --dir frontend test
라우팅·auth·query invalidation·API path·접근성 상태를 건드렸으면 관련 테스트를 우선 실행한다. 실패를 무시하고 완료로 보고하지 않는다.
pnpm --dir frontend test가 통과하는가?