Прерывание тестов при определённых условиях

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


Использование browser.pause() и условных операторов

Метод browser.pause(ms) останавливает выполнение на заданное количество миллисекунд. В сочетании с условными проверками это позволяет приостанавливать тест в нужный момент для дополнительной проверки состояния:

it('должен остановиться при определённом условии', async () => {
    await browser.url('https://example.com');
    const title = await browser.getTitle();

    if (title !== 'Ожидаемый заголовок') {
        console.log('Условие не выполнено, тест остановлен');
        await browser.pause(5000); // пауза перед завершением
        return; // прерывание выполнения теста
    }

    await $('#element').click();
});

Ключевой момент — использование return для выхода из функции теста. Это простой способ остановить выполнение текущего it блока, если условие не выполнено.


Прерывание теста с помощью throw

Для более строгого контроля можно использовать выброс исключения, что приведёт к неуспешному завершению теста. Это удобно для условий, когда продолжение теста не имеет смысла:

it('должен прекратить выполнение при ошибочном состоянии', async () => {
    const isElementDisplayed = await $('#criticalElement').isDisplayed();

    if (!isElementDisplayed) {
        throw new Error('Критический элемент не найден, тест остановлен');
    }

    await $('#criticalElement').click();
});

В отличие от простого return, использование throw сигнализирует системе тестирования о фейле, что особенно полезно при интеграции с CI/CD.


Использование browser.call() для асинхронных проверок

Иногда необходимо проверить условие с внешним API или базой данных. WebdriverIO позволяет выполнять произвольные асинхронные операции через browser.call:

it('останавливается при внешней проверке', async () => {
    const shouldSkip = await browser.call(async () => {
        const response = await fetch('https://api.example.com/check');
        const data = await response.json();
        return data.skipTest;
    });

    if (shouldSkip) {
        console.log('Тест пропущен по внешнему условию');
        return;
    }

    await $('#button').click();
});

browser.call делает возможным синхронное использование асинхронного кода внутри теста, сохраняя читаемость и последовательность выполнения.


Прерывание всех тестов через process.exit()

В редких случаях требуется остановить всю тестовую сессию, например, при критической ошибке окружения. Для этого можно использовать Node.js метод process.exit(code):

before(async () => {
    const envReady = await checkEnvironment();
    if (!envReady) {
        console.error('Окружение не готово, прерывание всех тестов');
        process.exit(1);
    }
});

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


Использование условных skip и only

WebdriverIO поддерживает функции Mocha/Jasmine для условного пропуска тестов:

it.skip('тест, который пропускается при условии', async () => {
    const condition = true;
    if (condition) return;
    await $('#element').click();
});

it('тест с условным выполнением', async function () {
    const condition = false;
    if (!condition) this.skip(); // Mocha метод skip
    await $('#element').click();
});

Использование this.skip() удобно для динамического пропуска на этапе выполнения, сохраняя корректную статистику тестов.


Прерывание теста с использованием expect из @wdio/expect

WebdriverIO предоставляет встроенные assertion методы, которые автоматически останавливают тест при несоответствии ожиданиям:

it('должен прекратить выполнение при неправильном тексте', async () => {
    const text = await $('#message').getText();
    await expect(text).toBe('Success'); // тест остановится при несоответствии
});

Ключевое преимущество — чистый код без явных if/throw конструкций, с чёткой интеграцией в отчётность тестов.


Рекомендации по практическому использованию

  1. Минимизировать использование process.exit(): предпочтительно ограничивать прерывание текущим тестом.
  2. Комбинировать throw и assertion для критических проверок.
  3. Использовать this.skip() для условного пропуска тестов без фейла.
  4. Разделять проверки на критические и некритические, чтобы сохранять стабильность тестовой сессии.
  5. Логирование условий прерывания помогает быстро понять причины остановки при анализе отчётов.

Прерывание тестов в WebdriverIO позволяет повысить надёжность автоматизации, избегать ложных действий при критических сбоях и управлять потоком тестов в сложных сценариях. Правильное сочетание методов return, throw, this.skip() и assertion делает тесты безопасными, информативными и удобными для интеграции в CI/CD.