Пропуск и изоляция тестов

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


Пропуск тестов с помощью skip

WebdriverIO поддерживает несколько способов пропуска тестов. Основные механизмы:

  1. Метод it.skip Используется для временного исключения конкретного теста из запуска.

    it.skip('не выполняемый тест', async () => {
        await browser.url('https://example.com');
        const title = await browser.getTitle();
        expect(title).toBe('Example Domain');
    });

    Тест будет проигнорирован, и в отчёте отобразится как пропущенный.

  2. Метод describe.skip Позволяет пропускать целый блок тестов.

    describe.skip('Блок тестов для временной приостановки', () => {
        it('тест 1', async () => { /* код */ });
        it('тест 2', async () => { /* код */ });
    });

    Все тесты внутри блока не выполняются, что удобно при работе с недоступными функциями или экспериментальными сценариями.

  3. Условный пропуск с this.skip() Внутри теста можно динамически пропустить его выполнение на основе условий.

    it('пропуск при определённом условии', async function () {
        const env = process.env.TEST_ENV;
        if (env !== 'staging') {
            this.skip();
        }
        await browser.url('https://example.com');
    });

    Такой подход позволяет интегрировать пропуск в зависимости от окружения, конфигурации или состояния приложения.


Игнорирование тестов через теги и фильтры

WebdriverIO поддерживает фильтрацию тестов по тегам, что упрощает массовое исключение отдельных категорий. В конфигурации можно указать, какие тесты запускать или пропускать:

// wdio.conf.js
mochaOpts: {
    grep: '@critical', // выполняются только тесты с тегом @critical
    invert: true       // инверсия фильтрации, пропуск тестов с тегом
}

Использование тегов помогает управлять тестовыми наборами без модификации кода.


Изоляция тестов

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

  1. Перезапуск браузера для каждого теста Конфигурация WebdriverIO позволяет сбрасывать состояние браузера перед каждым тестом:

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

    Это гарантирует отсутствие остаточных данных, cookies или локального хранилища от предыдущих сценариев.

  2. Использование beforeEach и afterEach для подготовки и очистки Эти хуки помогают настроить стартовое состояние и очищать тестовые данные:

    beforeEach(async () => {
        await browser.url('https://example.com/login');
    });
    
    afterEach(async () => {
        await browser.execute(() => localStorage.clear());
        await browser.deleteCookies();
    });

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

  3. Локальные данные и уникальные идентификаторы Для тестов с созданием ресурсов важно использовать уникальные значения, чтобы каждый тест был независимым:

    const userEmail = `user_${Date.now()}@example.com`;
    await browser.$('#email').setValue(userEmail);

Управление изоляцией через конфигурацию

WebdriverIO позволяет настраивать параллельное выполнение и изоляцию на уровне конфигурации:

  • maxInstances: ограничивает количество параллельных сессий, предотвращая конфликты между тестами.
  • capabilities: каждая capability создаёт отдельную сессию браузера, что гарантирует независимость.

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

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

Практические рекомендации

  • Пропускать тесты стоит только при временной невозможности выполнения, чтобы не накапливать “мертвые” тесты в репозитории.
  • Изоляция критична для параллельного запуска тестов, чтобы один тест не влиял на другой через cookies, localStorage или состояние сервера.
  • Для динамического пропуска использовать this.skip() вместо постоянного it.skip, если условие зависит от окружения или внешних данных.
  • Использовать уникальные данные для каждой сессии и очищать состояние после теста — это стандартная практика для надёжной автоматизации.

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