CSV файлы для тестирования

При автоматизации тестирования веб-приложений часто возникает необходимость работы с внешними данными. CSV (Comma-Separated Values) — один из самых простых и распространённых форматов для хранения тестовых данных. Protractor не имеет встроенных средств для работы с CSV, поэтому требуется использование сторонних библиотек и реализация вспомогательных функций для их обработки.

Чтение 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.

Интеграция 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('Успешно');
        });
    });
});

Особенности:

  • Данные из CSV преобразуются в массив объектов, что облегчает перебор в forEach.
  • Каждая строка CSV становится отдельным тестом, что повышает читаемость отчетов.
  • Использование async/await гарантирует правильную последовательность действий в браузере.

Обработка сложных CSV файлов

Иногда 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

Для анализа результатов тестов иногда требуется записывать данные обратно в 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 обеспечивает гибкость, масштабируемость и позволяет отделить тестовые данные от кода тестов. Комбинация чтения, фильтрации и динамической генерации тестов делает процесс автоматизации более управляемым и воспроизводимым.