Для автоматизированного тестирования веб-приложений часто требуется взаимодействие с базой данных. PostgreSQL является одной из наиболее популярных СУБД для хранения данных. В связке с Puppeteer она позволяет не только управлять браузером, но и проверять состояние данных, например, после выполнения формы или других действий пользователя.
Основным инструментом для работы с PostgreSQL в Node.js является пакет
pg. Его установка выполняется командой:
npm install pg
Создание соединения с базой данных выглядит следующим образом:
const { Pool } = require(&
const pool = new Pool({
user: 'username',
host: 'localhost',
database: 'testdb',
password: 'password',
port: 5432,
});
async function queryDatabase(queryText, params = []) {
const client = await pool.connect();
try {
const res = await client.query(queryText, params);
return res.rows;
} finally {
client.release();
}
}
В этом примере используется Pool, обеспечивающий управление
подключениями и повторное использование соединений, что критично при
параллельных тестах.
Часто необходимо проверять данные в базе после выполнения действий в
браузере. Puppeteer позволяет управлять страницей, а pg —
проверять состояние базы. Пример:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('http://localhost:3000/login');
await page.type('#username', 'testuser');
await page.type('#password', 'password123');
await page.click('#submit');
// Ждем навигации после клика
await page.waitForNavigation();
// Проверка в базе данных
const users = await queryDatabase('SELECT * FROM users WHERE username = $1', ['testuser']);
if (users.length > 0) {
console.log('Пользователь существует в базе');
}
await browser.close();
})();
Ключевым моментом является синхронизация действий в браузере и проверок в базе данных, чтобы запросы выполнялись только после завершения необходимых событий на странице.
Для тестов часто требуется создавать данные, а затем откатывать их, чтобы не загрязнять базу. PostgreSQL поддерживает транзакции:
async function testWithTransaction() {
const client = await pool.connect();
try {
await client.query('BEGIN');
await client.query('INSERT INTO users(username, password) VALUES($1, $2)', ['tempuser', '123']);
const res = await client.query('SELE CT * FROM users WHERE username = $1', ['tempuser']);
console.log(res.rows);
await client.query('ROLLBACK'); // Отмена изменений после теста
} finally {
client.release();
}
}
Использование транзакций позволяет создавать изолированные тесты, которые не влияют на реальную базу данных.
В реальных тестах часто требуется проверка данных после определенных действий. Например, после заполнения формы на сайте можно проверить наличие записи в базе:
await page.goto('http://localhost:3000/register');
await page.type('#email', 'user@example.com');
await page.type('#password', 'securepass');
await page.click('#register');
await page.waitForSelector('.success-message');
const newUser = await queryDatabase('SELECT * FROM users WHERE email = $1', ['user@example.com']);
if (newUser.length === 1) {
console.log('Регистрация прошла успешно и данные сохранены в базе');
}
Особое внимание следует уделять ожиданию элементов на
странице (waitForSelector,
waitForNavigation), иначе проверка в базе может выполняться
до завершения сохранения данных.
При запуске множества Puppeteer-скриптов одновременно необходимо
учитывать нагрузку на базу. Использование Pool позволяет
эффективно управлять соединениями, но количество подключений нужно
ограничивать:
const pool = new Pool({
max: 10, // максимум 10 соединений одновременно
user: 'username',
host: 'localhost',
database: 'testdb',
password: 'password',
port: 5432,
});
Если число параллельных браузеров превышает max, новые
запросы будут ожидать освобождения соединений, что предотвращает ошибки
переполнения.
Для тестирования важно видеть, какие данные записаны в базу. Можно использовать простой лог:
async function queryDatabaseWithLog(queryText, params = []) {
console.log('Выполняется запрос:', queryText, 'с параметрами:', params);
const result = await queryDatabase(queryText, params);
console.log('Результат запроса:', result);
return result;
}
Такое логирование помогает отслеживать ошибки на этапе тестирования и анализировать поведение приложения.
Pool с
ограничением max предотвращает перегрузку базы.
Связка Puppeteer и PostgreSQL обеспечивает мощную комбинацию для тестирования веб-приложений, позволяя не только эмулировать действия пользователя, но и проверять реальные изменения в базе данных, что критично для надежных автоматизированных тестов.