Mocha интеграция

WebdriverIO предоставляет гибкую интеграцию с Mocha — популярным JavaScript фреймворком для тестирования, который поддерживает асинхронные операции и богатую систему хуков. Основным инструментом конфигурации является файл wdio.conf.js. В нём можно указать Mocha как тестовый фреймворк, настроить интерфейс (bdd или tdd), timeout для тестов и количество повторений.

Пример минимальной конфигурации для Mocha:

exports.config = {
    runner: 'local',
    framework: 'mocha',
    mochaOpts: {
        ui: 'bdd',
        timeout: 60000
    },
    specs: [
        './test/specs/**/*.js'
    ]
};

Здесь:

  • framework: 'mocha' указывает WebdriverIO использовать Mocha для выполнения тестов.
  • mochaOpts.ui выбирает стиль написания тестов (bdddescribe/it, tddsuite/test).
  • mochaOpts.timeout задаёт максимальное время ожидания выполнения теста в миллисекундах.

Структура Mocha-тестов

Mocha поддерживает следующие ключевые блоки:

  • describe — логическая группировка тестов.
  • it — отдельный тестовый случай.
  • before, after, beforeEach, afterEach — хуки для подготовки и очистки окружения.

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

describe('Авторизация пользователя', () => {

    before(async () => {
        await browser.url('https://example.com/login');
    });

    beforeEach(async () => {
        await browser.refresh();
    });

    it('должна отображать форму входа', async () => {
        const loginForm = await $('#loginForm');
        await expect(loginForm).toBeDisplayed();
    });

    it('должна позволять авторизоваться с корректными данными', async () => {
        await $('#username').setValue('user');
        await $('#password').setValue('password');
        await $('#loginButton').click();
        const dashboard = await $('#dashboard');
        await expect(dashboard).toBeDisplayed();
    });

    afterEach(async () => {
        await browser.deleteCookies();
    });

    after(async () => {
        await browser.closeWindow();
    });
});

Асинхронность и async/await

WebdriverIO полностью поддерживает асинхронные операции, поэтому все действия с браузером должны выполняться через await. Это обеспечивает последовательное выполнение команд и предотвращает гонки между действиями.

Использование промисов напрямую с Mocha допустимо, но async/await делает код более читаемым и предсказуемым.

Настройка репортеров и логирования

Mocha интеграция с WebdriverIO позволяет подключать различные репортеры, чтобы улучшить читаемость результатов тестирования:

reporters: ['spec', ['allure', { outputDir: 'allure-results' }]],
  • spec выводит результаты тестов в консоль.
  • allure позволяет создавать визуальные отчёты с вложениями, скриншотами и логами.

Параметры параллельного запуска

WebdriverIO поддерживает параллельное выполнение тестов через maxInstances в конфигурации. Это особенно полезно для ускорения тестов при большом количестве сценариев:

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

При использовании Mocha важно учитывать, что хуки выполняются для каждого экземпляра отдельно. Асинхронные операции в хуках не должны блокировать другие тесты.

Применение с before и after в глобальном масштабе

Mocha позволяет определять глобальные хуки, например, для подключения к API или подготовки базы данных до запуска всех тестов:

before(async () => {
    await api.login('admin', 'adminpass');
});

after(async () => {
    await api.logout();
});

Глобальные хуки применяются один раз для всего тестового набора, в отличие от хуков внутри describe, которые выполняются локально.

Использование Mocha фич для сложных сценариев

  • Тестовые сьюты с вложенными describe: позволяют структурировать тесты по функционалу.
  • Теги и grep: фильтруют выполнение тестов, например --grep "login" запустит только тесты с “login” в имени.
  • Ретраи (повтор тестов): Mocha в связке с WebdriverIO поддерживает повтор теста при падении через retries:
mochaOpts: {
    ui: 'bdd',
    timeout: 60000,
    retries: 2
}

Взаимодействие с WebdriverIO командами

Внутри Mocha-тестов доступны все WebdriverIO команды для элементов и браузера:

  • browser.url(), browser.refresh(), browser.deleteCookies().
  • $('#selector').click(), $('#selector').setValue(), $('#selector').getText().
  • Ожидания через waitForDisplayed(), waitForClickable(), а также expect() с WebdriverIO matchers.

Правильное сочетание Mocha хуков и команд WebdriverIO позволяет писать надежные и поддерживаемые тесты для сложных веб-приложений, минимизируя дублирование кода и обеспечивая предсказуемое поведение тестовой среды.

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

Mocha поддерживает динамическую генерацию тестов с помощью массивов и циклов:

const credentials = [
    { user: 'user1', pass: 'pass1' },
    { user: 'user2', pass: 'pass2' }
];

credentials.forEach(({ user, pass }) => {
    it(`авторизация для ${user}`, async () => {
        await $('#username').setValue(user);
        await $('#password').setValue(pass);
        await $('#loginButton').click();
        await expect($('#dashboard')).toBeDisplayed();
    });
});

Это особенно полезно для тестирования множества комбинаций данных без дублирования кода.

Обработка ошибок и скриншоты

Mocha позволяет интегрировать автоматическое снятие скриншотов при падении теста через хуки:

afterEach(async function() {
    if (this.currentTest.state === 'failed') {
        await browser.saveScreenshot(`./screenshots/${this.currentTest.title}.png`);
    }
});

Такой подход значительно облегчает анализ причин падений тестов и ускоряет отладку.

Использование Mocha в CI/CD

Встроенная интеграция с CI/CD возможна через WebdriverIO CLI. Параметры Mocha, репортеры и хуки полностью поддерживаются при запуске через Jenkins, GitHub Actions, GitLab CI. Это позволяет автоматически запускать тесты, собирать отчёты и сохранять артефакты (скриншоты, логи) без изменения структуры тестов.