Конфигурация для CI/CD

WebdriverIO — мощный инструмент для автоматизации тестирования веб-приложений, который легко интегрируется в процессы CI/CD. Правильная конфигурация позволяет запускать тесты автоматически при каждом изменении кода, обеспечивая стабильность и надежность приложения.


Основные принципы конфигурации

1. Разделение окружений CI/CD-процессы требуют различной конфигурации для локальной разработки и серверного запуска. Для этого используют отдельные файлы конфигурации или профили:

// wdio.conf.js
exports.config = {
    runner: 'local',
    specs: ['./tests/**/*.spec.js'],
    maxInstances: 5,
    capabilities: [
        {
            browserName: 'chrome',
        },
    ],
    logLevel: 'info',
    bail: 0,
    baseUrl: 'http://localhost',
    waitforTimeout: 10000,
    connectionRetryTimeout: 120000,
    connectionRetryCount: 3,
};

Для CI можно создать wdio.ci.conf.js, где изменяются maxInstances, logLevel и браузер (например, запуск в headless-режиме).


Headless-браузеры

На CI/CD-серверах отсутствует графический интерфейс, поэтому тесты запускаются в headless-браузерах:

capabilities: [
    {
        browserName: 'chrome',
        'goog:chromeOptions': {
            args: ['--headless', '--disable-gpu', '--window-size=1920,1080'],
        },
    },
]

Использование headless режима позволяет экономить ресурсы сервера и ускоряет прогон тестов.


Интеграция с GitHub Actions

GitHub Actions часто используется для автоматического запуска тестов при push или pull request. Пример workflow:

name: WebdriverIO Tests

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [20.x]

    steps:
      - uses: actions/checkout@v3
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm install
      - run: npx wdio wdio.ci.conf.js

Особенности CI-окружения:

  • Установка зависимостей перед запуском тестов.
  • Использование отдельного конфигурационного файла.
  • Запуск в headless-режиме для экономии ресурсов.

Параллельный запуск тестов

CI/CD-серверы позволяют запускать тесты параллельно, что сокращает общее время прогона:

maxInstances: 10,
capabilities: [
    {
        browserName: 'chrome',
        maxInstances: 5,
    },
]

Правила организации:

  • Разбивать тесты на отдельные файлы или папки.
  • Ограничивать количество параллельных инстансов под нагрузку сервера.
  • Использовать bail для прерывания тестов при критических ошибках.

Настройка отчетности

Для CI важно получать отчёты о тестировании в удобном формате. WebdriverIO поддерживает несколько репортеров:

reporters: [
    'spec',
    ['junit', {
        outputDir: './reports/junit-results',
        outputFileFormat: function(options) { 
            return `results-${options.cid}.xml`;
        }
    }],
    ['allure', {
        outputDir: './reports/allure-results',
        disableWebdriverStepsReporting: true,
    }]
],

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

  • JUnit: интеграция с Jenkins, GitHub Actions, GitLab.
  • Allure: визуальные отчёты с подробными шагами и скриншотами.
  • Для CI важно хранить отчёты как артефакты сборки.

Скриншоты и видео

В CI полезно сохранять артефакты для анализа ошибок:

afterTest: async function(test, context, { error, result, duration, passed, retries }) {
    if (!passed) {
        await browser.saveScreenshot(`./reports/screenshots/${test.title}.png`);
    }
},

Для видео-записи можно использовать интеграцию с сервисами типа Selenoid или BrowserStack, чтобы воспроизводить полный прогон тестов.


Управление переменными окружения

CI/CD-серверы используют переменные окружения для безопасного хранения токенов, URL и настроек:

baseUrl: process.env.BASE_URL || 'http://localhost',
user: process.env.SAUCE_USERNAME,
key: process.env.SAUCE_ACCESS_KEY,

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

  • Легкая смена окружений.
  • Отсутствие секретных данных в репозитории.
  • Универсальность конфигурации.

Оптимизация времени прогона

  • Использовать waitforTimeout с разумными значениями, чтобы избежать зависаний.
  • Делить тесты на критические и второстепенные, чтобы запускать только необходимые.
  • Параллелить тесты по файлам, а не по кейсам внутри одного файла.
  • Кешировать зависимости Node.js в CI/CD (например, ~/.npm), чтобы ускорить установку пакетов.

Эти подходы формируют основу для стабильной работы WebdriverIO в CI/CD и обеспечивают масштабируемость автоматизации. Такой подход позволяет получать быстрые, детализированные и надежные результаты тестирования без вмешательства человека.