Ответ вслух Senior Тестирование обновлено

Нестабильные тесты

Вопрос

Тесты во Flutter-проекте иногда падают без изменений в коде. Как вы найдёте и устраните причины?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Сначала собираю статистику: какие тесты падают и с какой частотой, повторяю их локально много раз подряд и в случайном порядке. Типичные причины: реальное время, когда тест зависит от DateTime.now или таймеров, тогда абстрагирую часы и использую fakeAsync, а в widget-тестах pump с длительностью.

Что должно прозвучать в ответе

  • Зависимость от реального времени и случайности: абстракция часов, `fakeAsync`, фиксированный seed

  • Реальная сеть и общий стейт между тестами: моки, сброс в `setUp`

  • Неправильная прокачка кадров: `pumpAndSettle` с бесконечной анимацией, ожидание без `pump`

  • Порядок тестов и глобальные синглтоны

  • Golden-тесты на разных ОС и шрифтах

  • Сбор статистики падений в CI, карантин и обязательное исправление

Что могут спросить следом

  • Как протестировать debounce на 300 мс без ожидания?
  • Почему синглтоны мешают тестам?

Разбор

Образцовый ответ: «Сначала собираю статистику: какие тесты падают и с какой частотой, повторяю их локально много раз подряд и в случайном порядке. Типичные причины: реальное время, когда тест зависит от DateTime.now или таймеров, тогда абстрагирую часы и использую fakeAsync, а в widget-тестах pump с длительностью. Реальная сеть или общий стейт: синглтон, оставшийся от прошлого теста, тогда подменяю зависимости и сбрасываю их в setUp. Неправильная прокачка кадров, например pumpAndSettle при бесконечной анимации. Golden-тесты на разных ОС. Найденный нестабильный тест временно помечаю и чиню в приоритете, потому что тесты, которым не верят, хуже отсутствия тестов»

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.