WebdriverIO предоставляет несколько способов для повторных попыток выполнения тестов в случае ошибок. Механизмы повторных попыток позволяют не только улучшить стабильность тестов, но и сделать процесс тестирования более гибким, минимизируя влияние случайных сбоев или сетевых задержек.
Повторные попытки могут быть полезны в нескольких случаях:
Retry механизмы помогают повысить стабильность тестов, минимизируя вероятность ложных срабатываний ошибок, вызванных случайными, но временными проблемами.
В WebdriverIO можно настроить глобальные retry механизмы в
конфигурации с помощью параметра retry. Этот механизм
позволяет определять, сколько раз будет повторяться тест в случае
неудачи.
Опция retryTests в конфигурации WebdriverIO определяет,
сколько раз будет повторяться каждый тест в случае его неудачного
завершения.
Пример настройки:
exports.config = {
retryTests: 2, // Количество повторных попыток для каждого теста
// другие параметры конфигурации
}
В этом примере каждый тест будет повторяться дважды в случае неудачи.
Если необходимо настроить 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 для этой конкретной команды.
waitUntil с retry механизмомWebdriverIO предоставляет возможность использовать команду
waitUntil с параметром повторных попыток. Это полезно для
ожидания появления элементов на странице, когда их видимость или
доступность может быть задержана.
Пример:
await browser.waitUntil(
async () => (await $('#submit').isDisplayed()) === true,
{
timeout: 5000,
timeoutMsg: 'Кнопка не появилась на странице',
interval: 1000 // Периодичность попыток
}
);
В этом примере WebdriverIO будет повторять проверку каждые 1000 миллисекунд до тех пор, пока кнопка не станет доступной или не истечет время ожидания.
Механизмы повторных попыток могут быть полезны не только для отдельных тестов, но и для выполнения всей серии тестов. В 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: 'Кнопка не появилась на странице'
}
);
Этот подход позволяет избежать излишнего ожидания, когда элемент не появляется, и оптимизировать время тестирования.
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 механизмом внутри теста, используя цикл для повторных попыток поиска и проверки элемента на странице.
Retry механизмы в WebdriverIO — это мощный инструмент для управления нестабильностью тестов, вызванной случайными или временными проблемами. Правильная настройка retry помогает минимизировать количество ложных срабатываний, ускоряет процесс тестирования и повышает уверенность в результатах тестов.