frontend-testing-best-practices
sergiodxa/agent-skills
Тестирование с использованием лучших практик для фронтенда. Приоритет отдается тестам типа E2E перед тестами единиц, применяется минимальное количество моков, а также акцент делается на проверке поведения приложения, а не на деталях его реализации. Используйте этот подход при написании тестов или при их анализе.
...Расширить всеО лучших практиках тестирования фронтенда
Навык «лучшие практики тестирования фронтенда» предоставляет полное руководство по созданию эффективных и удобных в обслуживании тестов для фронтенд-приложений. Он помогает решить распространённую проблему написания хрупких тестов, которые сложно поддерживать и дают ложное чувство уверенности, поскольку сосредотачиваются на деталях реализации вместо поведения пользователя. Этот навык основан на философии, при которой тесты типа end-to-end (E2E) ставятся выше unit-тестов, применяется минимальное количество моков, а оценивается поведение приложения, а не детали его реализации.
В рамках этого навыка сформулировано 6 основных правил, разделённых на три категории: стратегия тестирования (критический уровень), тесты типа E2E (высокий приоритет) и unit-тесты (средний приоритет). Ключевые аспекты включают рекомендации относительно того, когда использовать тесты E2E или unit-тесты, как структурировать тесты E2E в соответствующей папке, лучшие практики применения доступных селекторов в тестах Playwright, избегание unit-тестов компонентов React и сохранение простоты моков. Для наглядности в правилах приводятся практические примеры кода с сравнением хороших и плохих подходов, что позволяет сразу применять рекомендации на практике.
Этот навык идеален для фронтенд-разработчиков, работающих над веб-приложениями, которым необходимо принимать решения по тестированию, писать новые тесты или проверять код тестов. Он особенно полезен для команд, использующих Playwright для тестирования типа E2E и React для создания UI-компонентов. Используйте этот навык при выборе типа тестов, внедрении нового уровня покрытия тестами, рефакторинге существующих тестов или проведении код-ревью файлов с тестами. Рекомендации помогают командам избегать распространённых антипаттернов в тестировании и создавать наборы тестов, которые действительно гарантируют уверенность в поведении приложения.
Часто задаваемые вопросы
Когда следует писать unit-тесты вместо тестов E2E?
В большинстве случаев предпочтительнее использовать тесты E2E. Unit-тесты стоит писать только для чистых функций, не имеющих зависимостей и выполняющих изолированную логику, такую как форматирование данных или вычисления. Если вы тестируете что-либо, связанное с компонентами React, вызовами API или взаимодействием с пользователем, следует писать тесты E2E.
Какую фреймворк для тестирования предполагает этот навык?
В примерах тестирования типа E2E используется Playwright, а для мокинга API — MSW (Mock Service Worker). Примеры с компонентами React указывают на использование стека JavaScript/TypeScript для фронтенда, однако основные принципы применимы к любому фронтенд-фреймворку.
Сколько моков считается чрезмерным в тесте?
Если для одного теста требуется 3 или более моков, это сигнал к тому, что следует написать тест E2E. Простые моки (например, единственный обработчик MSW для конечной точки API) допустимы, но сложные настройки моков указывают на необходимость тестирования реальной интегрированной системы.
Где следует размещать тесты E2E в проекте?
Тесты E2E должны находиться в папке e2e/tests/ в корне проекта, а не внутри папки frontend/. Это позволяет отделить их от unit-тестов и чётко показать, что они тестируют всю систему.
Какую стратегию селекторов следует использовать в тестах 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
Копировать





Дом
