Data-driven тестирование представляет собой подход, при котором тесты автоматически запускаются с различными наборами входных данных. Это позволяет тестировать одинаковые сценарии с разными параметрами, улучшая покрытие тестами и обеспечивая более эффективное использование ресурсов. В контексте автоматизации тестирования веб-приложений с использованием Playwright этот подход особенно полезен для тестирования форм, API-интерфейсов и других компонентов, которые взаимодействуют с переменными данными.
В Playwright можно реализовать data-driven тестирование с использованием различных методов предоставления данных в тесты. Рассмотрим несколько способов интеграции данных в тестовые сценарии.
Для начала рассмотрим способ использования CSV-файлов как источников
данных. Playwright поддерживает работу с Node.js модулями, поэтому для
чтения данных из CSV можно использовать популярные библиотеки, такие как
csv-parser или papaparse.
Пример:
const { test, expect } = require('@playwright/test');
const fs = require('fs');
const csv = require('csv-parser');
async function readCSV(filePath) {
return new Promise((resolve, reject) => {
const data = [];
fs.createReadStream(filePath)
.pipe(csv())
.on('data', (row) => data.push(row))
.on('end', () => resolve(data))
.on('error', reject);
});
}
test('Проверка формы регистрации с данными из CSV', async ({ page }) => {
const testData = await readCSV('data/registration.csv');
for (const data of testData) {
await page.goto('https://example.com/register');
await page.fill('#username', data.username);
await page.fill('#email', data.email);
await page.fill('#password', data.password);
await page.click('button[type="submit"]');
// Проверка успешной регистрации
await expect(page.locator('.success')).toBeVisible();
}
});
Здесь используется файл registration.csv, который
содержит различные данные для тестирования формы регистрации. Внутри
теста данные считываются и используются для различных итераций.
Другим вариантом является использование JSON-файлов. В JSON можно хранить более сложные данные, включая вложенные объекты и массивы. Это особенно удобно для более комплексных тестов, где данные могут иметь разнообразную структуру.
Пример:
const { test, expect } = require('@playwright/test');
const fs = require('fs');
async function readJSON(filePath) {
const data = await fs.promises.readFile(filePath, 'utf8');
return JSON.parse(data);
}
test('Проверка формы с данными из JSON', async ({ page }) => {
const testData = await readJSON('data/formData.json');
for (const data of testData) {
await page.goto('https://example.com/form');
await page.fill('#firstName', data.firstName);
await page.fill('#lastName', data.lastName);
await page.fill('#email', data.email);
await page.click('button[type="submit"]');
await expect(page.locator('.confirmation')).toHaveText('Данные отправлены успешно');
}
});
В этом примере данные для тестирования берутся из JSON-файла,
содержащего массив объектов с полями firstName,
lastName и email.
Для работы с данными, хранящимися в базе данных, можно использовать
Node.js драйверы для подключения к различным СУБД. Например, для работы
с PostgreSQL можно использовать библиотеку pg.
Пример:
const { test, expect } = require('@playwright/test');
const { Client } = require('pg');
async function fetchTestDataFromDB() {
const client = new Client({
user: 'testuser',
host: 'localhost',
database: 'testdb',
password: 'password',
port: 5432,
});
await client.connect();
const res = await client.query('SELECT * FROM users WHERE active = true');
await client.end();
return res.rows;
}
test('Проверка данных из базы', async ({ page }) => {
const testData = await fetchTestDataFromDB();
for (const data of testData) {
await page.goto('https://example.com/profile');
await page.fill('#username', data.username);
await page.fill('#email', data.email);
await page.click('button[type="submit"]');
await expect(page.locator('.user-profile')).toHaveText(data.username);
}
});
В этом примере данные для теста извлекаются напрямую из базы данных, что позволяет проверять функциональность на реальных данных.
Для повышения гибкости и улучшения управления тестами можно
использовать фреймворки, такие как Jest или
Mocha в связке с Playwright. Они предоставляют удобные
способы работы с тестовыми данными, а также интеграцию с различными
источниками данных.
Пример с использованием jest:
const { test, expect } = require('@playwright/test');
const fs = require('fs');
const testData = JSON.parse(fs.readFileSync('data/testData.json', 'utf8'));
test.each(testData)('Проверка регистрации с данными %p', async (data) => {
const page = await browser.newPage();
await page.goto('https://example.com/register');
await page.fill('#username', data.username);
await page.fill('#email', data.email);
await page.fill('#password', data.password);
await page.click('button[type="submit"]');
await expect(page.locator('.confirmation')).toHaveText('Регистрация прошла успешно');
await page.close();
});
Здесь используется метод test.each, предоставляемый
Jest, для запуска одного и того же теста с разными наборами данных.
Планирование структуры данных: Перед началом тестирования важно продумать структуру данных. Это поможет избежать сложностей при масштабировании тестов. Данные должны быть организованы так, чтобы их было легко изменять и добавлять новые элементы.
Проверка на разных уровнях: Data-driven тестирование позволяет тестировать не только пользовательский интерфейс, но и бизнес-логику. Важно убедиться, что тесты охватывают как позитивные, так и негативные сценарии.
Логирование и отчеты: Важно поддерживать хороший механизм логирования, чтобы отслеживать, какие данные использовались, а также получать информацию о том, какие конкретно данные привели к сбоям.
Использование внешних источников данных: Для реальных проектов, где наборы данных могут быть обширными и изменяться, можно интегрировать тестирование с внешними источниками данных, такими как REST API, базы данных или даже микросервисы.
Параллельное выполнение тестов: В случае, если набор данных очень большой, полезно будет настроить параллельное выполнение тестов. Это может значительно ускорить тестирование, особенно при использовании CI/CD.
Использование Data-driven подхода с Playwright в сочетании с правильной организацией данных позволяет значительно повысить эффективность тестирования, снизить дублирование кода и улучшить качество тестируемых приложений.