Прямые запросы к БД

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

В этом разделе рассматривается, как можно выполнять прямые запросы к базе данных в WebdriverIO, используя JavaScript.

1. Зачем нужны прямые запросы к БД?

Когда тестируется веб-приложение, важно не только проверять, что оно работает правильно с точки зрения пользователя, но и убедиться, что данные в базе данных обрабатываются корректно. Прямые запросы к БД позволяют тестировщикам:

  • Проверить, что данные были корректно записаны в базу данных после выполнения определённых действий в приложении.
  • Убедиться, что данные, введённые пользователем, сохранены в соответствующих таблицах БД.
  • Выполнить сложные проверки состояния системы, которые невозможно легко реализовать через UI.

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

2. Как настроить прямое подключение к базе данных

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

Установка зависимостей

Для работы с базой данных потребуется установить подходящий клиент для выбранной базы. Например, для PostgreSQL или MySQL используются следующие библиотеки:

npm install mysql2  // для MySQL
npm install pg      // для PostgreSQL

Эти библиотеки позволяют вам работать с базой данных непосредственно из тестов.

Пример настройки для MySQL
const mysql = require('mysql2');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'test_db'
});

connection.connect((err) => {
  if (err) {
    console.error('Ошибка подключения к базе данных:', err.stack);
    return;
  }
  console.log('Подключение к базе данных успешно установлено.');
});
Пример настройки для PostgreSQL
const { Client } = require('pg');

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

client.connect((err) => {
  if (err) {
    console.error('Ошибка подключения к базе данных:', err.stack);
    return;
  }
  console.log('Подключение к базе данных успешно установлено.');
});

После того как подключение настроено, можно отправлять запросы к базе данных непосредственно из тестов WebdriverIO.

3. Выполнение запросов из тестов

Для того чтобы выполнить запросы в тестах, нужно использовать API, предоставляемое клиентом БД. Пример использования запросов:

Пример запроса для проверки данных в MySQL
describe('Тестирование прямых запросов к MySQL', () => {
  it('Проверка данных в базе данных', async () => {
    const query = 'SELECT * FROM users WHERE id = 1';

    connection.query(query, (err, results) => {
      if (err) {
        console.error('Ошибка запроса:', err);
        return;
      }

      // Проверка данных в базе
      const user = results[0];
      expect(user.name).toBe('Иван');
      expect(user.email).toBe('ivan@example.com');
    });
  });
});
Пример запроса для PostgreSQL
describe('Тестирование прямых запросов к PostgreSQL', () => {
  it('Проверка данных в базе данных', async () => {
    const query = 'SELECT * FROM users WHERE id = 1';

    client.query(query, (err, res) => {
      if (err) {
        console.error('Ошибка запроса:', err.stack);
        return;
      }

      // Проверка данных в базе
      const user = res.rows[0];
      expect(user.name).toBe('Иван');
      expect(user.email).toBe('ivan@example.com');
    });
  });
});

4. Важные моменты при работе с базой данных

Асинхронность запросов

Запросы к базе данных часто выполняются асинхронно. Поэтому важно правильно использовать async/await или другие механизмы обработки асинхронных операций в JavaScript. Пример работы с асинхронными запросами в WebdriverIO:

describe('Тестирование асинхронных запросов к базе данных', () => {
  it('Проверка данных после регистрации пользователя', async () => {
    const query = 'SELECT * FROM users WHERE id = 1';
    
    await new Promise((resolve, reject) => {
      connection.query(query, (err, results) => {
        if (err) reject(err);
        else resolve(results);
      });
    }).then((results) => {
      const user = results[0];
      expect(user.name).toBe('Иван');
      expect(user.email).toBe('ivan@example.com');
    });
  });
});
Безопасность запросов

При работе с базой данных необходимо помнить об основных принципах безопасности, таких как защита от SQL-инъекций. Использование параметризированных запросов и подготовленных выражений помогает избежать уязвимостей.

Пример с подготовленным выражением в MySQL:

const query = 'SELECT * FROM users WHERE email = ?';
connection.execute(query, ['ivan@example.com'], (err, results) => {
  if (err) {
    console.error('Ошибка запроса:', err.stack);
    return;
  }

  const user = results[0];
  expect(user.name).toBe('Иван');
});

Для PostgreSQL подготовленные выражения выглядят следующим образом:

const query = 'SELECT * FROM users WHERE email = $1';
client.query(query, ['ivan@example.com'], (err, res) => {
  if (err) {
    console.error('Ошибка запроса:', err.stack);
    return;
  }

  const user = res.rows[0];
  expect(user.name).toBe('Иван');
});

5. Советы по интеграции запросов в тесты WebdriverIO

  1. Не забывайте об очистке данных. После выполнения тестов с запросами к базе данных важно убедиться, что тестовая база данных очищена от данных, которые были использованы в тестах. Это можно делать через специальные SQL-скрипты или при помощи транзакций.

  2. Тестирование в изолированных окружениях. Для тестирования базы данных рекомендуется использовать изолированные тестовые базы данных, чтобы не нарушить работоспособность реальной базы данных приложения.

  3. Комбинирование с UI-тестами. Прямые запросы к базе данных полезны, когда нужно проверить, что изменения, произведенные через интерфейс, правильно отразились в базе данных. С помощью WebdriverIO можно автоматизировать и UI-тесты, и проверки на уровне базы данных, что позволяет получить более полные и надежные результаты.

6. Заключение

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