Подключение базы данных

Protractor является инструментом для автоматизации end-to-end тестирования веб-приложений на Angular и AngularJS, однако интеграция с базой данных позволяет расширить возможности тестов: проверять данные на уровне БД, подготавливать тестовые данные и валидировать результаты после действий в интерфейсе. Подключение базы данных в тестах Protractor реализуется через стандартные драйверы для Node.js, такие как mysql2, pg (PostgreSQL) или mongodb.


Установка необходимых пакетов

Для работы с базой данных необходимо установить соответствующий драйвер через npm:

npm install mysql2
npm install pg
npm install mongodb

Также для упрощения работы с промисами и асинхронным кодом удобно использовать async/await, так как Protractor по умолчанию работает на основе промисов.


Конфигурация подключения

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

// db.js
const mysql = require('mysql2/promise');

const dbConfig = {
  host: 'localhost',
  user: 'test_user',
  password: 'password',
  database: 'test_db',
};

async function getConnection() {
  const connection = await mysql.createConnection(dbConfig);
  return connection;
}

module.exports = { getConnection };

Для PostgreSQL конфигурация выглядит аналогично:

// db.js
const { Pool } = require('pg');

const pool = new Pool({
  user: 'test_user',
  host: 'localhost',
  database: 'test_db',
  password: 'password',
  port: 5432,
});

async function query(sql, params) {
  const client = await pool.connect();
  try {
    const res = await client.query(sql, params);
    return res.rows;
  } finally {
    client.release();
  }
}

module.exports = { query };

Для MongoDB используется клиент mongodb:

// db.js
const { MongoClient } = require('mongodb');

const url = 'mongodb://localhost:27017';
const dbName = 'test_db';
let client;

async function connect() {
  if (!client) {
    client = new MongoClient(url);
    await client.connect();
  }
  return client.db(dbName);
}

module.exports = { connect };

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

После создания модуля подключения можно использовать его в тестах. Пример для MySQL:

const { getConnection } = require('./db');

describe('Проверка данных в базе', () => {
  let connection;

  beforeAll(async () => {
    connection = await getConnection();
  });

  afterAll(async () => {
    await connection.end();
  });

  it('Должен вернуть правильное количество пользователей', async () => {
    const [rows] = await connection.execute('SELECT COUNT(*) AS count FROM users');
    expect(rows[0].count).toBe(10);
  });

  it('Должен вставлять тестового пользователя', async () => {
    await connection.execute('INSERT INTO users (name, email) VALUES (?, ?)', ['Test User', 'test@example.com']);
    const [rows] = await connection.execute('SELECT * FROM users WHERE email = ?', ['test@example.com']);
    expect(rows.length).toBe(1);
  });
});

Для PostgreSQL структура похожа:

const { query } = require('./db');

describe('Проверка PostgreSQL', () => {
  it('Должен получать список заказов', async () => {
    const orders = await query('SELE CT * FROM orders WHERE status = $1', ['pending']);
    expect(orders.length).toBeGreaterThan(0);
  });
});

Для MongoDB:

const { connect } = require('./db');

describe('Проверка MongoDB', () => {
  let db;

  beforeAll(async () => {
    db = await connect();
  });

  it('Должен находить пользователя по email', async () => {
    const user = await db.collection('users').findOne({ email: 'test@example.com' });
    expect(user).not.toBeNull();
  });
});

Организация работы с данными

Для поддержания чистоты тестов и предотвращения влияния данных между тестами рекомендуется:

  1. Использовать транзакции там, где это возможно, и откатывать изменения после каждого теста.
  2. Создавать отдельные тестовые схемы или базы данных для тестов.
  3. Подготавливать и очищать данные с помощью beforeEach и afterEach:
beforeEach(async () => {
  await connection.execute('INSERT INTO users (name, email) VALUES (?, ?)', ['Temp User', 'temp@example.com']);
});

afterEach(async () => {
  await connection.execute('DELETE FROM users WHERE email = ?', ['temp@example.com']);
});
  1. Выносить сложные SQL-запросы или операции с БД в отдельные утилиты для переиспользования.

Асинхронность и ожидания

Так как Protractor сам по себе работает с асинхронными операциями, при работе с БД важно использовать async/await для синхронизации действий с тестируемым интерфейсом и базой данных:

await browser.get('/users');
const rows = await connection.execute('SELECT * FROM users');
expect(rows[0].name).toBe(await element(by.css('.user-name')).getText());

Это позволяет проверять корректность отображения данных в интерфейсе на основе актуального состояния БД.


Рекомендации по безопасности

  • Никогда не использовать реальные производственные данные. Для тестирования следует создавать отдельные тестовые базы.
  • Хранить учетные данные для БД в переменных окружения или отдельном конфигурационном файле, исключенном из контроля версий.
  • Использовать пул соединений для повышения производительности и предотвращения утечек соединений.

Интеграция с CI/CD

При автоматическом прогоне тестов на сервере Continuous Integration база данных должна быть подготовлена:

  • Локальный контейнер с БД через Docker.
  • Инициализация схем и тестовых данных перед запуском тестов.
  • Очистка данных после прогонов.

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


Подключение базы данных к тестам Protractor расширяет возможности проверки функциональности, связывая интерфейс с актуальными данными, и позволяет строить комплексные, надежные сценарии end-to-end тестирования.