Подключение к базам данных

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


Архитектура взаимодействия

Cypress работает в браузере и строго ограничен политикой безопасности (CORS, Same-Origin Policy). Прямое подключение к базе данных из тестов невозможно. Для обхода этого ограничения используются промежуточные слои:

  1. Node.js-плагины Cypress — выполняются в окружении Node, что позволяет использовать драйверы баз данных.
  2. API-интерфейсы — создание REST или GraphQL эндпоинтов для взаимодействия с базой.
  3. Вспомогательные скрипты — отдельные Node.js скрипты, которые запускаются через Cypress tasks.

Ключевой принцип: любые операции с базой данных выполняются не в браузере, а в Node-процессе, доступ к которому Cypress предоставляет через cy.task().


Настройка подключения через Node.js

  1. Установка драйвера базы данных

Для популярных СУБД используются следующие пакеты:

npm install mysql2      # MySQL/MariaDB
npm install pg          # PostgreSQL
npm install mssql       # Microsoft SQL Server
npm install mongodb     # MongoDB
  1. Конфигурация в cypress.config.js
const mysql = require('mysql2/promise');

module.exports = {
  e2e: {
    setupNodeEvents(on, config) {
      on('task', {
        async queryDatabase({ sql, values }) {
          const connection = await mysql.createConnection({
            host: 'localhost',
            user: 'test_user',
            password: 'password',
            database: 'test_db',
          });
          const [rows] = await connection.execute(sql, values);
          await connection.end();
          return rows;
        }
      });
    }
  }
};
  1. Использование в тестах
describe('Проверка данных в базе', () => {
  it('Должен вернуть пользователя с email', () => {
    cy.task('queryDatabase', {
      sql: 'SELECT * FROM users WHERE email = ?',
      values: ['user@example.com']
    }).then((result) => {
      expect(result).to.have.length(1);
      expect(result[0].email).to.equal('user@example.com');
    });
  });
});

Практика работы с тестовыми данными

Для обеспечения воспроизводимости тестов рекомендуется:

  • Очистка и подготовка данных перед каждым тестом:
cy.task('queryDatabase', { sql: 'DELETE FROM users WHERE test_flag = 1' });
cy.task('queryDatabase', { sql: 'INSERT INTO users (name, email, test_flag) VALUES (?, ?, 1)', values: ['Test User', 'test@example.com'] });
  • Использование транзакций для отката изменений после теста.
  • Выделение тестовой базы данных вместо работы с продакшеном.

Работа с разными СУБД

PostgreSQL

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

on('task', {
  async queryDatabase({ sql, values }) {
    const client = new Client({
      host: 'localhost',
      user: 'postgres',
      password: 'password',
      database: 'test_db',
    });
    await client.connect();
    const res = await client.query(sql, values);
    await client.end();
    return res.rows;
  }
});

MongoDB

const { MongoClient } = require('mongodb');

on('task', {
  async queryDatabase({ collection, query }) {
    const client = new MongoClient('mongodb://localhost:27017');
    await client.connect();
    const db = client.db('test_db');
    const result = await db.collection(collection).find(query).toArray();
    await client.close();
    return result;
  }
});

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

  • Никогда не хранить учетные данные базы данных в коде. Использовать переменные окружения (process.env.DB_USER, process.env.DB_PASS).
  • Для больших объемов данных использовать батчи и лимиты запросов.
  • Минимизировать количество обращений к базе в цикле тестов, предпочтительно один запрос за тест.
  • Логировать SQL-запросы для отладки через Cypress log.

Альтернативы прямому подключению

  • Использование API для управления тестовыми данными. Это позволяет полностью абстрагировать тесты от конкретной СУБД.
  • Фикстуры Cypress (fixtures). Для статических тестовых данных можно использовать JSON файлы, которые загружаются в базу через API перед тестом.

Итоговые ключевые моменты

  • Cypress не может напрямую подключаться к базе данных из браузера.
  • Взаимодействие реализуется через cy.task() и Node.js драйверы.
  • Важно использовать тестовую базу, очищать данные и применять транзакции.
  • Разделение браузерного тестирования и работы с данными повышает надежность и воспроизводимость тестов.