Раздел 43 · Автотестирование с нуля

Откуда берутся flaky: шесть причин и размер теста

senior~30 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

На табло в фойе два месяца. Набор, который ты растил с блока D, стал большим и медленным, и в пятницу вечером никто уже не читает, что в нём покраснело: кнопку «перезапустить» жмут раньше, чем открывают лог. Тимур говорит «тесты кривые», и ровно так же когда-то перестали верить tests_final_v2/ Глеба. Набор есть, веры нет. Если так пойдёт дальше, в «Ночь продаж» красный прогон перезапустят так же, как в эту пятницу.

В понедельник Вера выгрузила историю пайплайна за месяц. 41 перезапуск, 17 разных тестов, которые хоть раз упали и прошли со второй попытки. Три из них падали чаще остальных. Один, test_refund_frees_seat, падал не из-за теста: возврат и новая покупка того же места иногда шли одновременно, и место уходило в никуда. Это та же гонка, что в уроке 68, только на возвратах. Тест месяц честно сообщал о баге, а команда месяц честно его перезапускала.

Блок J про надёжность набора. За восемь уроков ты научишься находить причину моргания, считать флакость, вести карантин, разводить тесты в параллели, ускорять набор, покрывать тестами код без тестов и рефакторить сами тесты. В конце блока босс П7: набор из 40 тестов, 9 из которых моргают, каждый по своей причине.

Градусник, который врёт

Дома градусник, который через раз показывает 38 здоровому ребёнку. После третьего ложного жара мама перестаёт ему верить и мерит температуру ладонью. А потом пропускает настоящий жар, потому что градусник «опять врёт».

Тест, который моргает, работает так же. Сначала команда перезапускает его, потом перестаёт смотреть на красный цвет, а потом пропускает настоящий баг, который этот тест поймал. Flaky-тест опасен не тем, что падает, а тем, что учит команду не верить красному.

урок из курса

Урок из курса «Автотестирование с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.