Устранение шелушения кипарисовика
Недавно я прошел тест Cypress, который оказался очень нестабильным. Иногда это проходило, а иногда терпело неудачу.
Однажды, после трех неудачных конвейеров развертывания благодаря этому тесту, я решил улучшить его раз и навсегда.
Ошибка Cypress, которую я получал, мало что мне рассказала. Элемент #results
DOM не был найден, но это могло произойти по многим причинам.
Когда я открыл тест, он выглядел примерно так:
Вы можете определить проблему?
Спойлер - проблема в четвертой строке: cy.wait(1000)
.
Панель поиска выполняет API-вызов сервера. Однако в нашей среде CI этот вызов API был очень медленным. Это приведет к тому, что Cypress будет искать продукт «Hand Sanitizer Pro», пока API еще загружается.
Улучшение теста
Лучший способ решить эту проблему - позволить Cypress дождаться завершения вызова API.
Добиться этого можно следующим образом:
Здесь мы помечаем маршрут /search
как search
.
Затем, вызвав cy.wait("@search")
, Cypress будет ждать завершения вызова API, прежде чем продолжить.
Более того, если вызов API по какой-либо причине не работает, то полученная нами ошибка Cypress будет гораздо более полезной:
Это говорит нам, например, о том, что вызов API никогда не выполняется.
Дайвинг глубже
Используя cy.wait("@search")
, вы получаете доступ к объекту XHR
.
Это означает, что вы можете утверждать определенные вещи о вызове API из Cypress. Например:
Здесь мы утверждаем, что конечная точка /search
вызывается с параметром запроса q
со значением Hand Sanitizer
.
Вы можете утверждать многое об объекте XHR
, -c просмотрите документацию Cypress для получения дополнительной информации.
Заключение
Я рекомендую всегда использовать это при ожидании вызовов API - и держитесь как можно дальше от cy.wait(seconds)
!