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 };
После создания модуля подключения можно использовать его в тестах. Пример для 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();
});
});
Для поддержания чистоты тестов и предотвращения влияния данных между тестами рекомендуется:
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']);
});
Так как 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());
Это позволяет проверять корректность отображения данных в интерфейсе на основе актуального состояния БД.
При автоматическом прогоне тестов на сервере Continuous Integration база данных должна быть подготовлена:
Это позволяет запускать тесты Protractor в изолированной среде, полностью повторяемо, и получать надежные результаты.
Подключение базы данных к тестам Protractor расширяет возможности проверки функциональности, связывая интерфейс с актуальными данными, и позволяет строить комплексные, надежные сценарии end-to-end тестирования.