Очистка данных после тестов

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

1. Использование хуков after и afterEach

Cypress поддерживает Mocha-хуки, позволяющие выполнять код после завершения тестов или каждого теста отдельно.

afterEach(() => {
  // Очистка сессии и куки
  cy.clearCookies();
  cy.clearLocalStorage();
});

after(() => {
  // Сброс данных на сервере
  cy.request('POST', '/api/test/cleanup');
});
  • afterEach запускается после каждого теста, что удобно для сброса локального состояния.
  • after выполняется один раз после всех тестов в блоке, подходит для глобальной очистки данных на сервере.

2. Очистка базы данных через API

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

Cypress.Commands.add('resetDatabase', () => {
  cy.request('POST', '/api/test/reset-database');
});

Использование в тестах:

beforeEach(() => {
  cy.resetDatabase();
});
  • Такой подход гарантирует, что каждый тест запускается с одинаковым начальным состоянием.
  • API-запросы для очистки должны быть атомарными и быстрыми, чтобы не замедлять тестовый прогон.

3. Управление локальным состоянием браузера

Cypress предоставляет методы для очистки cookies, localStorage и sessionStorage, что предотвращает «загрязнение» данных между тестами.

afterEach(() => {
  cy.clearCookies();
  cy.clearLocalStorage();
  sessionStorage.clear();
});
  • cy.clearCookies() — удаляет все cookies браузера.
  • cy.clearLocalStorage() — очищает localStorage для текущего домена.
  • sessionStorage.clear() — очищает sessionStorage, который не поддерживается напрямую Cypress.

4. Тестовые данные и фикстуры

Фикстуры позволяют подготавливать данные для тестов и управлять их восстановлением. После теста можно удалять созданные записи через API или базу данных.

beforeEach(() => {
  cy.fixture('user').then(user => {
    cy.request('POST', '/api/users', user);
  });
});

afterEach(() => {
  cy.request('DELETE', '/api/users');
});
  • Фикстуры создают предсказуемое состояние.
  • Очистка через API позволяет избежать зависимостей между тестами.

5. Принципы эффективной очистки

  1. Изоляция тестов — каждый тест должен быть независимым.
  2. Минимизация ручных действий — все очистки должны выполняться автоматически через хуки.
  3. Использование тестовых окружений — очистка данных на продакшн-сервере недопустима.
  4. Атомарность операций — сброс данных должен быть быстрым и не оставлять промежуточного состояния.
  5. Логирование очистки — полезно для отладки, особенно при сложных тестовых сценариях.

6. Примеры комплексной очистки

afterEach(() => {
  cy.clearCookies();
  cy.clearLocalStorage();
  cy.request('POST', '/api/test/cleanup')
    .then(response => {
      expect(response.status).to.eq(200);
    });
});
  • Такой подход объединяет очистку как локального, так и серверного состояния.
  • Использование проверки статуса запроса гарантирует успешное выполнение очистки.

7. Интеграция с базами данных

Для крупных проектов очистка через API может быть недостаточной. В таких случаях подключают прямые запросы к базе данных через Node.js.

const { Client } = require('pg');

Cypress.Commands.add('cleanDb', () => {
  const client = new Client({ connectionString: process.env.TEST_DB_URL });
  client.connect();
  client.query('TRUNCATE TABLE users, orders RESTART IDENTITY CASCADE');
  client.end();
});
  • Этот метод требует запуска Cypress в среде с доступом к тестовой базе.
  • Позволяет полностью контролировать данные без промежуточных слоев API.

8. Рекомендации по производительности

  • Очистка после каждого теста удобна для стабильности, но может замедлять прогон.
  • Для больших наборов тестов лучше комбинировать beforeEach для подготовки данных и after для глобальной очистки.
  • Использование batch-запросов или SQL-транзакций ускоряет сброс данных на сервере.

Эффективная очистка данных — ключ к стабильным, предсказуемым и повторяемым тестам в Cypress. Грамотная комбинация хуков, API-запросов и управления локальным состоянием браузера обеспечивает высокое качество тестирования и минимизирует влияние тестов друг на друга.