Работа с базами данных

Одной из важнейших частей автоматизированного тестирования является работа с данными. Тесты, которые взаимодействуют с веб-страницами, часто нуждаются в настройке начальных данных или в проверке того, как изменения на страницах отражаются в базе данных. В этом контексте Playwright предоставляет удобные механизмы для взаимодействия с внешними системами, такими как базы данных.

В процессе тестирования с использованием Playwright можно интегрировать выполнение SQL-запросов, взаимодействовать с базой данных напрямую из тестов, а также эмулировать состояние, необходимое для проверки функционала веб-приложения.

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

Для работы с базой данных в рамках теста обычно используют отдельные библиотеки и инструменты, такие как pg для PostgreSQL или mysql2 для MySQL. Они позволяют напрямую подключаться к базе данных, выполнять запросы и проверять, как изменяются данные в процессе теста. Важно помнить, что это не является частью самого Playwright, но интегрировать работу с базой данных в тесты можно достаточно легко.

Пример подключения к PostgreSQL

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

const client = new Client({
  user: 'user',
  host: 'localhost',
  database: 'test_db',
  password: 'password',
  port: 5432,
});

await client.connect();

const res = await client.query('SELECT * FROM users WHERE id = $1', [1]);
console.log(res.rows[0]);

await client.end();

Этот пример демонстрирует стандартное подключение к PostgreSQL, выполнение запроса и получение данных. Такой подход может быть использован для подготовки данных перед запуском тестов или для их проверки после выполнения действий в тестах.

Взаимодействие с базой данных через API

Вместо того чтобы подключаться к базе данных напрямую, можно взаимодействовать с ней через API, если приложение предоставляет такой доступ. В Playwright можно использовать встроенные методы для отправки HTTP-запросов, что позволяет работать с API, которое изменяет или извлекает данные из базы.

Для этого можно использовать такие библиотеки, как axios или node-fetch, чтобы эмулировать запросы к API. Например, после выполнения теста на веб-странице можно отправить запрос на изменение данных и затем проверить результат.

Пример использования API с Playwright

const axios = require('axios');

async function getUser(id) {
  const response = await axios.get(`http://localhost/api/users/${id}`);
  return response.data;
}

async function updateUser(id, data) {
  await axios.put(`http://localhost/api/users/${id}`, data);
}

// Пример использования в тесте
const user = await getUser(1);
expect(user.name).toBe('John Doe');

await updateUser(1, { name: 'Jane Doe' });

const updatedUser = await getUser(1);
expect(updatedUser.name).toBe('Jane Doe');

Такой подход позволяет комбинировать взаимодействие с веб-приложением через Playwright и проверку состояния базы данных через API. Это даёт возможность создавать более гибкие и масштабируемые тесты.

Использование базы данных для подготовки тестовых данных

Для выполнения качественного тестирования важно иметь возможность гибко управлять данными в базе данных. Например, часто нужно подготавливать данные перед запуском теста (например, создавать записи в базе данных) или очищать их после выполнения тестов. Для этих целей можно использовать методы для вставки, обновления и удаления данных непосредственно через запросы в базу.

Пример подготовки данных перед тестом

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

async function setupTestData() {
  const client = new Client({
    user: 'user',
    host: 'localhost',
    database: 'test_db',
    password: 'password',
    port: 5432,
  });

  await client.connect();

  // Создание тестовой записи в базе
  await client.query(
    'INSERT INTO users (id, name, email) VALUES ($1, $2, $3)',
    [1, 'Test User', 'testuser@example.com']
  );

  await client.end();
}

// Вызов функции перед тестом
beforeAll(async () => {
  await setupTestData();
});

Этот код использует метод beforeAll, чтобы подготовить данные перед началом теста. После этого данные можно использовать для взаимодействия с веб-страницей.

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

После выполнения теста важно очистить базу данных, чтобы обеспечить независимость тестов друг от друга. Для этого можно использовать методы удаления данных, например, с помощью SQL-запросов. В Playwright также можно использовать метод afterAll для очистки данных.

Пример удаления данных после теста

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

async function cleanupTestData() {
  const client = new Client({
    user: 'user',
    host: 'localhost',
    database: 'test_db',
    password: 'password',
    port: 5432,
  });

  await client.connect();

  // Удаление тестовой записи
  await client.query('DELETE FROM users WHERE id = $1', [1]);

  await client.end();
}

// Очистка данных после теста
afterAll(async () => {
  await cleanupTestData();
});

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

Мокирование запросов к базе данных

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

Для мокирования можно использовать различные библиотеки, такие как jest с его встроенными функциями для мокирования, или сторонние инструменты, например, sinon.

Пример мокирования с использованием Jest

const axios = require('axios');
jest.mock('axios');

test('проверка данных пользователя', async () => {
  axios.get.mockResolvedVal ue({ data: { id: 1, name: 'Test User' } });

  const user = await axios.get('http://localhost/api/users/1');
  expect(user.data.name).toBe('Test User');
});

Мокирование запросов помогает изолировать тесты и избежать зависимости от реальной базы данных, что особенно полезно при тестировании сложных пользовательских сценариев.

Заключение

Работа с базами данных в автоматизированных тестах с использованием Playwright позволяет значительно повысить гибкость и надежность тестов. Использование прямых запросов к базе данных, взаимодействие через API и подготовка тестовых данных помогает создавать более стабильные и быстрые тесты. Мокирование запросов и очистка базы данных после тестов позволяет избежать нежелательных последствий от изменений, что важно для обеспечения независимости тестов.