Работа с PostgreSQL

Для автоматизированного тестирования веб-приложений часто требуется взаимодействие с базой данных. 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

Часто необходимо проверять данные в базе после выполнения действий в браузере. 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();
  }
}

Использование транзакций позволяет создавать изолированные тесты, которые не влияют на реальную базу данных.


Проверка состояния базы через Puppeteer

В реальных тестах часто требуется проверка данных после определенных действий. Например, после заполнения формы на сайте можно проверить наличие записи в базе:

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;
}

Такое логирование помогает отслеживать ошибки на этапе тестирования и анализировать поведение приложения.


Рекомендации по архитектуре тестов

  1. Разделение слоев: действия в браузере и проверки в базе должны быть логически разделены.
  2. Изолированность тестов: использовать транзакции или отдельные тестовые схемы.
  3. Синхронизация: обязательно дожидаться выполнения действий на странице перед проверкой данных.
  4. Оптимизация соединений: Pool с ограничением max предотвращает перегрузку базы.
  5. Логирование: позволяет быстрее находить ошибки и понимать цепочку действий.

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