Сохранение сессий

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


Основные подходы к сохранению сессий

  1. Использование cy.session()

cy.session() — современный и рекомендуемый способ управления сессиями в Cypress. Метод позволяет сохранять состояние пользователя, включая куки, localStorage и sessionStorage, и повторно использовать его в других тестах.

Пример использования:

describe('Тесты с сохранением сессии', () => {
  beforeEach(() => {
    cy.session('userSession', () => {
      cy.visit('/login');
      cy.get('#username').type('user');
      cy.get('#password').type('password');
      cy.get('button[type="submit"]').click();
      cy.url().should('include', '/dashboard');
    });
  });

  it('Проверка отображения панели пользователя', () => {
    cy.visit('/dashboard');
    cy.get('.user-panel').should('be.visible');
  });
});

В этом примере сессия 'userSession' создается один раз и автоматически восстанавливается для последующих тестов. Cypress сравнивает сохранённое состояние и восстанавливает его без необходимости повторного логина.

Преимущества cy.session():

  • Значительно ускоряет выполнение тестов.
  • Сохраняет состояние между тестами и даже между различными spec-файлами при корректной конфигурации.
  • Поддерживает кэширование куков и локального хранилища.

Управление куками и локальным хранилищем

До появления cy.session() сохранять сессию приходилось вручную через куки и localStorage.

Пример сохранения куков:

beforeEach(() => {
  cy.getCookie('session_id').then(cookie => {
    if (!cookie) {
      cy.visit('/login');
      cy.get('#username').type('user');
      cy.get('#password').type('password');
      cy.get('button[type="submit"]').click();
    }
  });
});

Сохранение и восстановление localStorage:

let LOCAL_STORAGE_MEMORY = {};

beforeEach(() => {
  cy.restoreLocalStorage();
});

afterEach(() => {
  cy.saveLocalStorage();
});

Cypress.Commands.add('saveLocalStorage', () => {
  Object.keys(localStorage).forEach(key => {
    LOCAL_STORAGE_MEMORY[key] = localStorage[key];
  });
});

Cypress.Commands.add('restoreLocalStorage', () => {
  Object.keys(LOCAL_STORAGE_MEMORY).forEach(key => {
    localStorage.setItem(key, LOCAL_STORAGE_MEMORY[key]);
  });
});

Такой подход позволяет вручную контролировать состояние между тестами, но требует дополнительного кода и сложнее в поддержке по сравнению с cy.session().


Влияние на производительность

Использование cy.session() снижает количество операций авторизации, что особенно важно при большом наборе тестов. Сессии кэшируются в памяти или на диске, а Cypress автоматически проверяет, нужно ли пересоздавать сессию.

Ключевые моменты по производительности:

  • Сессии можно перезаписывать при изменении логики логина.
  • Кэширование ускоряет выполнение тестов на десятки процентов.
  • Обновление или очистка сессий выполняется с помощью параметра persist: false.

Советы по надёжному использованию

  • Уникальные ключи сессий позволяют использовать несколько пользовательских аккаунтов в разных тестах.
  • Проверка URL после логина гарантирует, что сессия была успешно создана.
  • Очистка данных перед тестами (cy.clearCookies(), cy.clearLocalStorage()) предотвращает неожиданные конфликты между сессиями.
  • Для тестов, которые изменяют состояние приложения, рекомендуется использовать отдельные сессии, чтобы изолировать влияние тестов друг на друга.

Интеграция с CI/CD

Сессии особенно полезны в интеграции с CI/CD, где многократные авторизации могут замедлять сборки. Использование cy.session() позволяет:

  • Минимизировать количество обращений к API аутентификации.
  • Сохранять стабильность тестов при параллельном запуске.
  • Легко управлять сессиями разных пользователей через конфигурацию окружений.

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