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 生成的概览

用于为 Web 应用编写可靠的 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 从公开仓库中收录这些内容。

举报或申请下架