При автоматизации тестирования веб-приложений часто возникает необходимость работы с внешними данными. CSV (Comma-Separated Values) — один из самых простых и распространённых форматов для хранения тестовых данных. Protractor не имеет встроенных средств для работы с CSV, поэтому требуется использование сторонних библиотек и реализация вспомогательных функций для их обработки.
Для работы с CSV в Node.js используют библиотеки
csv-parser, fast-csv или
papaparse. Наиболее удобным и популярным вариантом является
csv-parser благодаря простоте синтаксиса и потоковой
обработке больших файлов.
Пример чтения CSV файла:
const fs = require('fs');
const csv = require('csv-parser');
function readCSV(filePath) {
return new Promise((resolve, reject) => {
const results = [];
fs.createReadStream(filePath)
.pipe(csv())
.on('data', (data) => results.push(data))
.on('end', () => resolve(results))
.on('error', (err) => reject(err));
});
}
// Использование
readCSV('test-data.csv').then(data => {
console.log(data);
});
Ключевые моменты:
fs.createReadStream обеспечивает потоковое чтение
больших файлов без нагрузки на память.results соответствует одной
строке CSV с полями, сопоставленными по заголовкам.Protractor поддерживает асинхронные тесты через
async/await. Для передачи данных из CSV в тестовые сценарии
рекомендуется использовать фабрики данных или отдельные вспомогательные
функции.
Пример использования CSV данных в it блоке:
const { browser, element, by } = require('protractor');
describe('Тестирование формы с данными из CSV', () => {
let testData;
beforeAll(async () => {
testData = await readCSV('form-data.csv');
});
testData.forEach((row) => {
it(`Заполняет форму для пользователя ${row.name}`, async () => {
await browser.get('https://example.com/form');
await element(by.name('username')).sendKeys(row.name);
await element(by.name('email')).sendKeys(row.email);
await element(by.name('password')).sendKeys(row.password);
await element(by.css('button[type="submit"]')).click();
const successMessage = await element(by.css('.success')).getText();
expect(successMessage).toContain('Успешно');
});
});
});
Особенности:
forEach.async/await гарантирует правильную
последовательность действий в браузере.Иногда CSV содержит поля с запятыми, переносами строк или кавычками. Для корректного разбора используют опции библиотеки:
fs.createReadStream('complex-data.csv')
.pipe(csv({ separator: ';', quote: '"' }))
.on('data', (data) => results.push(data))
.on('end', () => console.log(results));
Параметры:
separator — задает разделитель (по умолчанию
,).quote — символ, используемый для заключения текста с
запятыми или переносами строк.Для больших файлов рекомендуется реализовать фильтрацию или частичную загрузку данных, чтобы избежать переполнения памяти.
Использование CSV позволяет создавать динамические тесты:
testData.forEach((row) => {
it(`Проверка авторизации для ${row.username}`, async () => {
await login(row.username, row.password);
const loggedIn = await isLoggedIn();
expect(loggedIn).toBe(true);
});
});
Здесь функция login инкапсулирует действия по заполнению
формы авторизации, а данные из CSV управляют параметрами каждого теста.
Такой подход упрощает поддержку тестов и добавление новых сценариев без
изменения кода.
Для анализа результатов тестов иногда требуется записывать данные
обратно в CSV. В Node.js используют fast-csv для генерации
файлов:
const fs = require('fs');
const fastcsv = require('fast-csv');
const results = [
{ username: 'user1', status: 'passed' },
{ username: 'user2', status: 'failed' },
];
const ws = fs.createWriteStream('results.csv');
fastcsv
.write(results, { headers: true })
.pipe(ws);
Принципы:
headers: true добавляет заголовки в файл.Использование CSV для тестирования в Protractor обеспечивает гибкость, масштабируемость и позволяет отделить тестовые данные от кода тестов. Комбинация чтения, фильтрации и динамической генерации тестов делает процесс автоматизации более управляемым и воспроизводимым.