Восстановление после сбоев

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

Ретрай механизмы

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

Ретрай в конфигурации WebdriverIO

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

exports.config = {
    retries: 3, // Повторить тест 3 раза при сбое
    ...
};

Кроме того, можно настроить поведение при сбоях для различных типов ошибок:

exports.config = {
    maxInstances: 5,
    capabilities: [{
        maxRetry: 3 // Количество повторов на уровне отдельной капабилити
    }],
    ...
};

Ретрай на уровне теста

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

function retryAction(action, retries = 3, delay = 1000) {
    let attempts = 0;

    while (attempts < retries) {
        try {
            return action();
        } catch (error) {
            attempts++;
            if (attempts < retries) {
                console.log(`Попытка ${attempts} неудачна, повторяю через ${delay}мс`);
                browser.pause(delay);
            } else {
                throw error;
            }
        }
    }
}

// Пример использования
retryAction(() => $('#element').click(), 3, 500);

Обработка ошибок через try-catch

Для того чтобы предотвратить фатальные сбои в тестах, можно использовать блоки try-catch. Это позволяет корректно обрабатывать ошибки и продолжать выполнение тестов или предпринимать действия по восстановлению.

try {
    $('#element').click();
} catch (e) {
    console.error('Ошибка при клике на элемент:', e);
    // Механизм восстановления или логирования
    browser.pause(1000);
    $('#element').click(); // Повторная попытка
}

Использование try-catch помогает в ряде случаев не только поймать исключения, но и провести дополнительные действия, такие как логирование ошибок или выполнение восстановления.

Восстановление соединений

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

exports.config = {
    connectionRetryTimeout: 120000,  // Увеличить тайм-аут соединения
    connectionRetryCount: 3,  // Количество попыток для соединения
    ...
};

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

Обработка тайм-аутов

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

Ожидание элементов

WebdriverIO предоставляет метод waitForExist(), который позволяет тесту подождать появления элемента на странице, а затем выполнить действия с ним.

$('#element').waitForExist({ timeout: 5000, timeoutMsg: 'Элемент не найден!' });

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

Ожидание видимости элементов

Важным аспектом восстановления является правильное ожидание появления элемента на странице и его видимости. Метод waitForDisplayed() выполняет ожидание, пока элемент не станет видимым.

$('#element').waitForDisplayed({ timeout: 5000, timeoutMsg: 'Элемент не отображается' });

Логирование и диагностика

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

browser.addCommand('logAndRetry', function (action, retries = 3) {
    let attempts = 0;
    while (attempts < retries) {
        try {
            return action();
        } catch (error) {
            attempts++;
            console.error(`Ошибка при выполнении действия: ${error.message}`);
            if (attempts < retries) {
                browser.pause(1000); // Пауза перед повтором
            } else {
                throw error;  // Если все попытки неудачны — пробрасываем ошибку
            }
        }
    }
});

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

Параллельное тестирование

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

Чтобы восстановить параллельные тесты, нужно:

  1. Использовать независимые тесты, которые не зависят от состояния других.
  2. Корректно настраивать ретрай-механизмы, чтобы они не влияли на другие параллельно выполняющиеся тесты.
  3. Логировать и отслеживать ошибки в реальном времени для выявления проблем в процессе выполнения тестов.

Восстановление тестовой среды

В случае серьёзных сбоев, таких как ошибки на сервере, поломка внешней системы или других инфраструктурных проблем, важно иметь возможность восстановить тестовую среду. В таких случаях полезно использовать подходы инфраструктуры как код (IaC), автоматизированное восстановление среды с помощью Docker или Kubernetes, или же настройку тестовых данных в соответствии с заранее заданным состоянием.

Использование Docker позволяет запускать тесты в стандартизированных контейнерах, что упрощает восстановление и предотвращает влияние внешних факторов.

Заключение

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