옵션
집 Skill 브라우저 자동화 frontend-testing-best-practices

frontend-testing-best-practices

sergiodxa/agent-skills sergiodxa/agent-skills

프론트엔드의 모범 사례 테스트 방법을 검증합니다. 단위 테스트보다는 E2E 테스트를 우선시하고, 모킹은 최소화하며, 구현 세부 사항보다는 동작 테스트에 중점을 둡니다. 테스트 코드를 작성하거나 검토할 때 활용하면 좋습니다.

...모든 것을 확장하십시오
53
업데이트 된 시간 2026년 7월 7일

frontend-testing-best-practices에 대하여

frontend-testing-best-practices라는 스킬은 프론트엔드 애플리케이션용으로 효과적이고 유지보수가 용이한 테스트를 작성하기 위한 포괄적인 가이드라인을 제공합니다. 이 스킬은 사용자 행동이 아닌 구현 세부 사항에만 집중함으로써 깨지기 쉽고 유지보수가 어렵으며 잘못된 확신을 주는 테스트를 작성하는 일반적인 문제를 해결합니다. 또한 단위 테스트보다 엔드투엔드(E2E) 테스트를 우선시하고, 모킹은 최소화하며 구현 세부 사항이 아닌 실제 동작을 테스트하는 철학을 강조합니다.

이 스킬은 테스트 전략(중요도 높음), E2E 테스트(우선순위 높음), 단위 테스트(우선순위 중간)라는 세 가지 범주로 구성된 6가지 핵심 규칙을 포함하고 있습니다. 주요 내용으로는 E2E 테스트와 단위 테스트를 언제 작성해야 하는지, E2E 테스트를 적절한 디렉터리에 어떻게 구조화할지, Playwright 테스트에서 접근 가능한 선별자를 사용할 때의 모범 사례, React 컴포넌트 단위 테스트를 피하는 방법, 간단한 모킹을 유지하는 방법 등이 있습니다. 규칙들은 좋은 접근 방식과 나쁜 접근 방식을 비교한 실제 코드 예시를 통해 가이드라인을 즉시 적용할 수 있도록 돕습니다.

이 스킬은 테스트 관련 결정을 내리거나 새로운 테스트를 작성하거나 테스트 코드를 검토해야 하는 웹 애플리케이션 개발자들에게 매우 유용합니다. 특히 E2E 테스트에 Playwright를, UI 컴포넌트에 React를 사용하는 팀에게 큰 가치가 있습니다. 어떤 유형의 테스트를 작성할지 결정하거나, 새로운 테스트 커버리지를 구현하거나, 기존 테스트를 리팩토링하거나, 테스트 파일에 대한 코드 리뷰를 진행할 때 이 스킬을 활용할 수 있습니다. 이 가이드라인들은 팀이 흔히 저지르는 잘못된 테스트 방식을 피하고 애플리케이션 동작에 대한 실질적인 확신을 제공하는 테스트 세트를 구축하는 데 도움을 줍니다.

FAQ

단위 테스트와 E2E 테스트 중 어떤 것을 작성해야 할까요?

대부분의 경우 기본적으로 E2E 테스트를 우선적으로 사용합니다. 의존성이 전혀 없고 데이터 포맷팅이나 계산과 같은 독립적인 로직만 수행하는 순수 함수의 경우에만 단위 테스트를 작성하면 됩니다. React 컴포넌트, API 호출, 사용자 상호작용과 관련된 내용을 테스트할 때는 대신 E2E 테스트를 작성해야 합니다.

이 스킬에서는 어떤 테스트 프레임워크를 가정하고 있나요?

이 스킬은 E2E 테스트 예시로 Playwright를, API 모킹에는 MSW(Mock Service Worker)를 사용합니다. React 컴포넌트 관련 예시에서는 JavaScript/TypeScript 기반의 프론트엔드 스택을 제안하지만, 핵심 원칙들은 모든 프론트엔드 프레임워크에 적용됩니다.

테스트에서 모킹이 너무 많다는 기준은 무엇인가요?

한 테스트에 3개 이상의 모킹이 필요하다면 대신 E2E 테스트를 작성해야 한다는 신호입니다. API 엔드포인트용 단일 MSW 핸들러와 같은 간단한 모킹은 괜찮지만, 복잡한 모킹 설정은 실제 통합된 시스템을 직접 테스트해야 함을 나타냅니다.

프로젝트 내에서 E2E 테스트는 어디에 위치시켜야 하나요?

E2E 테스트는 프로젝트 루트의 e2e/tests/ 디렉터리에 배치해야 하며, frontend/ 디렉터리 내에 넣어서는 안 됩니다. 이렇게 함으로써 단위 테스트와 분리되어 전체 시스템을 테스트한다는 점이 명확해집니다.

Playwright 테스트에서 어떤 선별자 전략을 사용해야 하나요?

다음과 같은 우선순위를 따르세요. 먼저 역할 기반 선별자(getByRole)를 사용하고, 그 다음 라벨 기반 선별자(getByLabel), 그다음 텍스트 내용을 활용합니다. 마지막으로 접근 가능한 선별자가 전혀 없는 경우에만 테스트 ID(getByTestId)를 사용하세요. CSS 선별자는 깨지기 쉽고 사용자가 애플리케이션과 상호작용하는 방식을 반영하지 못하므로 피해야 합니다.

GitHub에서 보기

Testing Best Practices

Guidelines for writing effective, maintainable tests that provide real confidence. Contains 6 rules focused on preferring E2E tests, minimizing mocking, and testing behavior over implementation.

Core Philosophy

  1. Prefer E2E tests over unit tests - Test the whole system, not isolated pieces
  2. Minimize mocking - If you need complex mocks, write an E2E test instead
  3. Test behavior, not implementation - Test what users see and do
  4. Avoid testing React components directly - Test them through E2E

When to Apply

Reference these guidelines when:

  • Deciding what type of test to write
  • Writing new E2E or unit tests
  • Reviewing test code
  • Refactoring tests

Rules Summary

Testing Strategy (CRITICAL)

prefer-e2e-tests - @rules/prefer-e2e-tests.md

Default to E2E tests. Only write unit tests for pure functions.

// E2E test (PREFERRED) - tests real user flowtest("user can place an order", async ({ page }) => {  await createTestingAccount(page, { account_status: "active" });  await page.goto("/catalog");  await page.getByRole("heading", { name: "Example Item" }).click();  await page.getByRole("link", { name: "Buy" }).click();  // ... complete flow  await expect(page.getByAltText("Thank you")).toBeVisible();});// Unit test - ONLY for pure functionstest("formatCurrency formats with two decimals", () => {  expect(formatCurrency(1234.5)).toBe("$1,234.50");});

avoid-component-tests - @rules/avoid-component-tests.md

Don't unit test React components. Test them through E2E or not at all.

// BAD: Component unit testdescribe("OrderCard", () => {  test("renders amount", () => {    render(<OrderCard amount={100} />);    expect(screen.getByText("$100")).toBeInTheDocument();  });});// GOOD: E2E test covers the component naturallytest("order history shows orders", async ({ page }) => {  await page.goto("/orders");  await expect(page.getByText("$100")).toBeVisible();});

minimize-mocking - @rules/minimize-mocking.md

Keep mocks simple. If you need 3+ mocks, write an E2E test instead.

// BAD: Too many mocks = write E2E testvi.mock("~/lib/auth");vi.mock("~/lib/transactions");vi.mock("~/hooks/useAccount");// GOOD: Simple MSW mock for loader testmockServer.use(  http.get("/api/user", () => HttpResponse.json({ name: "John" })),);

E2E Tests (HIGH)

e2e-test-structure - @rules/e2e-test-structure.md

E2E tests go in e2e/tests/, not frontend/.

// e2e/tests/order.spec.tsimport { test, expect } from "@playwright/test";import { addAccountBalance, createTestingAccount } from "./utils";test.describe("Orders", () => {  test.beforeEach(async ({ page, context }) => {    await createTestingAccount(page, { account_status: "active" });    let cookies = await context.cookies();    let account_id = cookies.find((c) => c.name === "account_id").value;    await addAccountBalance({ account_id, amount: 10000, replaceBalance: true });  });  test("place order with default values", async ({ page }) => {    await page.goto("/catalog");    // ... user flow  });});

e2e-selectors - @rules/e2e-selectors.md

Use accessible selectors: role > label > text > testid.

// GOOD: Role-based (preferred)await page.getByRole("button", { name: "Submit" }).click();await page.getByRole("heading", { name: "Dashboard" });// GOOD: Label-basedawait page.getByLabel("Email").fill("[email protected]");// OK: Test ID when no accessible selector existsawait expect(page.getByTestId("balance")).toHaveText("$1,234");// BAD: CSS selectorsawait page.locator(".btn-primary").click();

Unit Tests (MEDIUM)

unit-test-structure - @rules/unit-test-structure.md

Unit tests for pure functions only. Co-locate with source files.

// app/utils/format.test.tsimport { describe, test, expect } from "vitest";import { formatCurrency } from "./format";describe("formatCurrency", () => {  test("formats positive amounts", () => {    expect(formatCurrency(1234.5)).toBe("$1,234.50");  });  test("handles zero", () => {    expect(formatCurrency(0)).toBe("$0.00");  });});

Key Files

  • e2e/tests/ - E2E tests (Playwright)
  • e2e/tests/utils.ts - E2E test utilities
  • vitest.config.ts - Unit test configuration
  • vitest.setup.ts - Global test setup with MSW
  • app/utils/test-utils.ts - Unit test utilities

frontend-testing-best-practices 설치

클라우드의 .claude/skills/ 디렉터리에 해당 스킬 파일들을 다운로드하여 압축을 풀어주세요.

ZIP 다운로드

저장소를 클론하고 스킬 파일을 프로젝트에 복사하세요.

git clone https://github.com/sergiodxa/agent-skills/blob/main/skills/frontend-testing-best-practices/SKILL.md # Copy SKILL.md to your .claude/skills/ directory

복사 복사
빠른 설정: 스킬 폴더를 .claude/skills/로 복사하면 Claude가 자동으로 해당 스킬을 인식하여 사용합니다.

관련 스킬

playwright-cli
업데이트 된 시간 2026년 6월 29일
Playwright Browser Automation
업데이트 된 시간 2026년 6월 29일
playwright-generate-test
업데이트 된 시간 2026년 6월 29일
playwright-expert
업데이트 된 시간 2026년 6월 29일
OR