Системный тест пада...
 
Уведомления
Очистить всё

Системный тест падает через раз в CI, локально всегда зелёный

5 Сообщения
4 Пользователи
2 Реакции
469 Просмотры
Юлия Ф.
Сообщения: 11
Автор темы
Разобрался с блоками фулстек-разработчица
Присоединился: 3 года назад
[#39]

Rails 7.1, системные тесты на Selenium с headless Chrome. Один тест на форму заказа падает в CI примерно в каждом четвёртом прогоне, локально я прогнала его 50 раз подряд без единого падения. Падает в конце:

click_on "Оформить"
sleep 1
expect(page.text).to include("Заказ создан")
expect(Order.last.status).to eq("new")

sleep уже стоит, пробовала 2 секунды, стало реже, но не прошло. CI слабее моего ноутбука, это понятно, но не ставить же пять.


4 ответа
Ксения 90
Сообщения: 18
Пишет тесты QA-автоматизатор
Присоединился: 4 года назад

Тут две беды сразу. sleep ничего не гарантирует: на быстрой машине он тратит время зря, на медленной его не хватает. А page.text берёт текст страницы в эту самую секунду и не ждёт. Матчеры Capybara сами повторяют проверку, пока не выйдет default_max_wait_time:

click_on "Оформить"
expect(page).to have_content("Заказ создан")
expect(page).to have_css(".order-status", text: "Новый")

Никакого sleep. Если стандартных 2 секунд ожидания в CI мало, лучше поднять Capybara.default_max_wait_time до 5 для всех: на зелёном прогоне ожидание всё равно заканчивается, как только текст появился. А Order.last сразу после клика это вторая частая причина таких падений: браузер и тест живут в разных потоках, и запрос мог ещё не дойти до базы. Проверяйте то, что видит пользователь.


Ответ
armen_pet
Сообщения: 30
Собрал свой gem DevOps-инженер
Присоединился: 4 года назад

Со стороны CI проверьте ещё, сколько процессов гоняется на одном раннере. 8 воркеров на 4 ядра дают флаки по всему набору, а не в одном тесте


Ответ
polina_iva
Сообщения: 3
Пишет в irb тестировщица
Присоединился: 3 года назад

и посмотрите скриншоты падений, Rails сам кладёт их в tmp/screenshots. только сохраните эту папку как артефакт CI


Ответ
Юлия Ф.
Сообщения: 11
Автор темы
Разобрался с блоками фулстек-разработчица
Присоединился: 3 года назад

Убрала sleep, переписала на have_content, а Order.last заменила на проверку статуса на странице, как советовали. На скриншотах упавших прогонов, кстати, и правда крутился спиннер: ответ в CI иногда шёл дольше секунды, только и всего. Прогнала 30 раз подряд, всё зелёное, и тест стал быстрее на секунду. Про воркеры на раннере передала админам.


Ответ