frontend-testing-best-practices
sergiodxa/agent-skills
フロントエンドのテストに関するベストプラクティス。ユニットテストよりもE2Eテストを重視し、モックは最小限に抑え、実装の詳細よりも動作そのものをテストすることを重視する。テストを作成したり、テストコードをレビューしたりする際に活用する。
...すべて拡張します概要frontend-testing-best-practices
「frontend-testing-best-practices 」スキルは、フロントエンドアプリケーション向けに、効果的で保守性の高いテストを作成するための包括的なガイドラインを提供します。このスキルは、ユーザーの挙動ではなく実装の詳細に焦点を当ててしまうことで、脆弱で保守が難しく、誤った安心感を与えてしまうテストを作成してしまうという一般的な問題に対処します。 このスキルでは、ユニットテストよりもエンドツーエンド(E2E)テストを優先し、モックを最小限に抑え、実装の詳細ではなく動作そのものをテストするという哲学を重視しています。
このスキルには、「テスト戦略」(重要度:クリティカル)、「E2Eテスト」(優先度:高)、「ユニットテスト」(優先度:中)の3つのカテゴリに分類された6つの基本ルールが含まれています。 主な内容としては、E2Eテストとユニットテストのどちらをいつ書くべきか、E2Eテストを適切なディレクトリに構成する方法、Playwrightテストでアクセシビリティセレクタを使用する際のベストプラクティス、Reactコンポーネントのユニットテストを避ける方法、モックをシンプルに保つ方法などのガイダンスが含まれます。各ルールでは、適切なアプローチと不適切なアプローチを比較した実践的なコード例を用いており、ガイドラインをすぐに実践に移せるようになっています。
このスキルは、Webアプリケーションの開発に携わり、テストに関する意思決定、新しいテストの作成、またはテストコードのレビューを行う必要があるフロントエンド開発者に最適です。 特に、E2EテストにPlaywrightを、UIコンポーネントにReactを使用しているチームにとって価値が高いです。どのような種類のテストを作成するか決定する際、新しいテストカバレッジを実装する際、既存のテストをリファクタリングする際、またはテストファイルのコードレビューを行う際に、このスキルを活用してください。このガイドラインは、チームがテストにおける一般的なアンチパターンを回避し、アプリケーションの動作に対して真の信頼性を提供するテストスイートを構築するのに役立ちます。
よくある質問
ユニットテストとE2Eテストは、どのような場合にそれぞれ書くべきですか?
ほとんどのシナリオでは、デフォルトでE2Eテストを採用してください。依存関係がなく、データフォーマットや計算のような孤立したロジックを実行する純粋関数に対してのみ、ユニットテストを作成してください。Reactコンポーネント、API呼び出し、またはユーザー操作が関わるものをテストする場合は、代わりにE2Eテストを作成してください。
このスキルではどのテストフレームワークを前提としていますか?
このスキルでは、E2Eテストの例としてPlaywrightを使用し、APIのモック化についてはMSW(Mock Service Worker)を参照しています。Reactコンポーネントの例ではJavaScript/TypeScriptのフロントエンドスタックを想定していますが、中核となる原則はどのフロントエンドフレームワークにも適用されます。
テストにおけるモックの数は、どれくらいから多すぎると見なされますか?
1つのテストで3つ以上のモックが必要になる場合は、代わりにE2Eテストを作成すべきというサインです。単純なモック(APIエンドポイントに対する単一のMSWハンドラーなど)は問題ありませんが、複雑なモック設定が必要な場合は、実際の統合システムをテストすべきであることを示しています。
E2Eテストはプロジェクト内のどこに配置すべきか?
E2Eテストは、frontend/ディレクトリ内ではなく、プロジェクトルートのe2e/tests/ディレクトリに配置すべきです。これにより、ユニットテストと分離され、システム全体をテストしていることが明確になります。
Playwrightテストではどのようなセレクタ戦略を使用すべきですか?
以下の優先順位に従ってください。ロールベースのセレクタ(getByRole)が推奨され、次にラベルベース(getByLabel)、テキストコンテンツ、そして最後に、利用可能なセレクタが存在しない場合にのみテストID(getByTestId)を使用します。CSSセレクタは不安定であり、ユーザーがアプリケーションとどのようにやり取りするかを反映していないため、使用を避けてください。
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
- Prefer E2E tests over unit tests - Test the whole system, not isolated pieces
- Minimize mocking - If you need complex mocks, write an E2E test instead
- Test behavior, not implementation - Test what users see and do
- 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 utilitiesvitest.config.ts- Unit test configurationvitest.setup.ts- Global test setup with MSWapp/utils/test-utils.ts- Unit test utilities
すべてのファイル
7件のファイル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
コピー





家
