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

В тестировании веб-приложений с использованием Protractor данные часто играют ключевую роль. Особенно важны внешние источники данных, которые позволяют создавать гибкие, масштабируемые и легко поддерживаемые тесты. Одним из самых удобных форматов для хранения и передачи тестовых данных является JSON (JavaScript Object Notation).

Структура и преимущества JSON

JSON представляет собой легковесный формат обмена данными, основанный на парах «ключ–значение». Его основными преимуществами являются:

  • Простота чтения и редактирования.
  • Поддержка вложенных структур и массивов.
  • Легкая интеграция с JavaScript благодаря естественному соответствию объектам.
  • Возможность использования в различных средах: Node.js, браузер, CI/CD пайплайны.

Пример простого JSON-файла для тестирования:

{
  "users": [
    {
      "username": "testuser1",
      "password": "Password123"
    },
    {
      "username": "testuser2",
      "password": "SecurePass456"
    }
  ],
  "urls": {
    "loginPage": "https://example.com/login",
    "dashboard": "https://example.com/dashboard"
  }
}

Загрузка JSON-файлов в Protractor

В Protractor JSON-файлы подключаются через стандартный модуль require. Это позволяет использовать данные напрямую в тестах.

Пример использования:

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

describe('Login tests', function() {
  testData.users.forEach(user => {
    it(`should login with user ${user.username}`, async function() {
      await browser.get(testData.urls.loginPage);
      await element(by.id('username')).sendKeys(user.username);
      await element(by.id('password')).sendKeys(user.password);
      await element(by.id('loginButton')).click();
      expect(await browser.getCurrentUrl()).toBe(testData.urls.dashboard);
    });
  });
});

Динамическое использование данных

JSON позволяет создавать параметризованные тесты, когда один и тот же сценарий выполняется с различными наборами данных. Это особенно полезно для проверки:

  • Разных пользовательских ролей.
  • Вариантов входных данных.
  • Настроек приложения в различных окружениях.

Пример с проверкой нескольких сценариев:

{
  "loginScenarios": [
    {
      "user": "admin",
      "password": "admin123",
      "expectedPage": "dashboard"
    },
    {
      "user": "guest",
      "password": "guest123",
      "expectedPage": "welcome"
    }
  ]
}
const scenarios = require('./data/loginScenarios.json');

describe('Login scenarios', function() {
  scenarios.loginScenarios.forEach(scenario => {
    it(`should login as ${scenario.user}`, async function() {
      await browser.get('https://example.com/login');
      await element(by.id('username')).sendKeys(scenario.user);
      await element(by.id('password')).sendKeys(scenario.password);
      await element(by.id('loginButton')).click();
      const currentUrl = await browser.getCurrentUrl();
      expect(currentUrl).toContain(scenario.expectedPage);
    });
  });
});

Организация JSON-файлов

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

  • users.json – данные для авторизации и проверки ролей.
  • products.json – тестовые данные для проверки каталога товаров.
  • config.json – глобальные настройки URL, таймаутов и окружений.
  • scenarios.json – описания сценариев с множественными шагами и условиями.

Такое разделение упрощает поддержку тестов и делает их более читаемыми.

Интеграция с Page Object

В Page Object JSON-файлы позволяют отделить данные от логики взаимодействия с элементами страницы:

// pageObjects/loginPage.js
class LoginPage {
  constructor() {
    this.usernameField = element(by.id('username'));
    this.passwordField = element(by.id('password'));
    this.loginButton = element(by.id('loginButton'));
  }

  async login(username, password) {
    await this.usernameField.sendKeys(username);
    await this.passwordField.sendKeys(password);
    await this.loginButton.click();
  }
}

module.exports = new LoginPage();

Использование JSON вместе с Page Object:

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

describe('Login tests with Page Object', function() {
  testData.users.forEach(user => {
    it(`login as ${user.username}`, async function() {
      await browser.get(testData.urls.loginPage);
      await loginPage.login(user.username, user.password);
      expect(await browser.getCurrentUrl()).toBe(testData.urls.dashboard);
    });
  });
});

Работа с асинхронными JSON-файлами

Если JSON-файл находится на сервере или требуется загрузка динамических данных, можно использовать HTTP-запросы через axios или встроенный fetch (Node.js >=18):

const axios = require('axios');

describe('Dynamic data tests', function() {
  let testData;

  beforeAll(async function() {
    const response = await axios.get('https://example.com/testData.json');
    testData = response.data;
  });

  it('should login with dynamic data', async function() {
    await browser.get(testData.urls.loginPage);
    await element(by.id('username')).sendKeys(testData.users[0].username);
    await element(by.id('password')).sendKeys(testData.users[0].password);
    await element(by.id('loginButton')).click();
    expect(await browser.getCurrentUrl()).toBe(testData.urls.dashboard);
  });
});

Лучшие практики

  • Все тестовые данные хранить отдельно от тестового кода.
  • Использовать понятные ключи и структуру JSON.
  • Разделять данные по типам (пользователи, сценарии, конфигурации).
  • Параметризовать тесты для многократного использования одного сценария.
  • Обрабатывать возможные ошибки при загрузке или парсинге JSON.

JSON-файлы в Protractor обеспечивают гибкость, масштабируемость и удобство управления тестовыми данными, что делает их незаменимым инструментом в современном автоматизированном тестировании.