Внешние источники данных

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


Типы внешних источников данных

1. JSON-файлы JSON является одним из самых удобных форматов для хранения тестовых данных. Он легко читается и парсится в JavaScript.

Пример структуры JSON для тестов:

[
  {
    "username": "user1",
    "password": "pass1"
  },
  {
    "username": "user2",
    "password": "pass2"
  }
]

Загрузка данных в Protractor выполняется с использованием стандартного модуля fs или через require:

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

describe('Тестирование логина', () => {
  testData.forEach(user => {
    it(`должен успешно авторизоваться для пользователя ${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();
      expect(await element(by.id('welcomeMessage')).isDisplayed()).toBe(true);
    });
  });
});

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

  • JSON поддерживает вложенные структуры, что позволяет моделировать сложные наборы данных.
  • Данные можно использовать для data-driven тестирования, запуска одного сценария с множеством наборов входных данных.

2. CSV-файлы Иногда удобнее хранить данные в табличном виде. CSV хорошо подходит для интеграции с Excel или внешними системами.

Пример CSV:

username,password
user1,pass1
user2,pass2

Загрузка и обработка CSV в Protractor:

const fs = require('fs');
const parse = require('csv-parse/lib/sync');

const csvData = fs.readFileSync('./data/users.csv');
const records = parse(csvData, { columns: true });

records.forEach(user => {
  it(`логин для ${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();
    expect(await element(by.id('welcomeMessage')).isDisplayed()).toBe(true);
  });
});

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

  • CSV удобен для больших таблиц и экспорта/импорта данных.
  • Требуется библиотека для парсинга (например, csv-parse).

3. Работа с Excel Excel часто используется для хранения тестовых сценариев и отчетности. Для работы с Excel можно использовать пакет xlsx.

Пример чтения данных из Excel:

const XLSX = require('xlsx');
const workbook = XLSX.readFile('./data/users.xlsx');
const sheetName = workbook.SheetNames[0];
const sheet = workbook.Sheets[sheetName];
const data = XLSX.utils.sheet_to_json(sheet);

data.forEach(user => {
  it(`логин для ${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();
    expect(await element(by.id('welcomeMessage')).isDisplayed()).toBe(true);
  });
});

Преимущества:

  • Позволяет хранить данные и метаданные тестов в одном файле.
  • Поддержка различных форматов Excel: .xls, .xlsx.

4. REST API и базы данных Внешние источники могут быть не только файловыми. Часто тесты получают данные напрямую из API или баз данных.

Пример получения данных через REST API с использованием axios:

const axios = require('axios');

describe('Тестирование через API', () => {
  let users;

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

  users.forEach(user => {
    it(`логин для ${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();
      expect(await element(by.id('welcomeMessage')).isDisplayed()).toBe(true);
    });
  });
});

Особенности работы с API:

  • Возможность тестирования актуальных данных, которые используются в реальной системе.
  • Требуется асинхронная обработка данных через async/await.

Пример работы с базой данных MySQL:

const mysql = require('mysql2/promise');

describe('Тестирование с данными из базы', () => {
  let connection;
  let users;

  beforeAll(async () => {
    connection = await mysql.createConnection({host:'localhost', user:'root', database:'testdb'});
    const [rows] = await connection.execute('SELECT username, password FROM users');
    users = rows;
  });

  afterAll(async () => {
    await connection.end();
  });

  users.forEach(user => {
    it(`логин для ${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();
      expect(await element(by.id('welcomeMessage')).isDisplayed()).toBe(true);
    });
  });
});

Преимущества подключения к базе:

  • Использование настоящих данных приложения.
  • Возможность тестирования сложных сценариев с зависимостями данных.

Рекомендации по работе с внешними источниками

  • Для больших наборов данных предпочтительно использовать JSON или базы данных, так как они более структурированы.
  • Для табличных данных и интеграции с офисными системами удобен CSV и Excel.
  • Всегда следует обрабатывать данные асинхронно, чтобы избежать ошибок синхронизации с браузером.
  • Разделение данных и тестов повышает читаемость и облегчает поддержку тестового кода.

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