원클릭으로
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가 통과하는가?