К основному содержанию
правило

cypress — правило для Cursor: что делает и как установить

Задаёт правила E2E-тестирования в Cypress для Cursor: изоляцию тестов, селекторы по data-cy, моки через cy.intercept() и вход через сессии.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/cypress.mdc
Открыть на GitHub

Что делает cypress

Правило настраивает Cursor на генерацию надёжных сценариев Cypress для файлов **/*.{js,ts,cy.js,cy.ts}. Оно закрепляет стандартную структуру проекта с единым cypress.config.ts в корне, тестами в cypress/e2e, фикстурами и командами в cypress/support/commands.ts. Хрупкие селекторы ломают тесты при малейшем изменении стилей. Поэтому правило требует искать элементы через атрибуты data-cy и хелпер cy.getBySel().

Вместо ручного прохождения формы входа агент применяет вызов cy.request() и кэширует состояние через cy.session(). Это ускоряет прогон тестов. Для сетевых запросов предписан cy.intercept(), а произвольные паузы cy.wait() с миллисекундами исключены из-за риска появления нестабильных проверок. При необходимости выйти за пределы приложения инструкция требует изолировать переход через cy.origin().

Какие задачи решает

  • избавиться от хрупких селекторов по классам и тегам с помощью атрибутов data-cy
  • ускорить авторизацию в тестах через cy.session() и API-запросы
  • перехватывать сетевые запросы через cy.intercept() с подстановкой фикстур
  • устранить флакающие тесты из-за жёстких задержек cy.wait()

Примеры запросов агенту

  • Напиши E2E-тест для оформления заказа в cypress/e2e/checkout.cy.ts с поиском кнопок по data-cy
  • Добавь в cypress/support/commands.ts команду apiLogin с кэшированием через cy.session()
  • Замокай ответ эндпоинта /api/products через cy.intercept() и фикстуру products.json

Как установить cypress

Вручную: положить файлы

.cursor/rules/cypress.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о cypress

Как установить cypress в Cursor?

Создайте файл .cursor/rules/cypress.mdc в корне вашего проекта и скопируйте в него содержимое правила.

Что делает правило cypress?

Оно инструктирует Cursor следовать лучшим практикам Cypress: изолировать тесты в блоках it, использовать селекторы data-cy, перехватывать запросы через cy.intercept() и избегать случайных задержек cy.wait().

Как правило рекомендует организовывать авторизацию пользователя?

Вместо прокликивания UI-формы правило предписывает авторизовываться программно через cy.request() внутри вспомогательной команды и сохранять состояние между тестами с помощью cy.session().

Исходный текст

cypress.mdc · CC0-1.0
---
description: This guide defines definitive best practices for writing maintainable, performant, and reliable Cypress end-to-end tests, leveraging modern patterns and avoiding common pitfalls.
globs: **/*.{js,ts,cy.js,cy.ts}
---
# Cypress Best Practices

Cypress is our go-to for robust E2E testing. Follow these rules to ensure our test suite remains fast, stable, and easy to maintain.

## 1. Code Organization & Structure

Adhere to the standard Cypress folder structure. This promotes consistency and discoverability.

**Rule:** Keep a single `cypress.config.ts` at the root.
**Rule:** Place E2E tests in `cypress/e2e`.
**Rule:** Store reusable commands in `cypress/support/commands.ts`.
**Rule:** Use `cypress/fixtures` for static test data.

```typescript
// cypress.config.ts
import { defineConfig } from 'cypress';

export default defineConfig({
  e2e: {
    baseUrl: 'http://localhost:3000', // Always set a global base URL
    retries: {
      runMode: 2, // Allow retries in CI for flaky tests
      openMode: 0,
    },
    setupNodeEvents(on, config) {
      // Implement cy.task() here for server-side operations
    },
  },
});
```

## 2. Test Isolation

Each test (`it` block) must be independent and not rely on the state of previous tests. This enables parallelization and makes debugging straightforward.

❌ **BAD:** Dependent tests
```typescript
// test-suite.cy.ts
describe('User Flow', () => {
  it('should register a user', () => { /* ... */ }); // Creates user
  it('should log in the registered user', () => { /* ... */ }); // Depends on previous test
});
```

✅ **GOOD:** Isolated tests using `beforeEach`
```typescript
// test-suite.cy.ts
describe('User Management', () => {
  beforeEach(() => {
    // Programmatically create user and log in via API or custom command
    cy.apiLogin('[email protected]', 'password123');
    cy.visit('/dashboard');
  });

  it('should display user dashboard', () => {
    cy.getBySel('dashboard-header').should('contain', 'Welcome, Test User');
  });

  it('should allow user to update profile', () => {
    cy.getBySel('profile-link').click();
    cy.getBySel('name-input').type('New Name');
    cy.getBySel('save-button').click();
    cy.getBySel('success-message').should('be.visible');
  });
});
```

## 3. Element Selection

Prioritize stable, test-specific attributes. This decouples selectors from styling or content changes.

**Rule:** Always use `data-cy` attributes for element selection.
**Rule:** Use `cy.contains()` only when the displayed text is critical to the test's purpose.

❌ **BAD:** Brittle selectors
```typescript
cy.get('.btn-primary').click(); // Coupled to styling
cy.get('#submitButton').click(); // Coupled to JS/CSS ID
cy.get('div:nth-child(2) > p').should('be.visible'); // Highly brittle DOM structure
```

✅ **GOOD:** Resilient selectors with `data-cy`
```typescript
// In cypress/support/commands.ts
Cypress.Commands.add('getBySel', (selector: string, ...args: any[]) => {
  return cy.get(`[data-cy="${selector}"]`, ...args);
});

// In your test file
cy.getBySel('submit-button').click(); // Best practice
cy.getBySel('user-profile-name').should('contain', 'John Doe');
cy.contains('Submit Order').click(); // Only if "Submit Order" text is critical
```

## 4. Mocking Strategies

Control external dependencies to ensure fast, reliable, and deterministic tests.

**Rule:** Use `cy.intercept()` for all network requests (XHR/Fetch).
**Rule:** Use `cy.fixture()` to provide static response data.
**Rule:** Use `cy.stub()` for client-side function mocking.
**Rule:** For server-side setup/teardown, use `cy.task()` to execute Node.js code.

❌ **BAD:** Relying on live API responses
```typescript
it('should load products', () => {
  cy.visit('/products');
  cy.get('.product-card').should('have.length.gt', 0); // Fails if API is down or slow
});
```

✅ **GOOD:** Intercepting network requests with fixtures
```typescript
it('should load products from fixture', () => {
  cy.intercept('GET', '/api/products', { fixture: 'products.json' }).as('getProducts');
  cy.visit('/products');
  cy.wait('@getProducts');
  cy.getBySel('product-card').should('have.length', 3);
});
```

## 5. Avoiding Arbitrary Waits

Cypress automatically retries assertions. Avoid `cy.wait()` unless explicitly waiting for a network request to complete.

❌ **BAD:** Arbitrary waits
```typescript
cy.get('button').click();
cy.wait(2000); // Unnecessary, slows down tests, can cause flakiness
cy.get('.success-message').should('be.visible');
```

✅ **GOOD:** Leveraging Cypress's retry-ability
```typescript
cy.getBySel('submit-button').click();
cy.getBySel('success-message').should('be.visible'); // Cypress retries until visible
```
✅ **GOOD:** Waiting for specific network requests
```typescript
cy.intercept('POST', '/api/users', { statusCode: 201 }).as('createUser');
cy.getBySel('register-form').submit();
cy.wait('@createUser').its('response.statusCode').should('eq', 201);
```

## 6. Performance & Real-world Scenarios

Optimize test execution and simulate real user interactions effectively.

**Rule:** Log in programmatically via `cy.request()` or a custom command in `beforeEach` instead of using the UI. This is significantly faster.
**Rule:** Use `cy.session()` for persistent login state across tests within a spec file, reducing redundant login calls.
**Rule:** Leverage `cy.prompt()` (available 2025) for natural language test generation and self-healing selectors.

```typescript
// cypress/support/commands.ts
Cypress.Commands.add('apiLogin', (email, password) => {
  cy.session([email, password], () => { // Cache session for faster subsequent runs
    cy.request('POST', '/api/login', { email, password })
      .its('body.token')
      .then((token) => {
        localStorage.setItem('jwt', token); // Store token for authenticated requests
      });
  }, {
    cacheAcrossSpecs: true // Cache across spec files for even faster runs
  });
});

// In your test file
describe('Authenticated Features', () => {
  beforeEach(() => {
    cy.apiLogin('[email protected]', 'password123');
    cy.visit('/dashboard');
  });
  // ... tests ...
});
```

## 7. Test Naming & Readability

Write clear, descriptive test names that explain the intent and expected outcome.

❌ **BAD:** Vague test names
```typescript
it('test 1', () => { /* ... */ });
it('login works', () => { /* ... */ });
```

✅ **GOOD:** Descriptive test names
```typescript
describe('Authentication', () => {
  it('should allow a valid user to log in and redirect to dashboard', () => { /* ... */ });
  context('when credentials are invalid', () => {
    it('should display an error message for incorrect password', () => { /* ... */ });
  });
});
```

## 8. Avoiding External Sites

Keep E2E tests focused on our application. If an external origin is unavoidable, use `cy.origin()`.

❌ **BAD:** Automating external sites directly
```typescript
cy.visit('https://our-app.com');
cy.get('.external-link').click();
cy.url().should('include', 'external-provider.com');
cy.get('#external-form').type('data'); // Unreliable, out of our control
```

✅ **GOOD:** Using `cy.origin()` for controlled external interactions
```typescript
it('should handle OAuth redirect', () => {
  cy.visit('/login');
  cy.getBySel('oauth-login-button').click();

  cy.origin('https://external-oauth.com', () => {
    cy.get('#username').type('oauth_user');
    cy.get('#password').type('oauth_pass');
    cy.get('#submit').click();
  });

  cy.url().should('include', '/dashboard'); // Back to our app
});
```

© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc

Похожие правила IDE

Все правила IDE по теме «Тесты и QA» →
cypress-e2e-testing-cursorrules-prompt-file PatrickJS Правило помогает агенту создавать Cypress E2E-тесты для критических пользовательских сценариев. Оно учитывает TypeScript и требует устойчивых селекторов. ★ 41 028звёзд репо cypress-automation kindlmann Скилл для написания тестов на Cypress в TypeScript: E2E, компонентные тесты, cy.intercept, cy.session и запуск в CI. CX Codex +1 1 000установок cypress-docs cypress-io Заставляет агента искать в официальной документации Cypress, а не сочинять по памяти. Пригодится, когда нужен точный синтаксис команды или поведение в конкретной версии. CX Codex +1 8 200установок cypress-tap cypress-io Управляет запущенной сессией Cypress open через CLI без интерфейса. Помогает прогонять тесты, читать логи репортёра и проверять DOM прямо из чата с агентом. CX Codex +1 2 700установок cypress-integration-testing-cursorrules-prompt-file PatrickJS Настраивает Cursor на создание интеграционных тестов в Cypress. Фокусирует модель на проверке связок UI и API через cy.intercept и селекторы data-testid. ★ 41 028звёзд репо e2e-testing-automation aj-geddes Скилл помогает писать end-to-end тесты: браузерные сценарии, проверка пользовательских путей и связки фронтенда с бэкендом. CX Codex +1 689установок

Из того же набора240

Весь набор →
datadog Правило для Cursor задаёт стандарты Datadog: обязательные теги service, env и version, структурные логи и порядок в именах метрик. ★ 3 580звёзд репо databricks Задаёт стандарты разработки на Databricks: вынос кода из блокнотов в модули, настройку бандлов и перенос тяжёлых вычислений с мощностей Databricks Apps. ★ 3 580звёзд репо dask Правило помогает писать код на Dask с учётом ленивых вычислений, памяти и работы кластера. Подключите его, когда Cursor редактирует Python-проект с Dask. ★ 3 580звёзд репо d3 Правило для Cursor задаёт, как писать код визуализаций на D3.js v7+: модульные импорты, selection.join() вместо ручного enter/update/exit, стили через CSS. ★ 3 580звёзд репо customtkinter Правило для Cursor подсказывает, как организовать приложение на customtkinter: вынести логику интерфейса в класс и последовательно настроить оформление. ★ 3 580звёзд репо cuda Правило задаёт Cursor стиль работы с CUDA C++: проверка ошибок API, разделение host и device кода, оптимизация ядер. Пригодится, если пишете GPU-код и устали от молчаливых падений. ★ 3 580звёзд репо css Задаёт стандарты вёрстки для Cursor: модульную структуру Sass, именование по БЭМ, переменные и производительную анимацию. Пригодится для поддержки чистоты в стилях. ★ 3 580звёзд репо crewai Правило для Python-файлов подсказывает Cursor, как организовать CrewAI: разделять агентов, задачи и оркестрацию, а также передавать контекст между задачами. ★ 3 580звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой