Data-driven тестирование

Data-driven тестирование является одной из ключевых стратегий автоматизации тестирования, позволяющей запускать одни и те же сценарии с различными наборами данных. В Protractor, инструменте для тестирования Angular-приложений на JavaScript, эта методология реализуется с помощью интеграции с внешними источниками данных и возможностью динамической генерации тестов.


Основные концепции

Data-driven тестирование позволяет:

  • Уменьшить дублирование кода тестов.
  • Проверять функциональность приложения на множестве вариантов данных.
  • Быстро добавлять новые наборы данных без изменения структуры тестов.

Для реализации используется комбинация:

  • JavaScript/TypeScript для описания логики тестов.
  • JSON, CSV или Excel для хранения данных.
  • Фреймворков типа Jasmine или Mocha, поддерживающих параметризацию тестов.

Структура данных

Наиболее распространённый подход — использование JSON-файлов для хранения данных. Пример структуры:

[
  {
    "username": "user1",
    "password": "pass1",
    "expectedResult": true
  },
  {
    "username": "user2",
    "password": "wrongpass",
    "expectedResult": false
  }
]

Каждый объект в массиве соответствует одному набору входных данных и ожидаемому результату.


Импорт данных в тест

Для работы с JSON в Protractor достаточно стандартного require:

const testData = require('./data/loginData.json');

describe('Login functionality', () => {
  testData.forEach(data => {
    it(`should login with username: ${data.username}`, async () => {
      await browser.get('https://example.com/login');
      await element(by.id('username')).sendKeys(data.username);
      await element(by.id('password')).sendKeys(data.password);
      await element(by.id('loginButton')).click();

      const isLoggedIn = await element(by.id('logoutButton')).isPresent();
      expect(isLoggedIn).toBe(data.expectedResult);
    });
  });
});

Ключевые моменты:

  • Используется метод forEach для генерации отдельных it блоков под каждый набор данных.
  • Асинхронные операции обрабатываются через async/await, что упрощает синтаксис и повышает читаемость.
  • Проверка результата (expect) динамически зависит от данных.

Использование CSV и Excel

Для интеграции с CSV или Excel требуется сторонняя библиотека. Примеры:

  • papaparse для CSV.
  • xlsx для Excel.

Чтение данных CSV:

const fs = require('fs');
const Papa = require('papaparse');

const csvData = fs.readFileSync('./data/loginData.csv', 'utf8');
const testData = Papa.parse(csvData, { header: true }).data;

Далее testData используется так же, как JSON-массив.


Параметризация тестов через Jasmine

Jasmine поддерживает Array.forEach или it.each (с внешними библиотеками) для генерации параметризованных тестов. В Protractor это позволяет:

  • Легко масштабировать количество тестовых сценариев.
  • Разделять данные и логику теста, повышая читаемость.
  • Автоматически создавать отдельные отчёты для каждого набора данных.

Динамическое формирование тестов

Иногда данные формируются в процессе выполнения тестов или берутся из внешнего API. Пример:

const axios = require('axios');

describe('API-driven login tests', () => {
  let apiData;

  beforeAll(async () => {
    const response = await axios.get('https://api.example.com/testUsers');
    apiData = response.data;
  });

  apiData.forEach(user => {
    it(`should login user ${user.username}`, async () => {
      await browser.get('https://example.com/login');
      await element(by.id('username')).sendKeys(user.username);
      await element(by.id('password')).sendKeys(user.password);
      await element(by.id('loginButton')).click();

      const isLoggedIn = await element(by.id('logoutButton')).isPresent();
      expect(isLoggedIn).toBe(user.expectedResult);
    });
  });
});

Обработка больших объёмов данных

При большом количестве наборов данных необходимо:

  • Использовать внешние файлы вместо хардкода данных.
  • Группировать тесты по функциональным блокам.
  • Применять fit или fdescribe только для отладки отдельных случаев.
  • Следить за производительностью: большое число тестов может существенно замедлять прогон.

Рекомендации по организации

  1. Разделять данные и тесты: папка data для JSON/CSV/Excel, папка specs для тестов.
  2. Использовать универсальные функции для повторяющихся действий (например, логин).
  3. Применять отчётность, чтобы видеть успешные и упавшие наборы данных.
  4. Автоматизировать генерацию тестов через скрипты, если данные поступают регулярно.

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