Сохранение cookies между тестами

В Cypress cookies используются для хранения информации о сессии пользователя, токенов аутентификации, предпочтений и других данных, необходимых для работы веб-приложения. Важной задачей в автоматизированном тестировании является сохранение состояния между тестами, чтобы избежать повторной авторизации или повторного выполнения одних и тех же действий.

Основные возможности Cypress для работы с cookies

Cypress предоставляет встроенные команды для управления cookies:

  • cy.setCookie(name, value, options) — установка cookie с заданным именем и значением. Опции позволяют указать путь, домен, флаг безопасности и срок действия.
  • cy.getCookie(name) — получение конкретного cookie по имени.
  • cy.getCookies([filter]) — получение всех cookies или выборки по фильтру.
  • cy.clearCookie(name) и cy.clearCookies() — удаление отдельных или всех cookies.
  • cy.saveCookies() и cy.restoreCookies() — нестандартные подходы через плагины для сохранения состояния между тестами (не входят в стандарт Cypress).

Сессии и изоляция тестов

По умолчанию Cypress изолирует каждый тест, очищая cookies, localStorage и sessionStorage перед выполнением следующего теста. Это обеспечивает независимость тестов, но может быть неудобно, если требуется сохранение авторизации или других данных сессии.

Для сохранения cookies между тестами используются несколько подходов:

  1. Использование before и beforeEach для установки состояния:
before(() => {
  cy.visit('/login');
  cy.get('#username').type('admin');
  cy.get('#password').type('password');
  cy.get('button[type="submit"]').click();
  cy.getCookies().then((cookies) => {
    Cypress.env('savedCookies', cookies);
  });
});

beforeEach(() => {
  const cookies = Cypress.env('savedCookies');
  if (cookies) {
    cookies.forEach(cookie => {
      cy.setCookie(cookie.name, cookie.value, {
        domain: cookie.domain,
        path: cookie.path,
        secure: cookie.secure,
        httpOnly: cookie.httpOnly,
      });
    });
  }
});

В этом примере логин выполняется один раз в блоке before, после чего cookies сохраняются в переменной окружения Cypress и восстанавливаются перед каждым тестом.

  1. Использование плагина cypress-session или аналогичных подходов: Плагины позволяют управлять сессиями, сохраняя cookies автоматически между тестами без ручного кода восстановления. Это особенно удобно для больших тестовых наборов с множеством сценариев, требующих авторизации.

Управление отдельными cookies

Для более тонкого контроля можно сохранять и восстанавливать только конкретные cookies, что уменьшает риск конфликтов:

cy.getCookie('session_id').then(cookie => {
  Cypress.env('sessionCookie', cookie);
});

beforeEach(() => {
  const cookie = Cypress.env('sessionCookie');
  if (cookie) {
    cy.setCookie(cookie.name, cookie.value);
  }
});

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

Опции и особенности

  • Флаг secure: при работе с локальным сервером может потребоваться убрать secure при восстановлении cookies.
  • Домен и путь: при сохранении cookies важно учитывать домен и путь, иначе cookie может не применяться к текущему URL.
  • Время жизни cookies: при необходимости можно вручную указать expiration date при восстановлении.

Использование Cypress.Cookies.preserveOnce и Cypress.Cookies.defaults

Cypress предоставляет более удобные средства для автоматического сохранения cookies:

Cypress.Cookies.defaults({
  preserve: ['session_id', 'auth_token']
});

Эта настройка позволяет сохранять указанные cookies между тестами без явного восстановления в beforeEach. Cypress.Cookies.preserveOnce('session_id') выполняет аналогичную функцию для отдельных cookies в рамках текущего блока.

Практические советы

  • Для тестов, связанных с авторизацией, рекомендуется сохранять только ключевые cookies, чтобы минимизировать влияние устаревших данных.
  • При тестировании нескольких пользователей лучше использовать разные переменные окружения для хранения cookies каждой сессии.
  • Использование плагинов для управления сессиями упрощает масштабирование тестов и уменьшает дублирование кода.

Соблюдение этих подходов позволяет эффективно управлять cookies в Cypress, обеспечивая повторяемость тестов и сокращая время выполнения за счет минимизации повторных входов и инициализации сессий.