Перейти к основному содержимому

Стратегия тестирования

Не о том, как написать тест — для этого есть страница о тестировании во Flutter, — а о том, зачем нужен набор тестов целиком, куда имеет смысл вкладывать усилия и как сделать так, чтобы он окупался.

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

Что нужно понимать​

  • Что причинит больше всего вреда, если сломается, и покрыто ли оно
  • Что каждый уровень тестов ловит такого, чего не ловят остальные
  • Что упавший тест должен сообщить — сразу, без разбирательств
  • Во что обходится набор тестов: время, поддержка и те изменения, от которых он отговаривает
  • Какие риски дешевле закрыть мониторингом, а не тестами

Ключевые темы​

Форма​

  • Пирамида и почему это аргумент про стоимость, а не правило
  • Внизу быстрые и многочисленные, наверху медленные и редкие
  • Где между клиентом и сервером находятся контрактные тесты
  • Ручное тестирование как осознанный выбор для отдельных вещей

Выбор​

  • От рисков: вероятность, умноженная на ущерб, а не процент покрытия
  • Тестирование поведения на границе, а не реализации внутри неё
  • От багов: каждый баг на проде оставляет после себя тест
  • Что не тестировать: сгенерированный код, поведение фреймворка, мелочи

Доверие​

  • Нестабильные тесты обесценивают весь набор
  • Падения, по которым причина видна без расследования
  • Независимые тесты, которые можно запускать в любом порядке
  • Подготовка данных, которая не превращается в отдельное бремя

Экономика​

  • Длительность прогона и точка, после которой его перестают запускать
  • Стоимость поддержки, когда тесты слишком много знают о реализации
  • Покрытие как диагностика, но никогда как цель
  • Удаление тестов, которые больше не окупаются

В пайплайне​

  • Что запускается на каждый коммит, на каждый pull request, ночью
  • Параллельный и выборочный запуск
  • Блокировка релиза по нужному подмножеству тестов

Уровни​

УровеньКак это выглядит
JuniorПишет тесты на тот код, который просят покрыть.
MiddleОсознанно выбирает уровень, тестирует поведение на границах, на каждый баг добавляет регрессионный тест.
SeniorЗадаёт стратегию для кодовой базы: что покрыто, что нет и почему, держит набор тестов быстрым и заслуживающим доверия, понимает, что мониторинг закрывает лучше тестов.

Практика​

Для начала​

  • Покройте критичный сценарий Найдите тот единственный сценарий, который не должен ломаться никогда, и убедитесь, что он протестирован от начала до конца.

  • Превратите баг в тест Возьмите последний баг с прода и напишите тест, который бы его поймал.

  • Замерьте прогон Измерьте, сколько времени идут тесты, и найдите, что занимает больше всего.

Глубже​

  • Сопоставьте риски и покрытие Выпишите, что причинит больше всего вреда при поломке, и проверьте, чем именно каждый пункт покрыт. Закройте пробелы.

  • Удалите тесты Найдите тесты, которые проверяют только реализацию, и удалите их, обосновав решение.

  • Разделите пайплайн Отделите быстрые проверки на каждый коммит от медленных ночных и выберите границу осознанно.

Проверьте себя​

  • Что в вашем продукте нанесёт больше всего ущерба, если сломается, и протестировано ли оно?
  • Какая доля падений ваших тестов — настоящие баги?
  • Сколько должен идти прогон, чтобы его начали избегать?
  • Какие тесты ломаются при рефакторинге, который не менял поведение?
  • Что вы сознательно не тестируете и сможете ли это защитить?
  • Какие риски в вашем приложении лучше ловятся мониторингом, а не тестами?

Материалы​

  • Test Desiderata — двенадцать свойств хорошего теста от Кента Бека и главная мысль: они конфликтуют друг с другом. Лучшая из существующих опор для таких решений.
  • Testing overview — уровни тестирования во Flutter и граница, за которой каждый из них перестаёт видеть проблемы.
  • Google Testing Blog — особенно серия Testing on the Toilet: коротко, конкретно и в основном про здравый смысл, а не про технику.
  • Software Engineering at Google, chapter 11 — тестирование в больших масштабах, бесплатно онлайн. Сильная глава о том, почему тесты обязаны быть быстрыми и детерминированными, иначе они ничего не стоят.
  • The Practical Test Pyramid — подробный разбор от Хэма Вокке, включая контрактное тестирование между сервисами.