banner

Новости

Oct 20, 2023

Переход от Enzyme к библиотеке тестирования React

Домашняя страница InfoQ Новости Переход от ферментов к библиотеке тестирования React – практический пример Sentry

02 марта 2023 г., чтение на 3 минуты

к

Бруно Курьоль

Команда инженеров Sentry недавно рассказала в своем блоге о движущих силах и уроках, извлеченных из миграции интерфейсных тестов с Enzyme на библиотеку тестирования React. Миграция была вызвана отсутствием поддержки Enzyme новых версий React. Миграция заняла около 20 месяцев, и в ней приняли участие 17 инженеров, просмотревших около 5000 тестов.

Инженеры Sentry несколько раз отказывались от миграции своей тестовой базы на React Testing Library (RTL) из-за отсутствия существенных преимуществ. Команда вспоминала:

Мы не выбрасываем вещи просто потому, что они новые. Мы тщательно оцениваем новые технологии, чтобы понять, какую пользу они приносят нашей команде. Тогда RTL был нам известен, но у нас не было веских аргументов в пользу того, почему нам следует включить его в нашу кодовую базу. Enzyme, библиотека, которую мы использовали для тестирования нашей библиотеки компонентов, все еще удовлетворяла наши потребности.

С одной стороны, Sentry уже занималась масштабным переходом на TypeScript, что, наряду с регулярной работой над продуктом, занимало команду разработчиков.

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

(Источник: инженерный блог Sentry)

Проверка концепции показала повышение производительности на 12 %, чего было сочтено недостаточным для начала еще одного длительного проекта миграции. Тем не менее проверка концепции доказала, что RTL имеет заметные преимущества перед Enzyme. Как сообщает команда, Enzyme не проверял доступность, не очищал автоматически тестовую среду и часто напрямую обращался к компоненту, находящемуся в состоянии теста. И наоборот, RTL ближе к интеграционному тестированию и стремится тестировать варианты использования приложения с точки зрения пользователя. В частности, RTL старается избегать тестирования деталей реализации. Изменения реализации должны нарушать тест только в том случае, если они действительно приводят к ошибке.

Анализ компромиссов изменился после того, как Sentry перешел на TypeScript и начал обновление до React 17 (который включает React Hooks). Команда вспоминает:

Миграция [RTL] по-прежнему не привлекала особого внимания, пока мы не приступили к обновлению React до версии 17. Основная команда React полностью переписала внутренние компоненты библиотеки, а Enzyme напрямую использовал ряд внутренних функций React.[…] Enzyme этого не сделал. работает на 100% с этой новой версией React, но на рынке был адаптер, который решал эту проблему, и мы его использовали. Однако это решение не будет работать в долгосрочной перспективе, поскольку React 18 потребует полной переписывания, что маловероятно, учитывая, что Airbnb прекратил поддержку Enzyme.[…] RTL не полагается на внутренние компоненты React. и продолжит работать с React 18 так же, как с 16 и 17.

Как только был дан зеленый свет, фокус переключился на минимизацию рисков проекта миграции (инженерные оценки при различных гипотезах, итеративный подход против миграции «большого взрыва», отслеживание прогресса, обучение RTL, распространение лучших практик, ежедневные проверки кода и т. д. ).

Миграция была завершена через 18 месяцев (по оценкам, через 14 месяцев). Это позволило команде удалить устаревшие тесты, улучшить доступность (ранее упускаемый из виду аспект) и писать тесты, основанные на сценариях использования, а не на деталях реализации.

Команда подробно описала неожиданные проблемы с производительностью, возникающие при буквальном следовании некоторым рекомендациям RTL (например, в дополнение к издевательству над веб-API, издевайтесь над пользователем как можно больше и максимально реалистично). Несмотря на отсутствие значительных улучшений в производительности тестов (основная проблема, которая вызвала интерес к первоначальному доказательству концепции), команда пришла к положительному выводу:

ДЕЛИТЬСЯ