Переиспользование fixtures

Fixtures в Cypress представляют собой статические файлы с данными, которые удобно использовать для тестирования различных сценариев. Обычно они хранятся в папке cypress/fixtures и могут быть в формате JSON, CSV, или даже простого текстового файла. Переиспользование fixtures позволяет централизованно управлять тестовыми данными, повышая читаемость и поддерживаемость тестов.

Организация файлов fixtures

Для удобства лучше структурировать папку fixtures по типам данных. Например:

cypress/
 └─ fixtures/
     ├─ users.json
     ├─ products.json
     └─ auth.json
  • users.json — содержит данные пользователей (имя, email, пароль).
  • products.json — данные товаров или других объектов системы.
  • auth.json — данные для аутентификации.

Такое разделение облегчает повторное использование данных в разных тестах.

Загрузка данных из fixtures

Cypress предоставляет метод cy.fixture(), который загружает данные из файла и возвращает их в виде объекта. Пример использования:

describe('Тест с использованием fixture', () => {
  it('Проверка логина', () => {
    cy.fixture('auth').then((authData) => {
      cy.visit('/login');
      cy.get('#username').type(authData.username);
      cy.get('#password').type(authData.password);
      cy.get('button[type="submit"]').click();
      cy.url().should('include', '/dashboard');
    });
  });
});

Особенности метода cy.fixture():

  • Можно использовать с любым форматом файлов, поддерживаемым Cypress.
  • Метод асинхронный, возвращает данные через then.
  • Поддерживает указание относительного пути внутри папки fixtures.

Переиспользование fixture в нескольких тестах

Для повышения эффективности лучше загружать fixture один раз перед всеми тестами или в beforeEach.

describe('Тестирование пользователей', () => {
  let users;

  before(() => {
    cy.fixture('users').then((data) => {
      users = data;
    });
  });

  it('Регистрация нового пользователя', () => {
    cy.visit('/register');
    cy.get('#name').type(users.newUser.name);
    cy.get('#email').type(users.newUser.email);
    cy.get('#password').type(users.newUser.password);
    cy.get('button[type="submit"]').click();
    cy.contains('Регистрация успешна').should('be.visible');
  });

  it('Логин существующего пользователя', () => {
    cy.visit('/login');
    cy.get('#username').type(users.existingUser.username);
    cy.get('#password').type(users.existingUser.password);
    cy.get('button[type="submit"]').click();
    cy.url().should('include', '/dashboard');
  });
});

В этом примере данные fixture загружаются один раз в before(), что позволяет использовать их в любом тесте внутри блока describe. Это снижает дублирование кода и ускоряет выполнение тестов.

Динамическое переопределение данных

Fixture можно комбинировать с генерацией данных на лету. Например, данные из JSON можно модифицировать перед использованием:

cy.fixture('users').then((users) => {
  const tempUser = { ...users.newUser, email: `user${Date.now()}@example.com` };
  cy.visit('/register');
  cy.get('#name').type(tempUser.name);
  cy.get('#email').type(tempUser.email);
  cy.get('#password').type(tempUser.password);
  cy.get('button[type="submit"]').click();
  cy.contains('Регистрация успешна').should('be.visible');
});

Такой подход позволяет использовать один и тот же fixture для нескольких тестов, создавая уникальные данные там, где это необходимо.

Встраивание fixtures в команды Cypress

Для более масштабного проекта можно создавать кастомные команды Cypress, которые автоматически подгружают fixture и выполняют нужные действия:

Cypress.Commands.add('loginAs', (userKey) => {
  cy.fixture('auth').then((auth) => {
    const user = auth[userKey];
    cy.visit('/login');
    cy.get('#username').type(user.username);
    cy.get('#password').type(user.password);
    cy.get('button[type="submit"]').click();
  });
});

// Использование в тесте
describe('Тестирование авторизации', () => {
  it('Логин админом', () => {
    cy.loginAs('admin');
    cy.url().should('include', '/dashboard');
  });
});

Такой подход делает тесты более читаемыми и минимизирует дублирование кода, особенно при работе с множеством пользователей или ролей.

Советы по переиспользованию fixtures

  • Структурировать файлы по смысловым блокам (пользователи, товары, конфигурации).
  • Загружать данные один раз в before или beforeEach, если данные должны быть свежими.
  • Комбинировать статические данные с динамическими значениями, чтобы избежать конфликтов при повторных тестах.
  • Использовать кастомные команды для типовых операций, упрощая тестовые сценарии.
  • При больших объемах данных можно разделять fixture на несколько файлов и подключать их по мере необходимости.

Эффективное использование fixtures позволяет создавать тесты, которые легко поддерживать, масштабировать и переиспользовать, снижая вероятность ошибок при изменении данных или структуры приложения.