Retry механизмы

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

Важность Retry механизмов

Повторные попытки могут быть полезны в нескольких случаях:

  • Проблемы с загрузкой страницы.
  • Нестабильное соединение с сервером.
  • Задержки в рендеринге элементов на странице.
  • Тестируемая страница, взаимодействующая с внешними API, может временами не отвечать.

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

WebdriverIO: Retry в конфигурации

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

retry.retryTests

Опция retryTests в конфигурации WebdriverIO определяет, сколько раз будет повторяться каждый тест в случае его неудачного завершения.

Пример настройки:

exports.config = {
    retryTests: 2,  // Количество повторных попыток для каждого теста
    // другие параметры конфигурации
}

В этом примере каждый тест будет повторяться дважды в случае неудачи.

retry.runTest

Если необходимо настроить retry механизмы для отдельных тестов, WebdriverIO поддерживает параметр retry внутри самого теста.

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

describe('Мой тест', () => {
    it('Тест с попытками повторить', { retries: 3 }, async () => {
        await browser.url('https://example.com');
        const button = await $('#submit');
        await button.click();
        const result = await $('#result');
        expect(result).toHaveText('Success');
    });
});

В данном примере для конкретного теста будет задано три попытки на случай его неудачи.

Retry механизмы для команд

Иногда необходима настройка повторных попыток не для всего теста, а только для отдельных команд или шагов. Например, если команда поиска элемента или клик по кнопке не удалась, можно установить retry для этой конкретной команды.

Использование waitUntil с retry механизмом

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

Пример:

await browser.waitUntil(
    async () => (await $('#submit').isDisplayed()) === true,
    {
        timeout: 5000,
        timeoutMsg: 'Кнопка не появилась на странице',
        interval: 1000  // Периодичность попыток
    }
);

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

Глобальные retry опции в тестах

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

Пример конфигурации для повторных попыток на уровне всего набора тестов:

exports.config = {
    maxInstances: 5,
    runner: 'local',
    framework: 'mocha',
    specFileRetries: 2, // Повторить все тесты дважды
    specFileRetriesDelay: 2000, // Задержка между попытками 2 секунды
    mochaOpts: {
        ui: 'bdd',
        timeout: 60000
    }
}

Здесь устанавливается, что все тесты будут повторяться дважды, с задержкой в 2000 миллисекунд между попытками. Это полезно, если несколько тестов в одном наборе могут столкнуться с временными проблемами.

Управление временем ожидания

Для настройки более гибких retry механизмов можно регулировать параметры времени ожидания. Например, использование timeout и interval позволяет настроить время между каждой попыткой, а также задать максимальное время, в течение которого будет выполняться повторная попытка.

Пример с увеличением интервала и времени ожидания:
await browser.waitUntil(
    async () => (await $('#submit').isDisplayed()) === true,
    {
        timeout: 10000, // Максимальное время ожидания
        interval: 2000, // Интервал между попытками
        timeoutMsg: 'Кнопка не появилась на странице'
    }
);

Этот подход позволяет избежать излишнего ожидания, когда элемент не появляется, и оптимизировать время тестирования.

Использование Retry с асинхронными функциями

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

Пример:

describe('Тест с асинхронной попыткой', () => {
    it('Проверка появления кнопки', async () => {
        await browser.url('https://example.com');
        
        let retryCount = 0;
        let button;
        
        while (retryCount < 3) {
            try {
                button = await $('#submit');
                if (await button.isDisplayed()) {
                    break;
                }
            } catch (e) {
                retryCount++;
                if (retryCount >= 3) {
                    throw new Error('Кнопка не появилась после 3 попыток');
                }
            }
            await browser.pause(1000); // Задержка перед следующей попыткой
        }
        
        await button.click();
        const result = await $('#result');
        expect(result).toHaveText('Success');
    });
});

Этот пример демонстрирует ручное управление retry механизмом внутри теста, используя цикл для повторных попыток поиска и проверки элемента на странице.

Лучшие практики

  1. Не злоупотребляйте retry механизмы. Повторные попытки могут скрывать реальные проблемы с тестируемым приложением. Лучше использовать retry для временных, вероятных сбоев, но не для постоянных ошибок.
  2. Гибко настраивайте время ожидания. Настройка таймаутов и интервалов между попытками может значительно повлиять на скорость выполнения тестов и их стабильность.
  3. Логирование. Включите детализированное логирование для действий, которые могут повторяться. Это поможет в диагностике, если тесты снова и снова не проходят.

Заключение

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