Сергиев Посад
08:07 / МСК / переменная облачность +16°C

Тестирование во фронтенде: почему тестовое окружение нужно заносить сразу

Что настраивают на старте проекта — и что забывают

Разворачивая новое фронтенд-приложение, команда почти рефлекторно заносит привычный набор: линтеры, pre-commit хуки, TypeScript, UI-кит. Всё это делается на старте и не обсуждается — так принято.

А потом раз за разом забывают об одном и том же: подготовить тестовое окружение.

Тесты оказываются той задачей, которую откладывают до момента, когда «будет время». Времени не появляется никогда, а цена отложенного решения растёт с каждым спринтом. Ниже — четыре причины, почему тестовое окружение стоит заносить в проект вместе с линтерами, а не после релиза.

Причина первая: тесты нужны в первую очередь самому разработчику

Разработчик и так прогоняет написанный код в голове — раз за разом, на соответствие требованиям клиента. Каждый новый кейс добавляется к предыдущим, и в какой-то момент удерживать их все становится физически невозможно.

Это и есть главный аргумент за автоматизацию: набор проверок, который вы держите в голове, можно выгрузить в инструменты, доступные каждому. Тест — это не бюрократия ради галочки в чек-листе, а способ перестать быть единственным местом хранения знаний о том, как система должна себя вести.

Причина вторая: контроль регрессий

Формулировка короткая: не ломайте то, что уже работает.

Сломанный код не должен доезжать до деплоя. Между коммитом и продакшеном нужны «ворота качества» — quality gate, — через которые прогоняется весь фронтенд-код. Одним из звеньев этих ворот должны быть юнит-тесты.

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

Причина третья: тесты меняют код-ревью

Тесты помогают на review и вскрывают неучтённые кейсы.

Если в команде выстроена культура разработки, ревью начинается именно с тестов: они показывают, какое поведение автор считал правильным, и сразу делают видимыми пробелы — сценарии, которые никто не предусмотрел.

Отдельный эффект проявляется ещё раньше, на этапе написания кода. Баги находятся именно в момент написания теста. Казалось бы, повод расстроиться — но на деле это лучший из возможных сценариев: вы правите проблему, пока пишете код, а не когда заказчику приходит гневное сообщение от клиента.

Разница в стоимости этих двух ситуаций и есть главный экономический аргумент за тесты.

Причина четвёртая: тестируемость дисциплинирует архитектуру

Тестирование предполагает, что код удобен для тестирования. Удобен далеко не всякий код.

У каждого фреймворка свой подход, но кое-что остаётся неизменным:

  • декомпозируйте— крупные неделимые куски логики не поддаются проверке по частям;
  • уменьшайте логические взаимосвязи— чем меньше связность, тем меньше нужно поднимать окружения ради одного простого кейса.

Требование тестируемости работает как постоянное давление в сторону более чистой архитектуры. Код, который легко покрыть тестами, обычно оказывается и проще в поддержке — просто потому, что обе задачи требуют одного и того же: понятных границ между частями системы.

С чего начать внедрение

Порядок шагов простой, и первый из них — не технический.

  1. Придите к своей команде и договоритесь.Тестирование не внедряется одним разработчиком в своей ветке. Пока команда не согласилась, что тесты — часть определения готовности задачи, любое покрытие останется личной инициативой одного человека и умрёт при первом же горящем дедлайне.
  2. Подготовьте окружение.Это работа в связке с DevOps: поднять CI и сделать так, чтобы тесты прогонялись автоматически, без ручного запуска.
  3. Возьмите готовый рецепт фреймворка.Любой современный фронтенд-фреймворк предоставляет свою рецептуру для тестирования — искать нестандартное решение на старте не нужно. Возьмите документацию и начните применять на практике.

Ключевое здесь — автоматический прогон. Тесты, которые нужно запускать руками, перестают запускаться примерно через две недели.

Тестирование как стандарт услуги

Держать фронтенд-репозиторий в чистоте и покрытым тестами — это не личная особенность отдельного разработчика, а обязанность команды.

Внедрение процессов тестирования как стандарта в разы повышает качество услуг компании. Для студии, которая делает проекты на заказ, это переводится в понятную вещь: предсказуемость. Клиент получает не обещание, что «всё работает», а процесс, в котором сломанный код не доезжает до продакшена по техническим причинам, а не потому, что кто-то внимательно посмотрел.

Начать можно с одного разговора с командой — а дальше с одного теста в CI.


Материал подготовлен по видео We Wizards «Тестирование как базовый стандарт фронтенд-разработки».