Параллельное выполнение тестов

Параллельное выполнение тестов — один из ключевых способов ускорения автоматизированного тестирования веб-приложений. Protractor, как инструмент для end-to-end тестирования Angular и не-Angular приложений на базе Selenium WebDriver, предоставляет гибкие механизмы для запуска тестов параллельно, обеспечивая оптимизацию времени тестового прогона без потери стабильности.


Конфигурация параллельного запуска

Основной способ организации параллельного выполнения тестов в Protractor заключается в настройке конфигурационного файла protractor.conf.js. Для управления параллельностью используются следующие параметры:

1. multiCapabilities и capabilities

  • capabilities — описывает один набор параметров браузера для запуска тестов.
  • multiCapabilities — массив объектов, каждый из которых задаёт отдельный браузер или профиль, что позволяет запускать тесты одновременно в нескольких браузерах.

Пример:

exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['tests/*.spec.js'],
  multiCapabilities: [
    {
      browserName: 'chrome',
      shardTestFiles: true,
      maxInstances: 3
    },
    {
      browserName: 'firefox',
      shardTestFiles: true,
      maxInstances: 2
    }
  ]
};

Объяснение ключевых параметров:

  • shardTestFiles: true — разбивает тестовые файлы на отдельные части, которые могут выполняться параллельно.
  • maxInstances — максимальное количество одновременных экземпляров браузера для данного набора настроек.

Использование shardTestFiles особенно важно для больших тестовых наборов, где один файл может содержать десятки тестов. В этом случае Protractor автоматически распределяет тесты по доступным экземплярам браузера.


capabilities с shardTestFiles

Даже при использовании одного браузера возможно ускорить выполнение тестов за счет “шардинга”:

exports.config = {
  capabilities: {
    browserName: 'chrome',
    shardTestFiles: true,
    maxInstances: 5
  },
  specs: ['tests/*.spec.js']
};

Здесь все тестовые файлы будут делиться на потоки, каждый из которых запустится в отдельном экземпляре Chrome. Такой подход уменьшает время прогонки, особенно при больших тестовых наборах.


Применение onPrepare для подготовки параллельных тестов

onPrepare позволяет настраивать окружение перед запуском тестов. Для параллельного запуска полезно инициализировать глобальные объекты и избегать общих состояний между тестами.

Пример безопасной инициализации:

exports.config = {
  capabilities: {
    browserName: 'chrome',
    shardTestFiles: true,
    maxInstances: 3
  },
  onPrepare: async () => {
    global.login = async (username, password) => {
      await browser.get('/login');
      await element(by.id('username')).sendKeys(username);
      await element(by.id('password')).sendKeys(password);
      await element(by.id('submit')).click();
    };
  }
};

Каждый экземпляр браузера будет работать с собственной копией глобальных объектов, что предотвращает конфликты между параллельными тестами.


Ограничения и особенности параллельного выполнения

  • Состояние сервера: если приложение использует общую базу данных или сессии, параллельные тесты могут конфликтовать. Решение — изолированные тестовые данные или мокирование API.
  • Глобальные объекты: общий доступ к глобальным переменным и файлам может привести к непредсказуемым ошибкам.
  • Логирование: при параллельном запуске важно настраивать уникальные файлы логов для каждого экземпляра браузера, иначе записи будут смешиваться.

Пример конфигурации логирования:

const fs = require('fs');
const path = require('path');

exports.config = {
  onPrepare: () => {
    const instanceId = process.pid;
    const logDir = path.join(__dirname, 'logs');
    if (!fs.existsSync(logDir)) fs.mkdirSync(logDir);

    browser.logger = fs.createWriteStream(path.join(logDir, `log_${instanceId}.txt`), { flags: 'a' });
  }
};

Примеры практического применения

  1. Кросс-браузерное тестирование: с использованием multiCapabilities можно одновременно запускать тесты в Chrome, Firefox и Edge.
  2. Масштабирование тестов: увеличение maxInstances позволяет ускорить прогон больших наборов тестов без изменения логики тестов.
  3. CI/CD интеграция: параллельное выполнение особенно эффективно в Jenkins, GitLab CI, GitHub Actions, где можно распределять тесты между агентами и экономить время сборки.

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

  • Разделять тяжелые тесты на отдельные файлы — шардинг работает на уровне файлов, а не отдельных тестов.
  • Минимизировать зависимости между тестами — каждый тест должен быть самодостаточным, иначе параллельный запуск приведет к нестабильности.
  • Использовать стабильные локаторы — динамические элементы увеличивают вероятность ошибок в многопоточном исполнении.
  • Ограничивать maxInstances до разумного числа — слишком большое количество экземпляров браузера может перегрузить локальную машину или CI-агент.

Параллельное выполнение в Protractor — мощный инструмент для сокращения времени тестирования и повышения эффективности CI/CD, при условии правильной конфигурации и изоляции тестов.