Cypress изначально не предназначен для прямой работы с базами данных. Основная цель инструмента — тестирование фронтенда и взаимодействия с веб-приложениями через браузер. Однако интеграция с базой данных необходима для проверки данных, подготовки тестового окружения и валидации результатов. В JavaScript-тестировании существуют несколько подходов к работе с базой данных через Cypress.
Cypress работает в браузере и строго ограничен политикой безопасности (CORS, Same-Origin Policy). Прямое подключение к базе данных из тестов невозможно. Для обхода этого ограничения используются промежуточные слои:
Ключевой принцип: любые операции с базой данных
выполняются не в браузере, а в Node-процессе, доступ к которому Cypress
предоставляет через cy.task().
Для популярных СУБД используются следующие пакеты:
npm install mysql2 # MySQL/MariaDB
npm install pg # PostgreSQL
npm install mssql # Microsoft SQL Server
npm install mongodb # MongoDB
cypress.config.jsconst 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;
}
});
}
}
};
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).fixtures). Для
статических тестовых данных можно использовать JSON файлы, которые
загружаются в базу через API перед тестом.cy.task() и Node.js
драйверы.