Cypress

作者 bobmatnyc718070a7d622MIT77 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫2 個月前更新

Cypress end-to-end and component testing patterns for web apps: reliable selectors, stable waits, network stubbing, auth handling, CI parallelization, and flake reduction

AI 產生的概覽

用於為網頁應用程式撰寫可靠 Cypress 端對端與元件測試的模式。

功能
提供撰寫 Cypress 端對端與元件測試的指引:使用穩定的 data-testid 選擇器、以網路別名進行確定性等待而非固定休眠、用 cy.intercept 進行網路樁接,以及用 cy.session 快取登入。也涵蓋使用 cy.mount 的元件測試、重試與截圖/影片的 CI 設定、Cypress Cloud 平行化、反模式,以及針對不穩定測試或僅在 CI 中失敗的疑難排解。
適用情境
適用於建置瀏覽器端對端測試套件、偵錯不穩定的 UI 測試、驗證關鍵使用者流程,或為現代前端加入元件測試。
執行需求
需要以開發相依套件方式安裝 Cypress(npm i -D cypress)以及 Node/npm 環境;元件測試需要 React 等前端框架。平行化可選用 Cypress Cloud。此技能不附帶指令碼,僅為說明文件。

Cypress (E2E + Component Testing)

Overview

Cypress runs browser automation with first-class network control, time-travel debugging, and a strong local dev workflow. Use it for critical path E2E tests and for component tests when browser-level rendering matters.

Quick Start

Install and open

bash
npm i -D cypressnpx cypress open

Minimal spec

ts
// cypress/e2e/health.cy.tsdescribe("health", () => {  it("loads", () => {    cy.visit("/");    cy.contains("Hello").should("be.visible");  });});

Core Patterns

1) Stable selectors

Prefer data-testid (or data-cy) attributes for selectors. Avoid brittle CSS chains and text-only selectors for critical interactions.

html
<button data-testid="save-user">Save</button>
ts
cy.get('[data-testid="save-user"]').click();

2) Deterministic waiting (avoid fixed sleeps)

Wait on app-visible conditions or network aliases rather than cy.wait(1000).

ts
cy.intercept("GET", "/api/users/*").as("getUser");cy.visit("/users/1");cy.wait("@getUser");cy.get('[data-testid="user-email"]').should("not.be.empty");

3) Network control with cy.intercept

Stub responses for deterministic tests and speed. Keep a small set of “real backend” smoke tests separate.

ts
cy.intercept("GET", "/api/users/1", {  statusCode: 200,  body: { id: "1", email: "[email protected]" },}).as("getUser");

4) Authentication strategies

Prefer cy.session to cache login for speed and stability.

ts
// cypress/support/commands.tsCypress.Commands.add("login", () => {  cy.session("user", () => {    cy.request("POST", "/api/auth/login", {      email: "[email protected]",      password: "password",    });  });});
ts
// e2e specbeforeEach(() => {  cy.login();});

Component Testing

Run component tests to validate UI behavior in isolation while keeping browser rendering.

bash
npx cypress open --component
ts
// cypress/component/Button.cy.tsximport React from "react";import Button from "../../src/Button";
describe("<Button />", () => {  it("clicks", () => {    cy.mount(<Button onClick={cy.stub().as("onClick")}>Save</Button>);    cy.contains("Save").click();    cy.get("@onClick").should("have.been.calledOnce");  });});

CI Patterns

Artifacts (videos/screenshots)

Store artifacts for failed runs and keep videos optional to reduce storage.

ts
// cypress.config.tsimport { defineConfig } from "cypress";
export default defineConfig({  video: false,  screenshotOnRunFailure: true,  retries: { runMode: 2, openMode: 0 },});

Parallelization (Cypress Cloud)

Parallelize long E2E suites via Cypress Cloud when runtime dominates feedback loops.

Anti-Patterns

  • Use cy.wait(1000) as a synchronization mechanism.
  • Select elements via deep CSS paths.
  • Mix heavy network stubbing with “real backend” assertions in the same spec.
  • Depend on test order; isolate state with cy.session and per-test setup.

Troubleshooting

Symptom: flaky click or element not found

Actions:

  • Add a data-testid hook for the element.
  • Assert visibility before interaction (should("be.visible")).
  • Wait on network alias for the data that renders the element.

Symptom: tests fail only in CI

Actions:

  • Increase run-mode retries and record screenshots on failure.
  • Verify viewport and baseUrl config match CI environment.
  • Eliminate reliance on local-only seed data; create data via API calls.

Resources

來源與署名

來源:bobmatnyc/claude-mpm-skills位於toolchains/javascript/testing/cypress提交718070a

授權條款: MIT

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架