Uber завершил миграцию более 75 000 тестов и свыше 1,25 миллиона строк кода с JUnit 4 на JUnit 5, используя автоматизированные инструменты трансформации кода. Это важный шаг, который позволяет улучшить масштабируемость и поддерживаемость их программного обеспечения.
Контекст миграции
JUnit 4 находился в режиме поддержки с 2021 года, в то время как JUnit 5 предлагает модульную архитектуру и улучшенные возможности тестирования. Это создаёт необходимость для долгосрочных проектов, таких как у Uber, обеспечивать совместимость с современными возможностями, чтобы не отставать от индустриальных стандартов. Продолжать использовать устаревший фреймворк ограничивало доступ к новым функциям, что и стало причиной для миграции, несмотря на сложности, связанные с масштабом инфраструктуры.Технические детали миграции
Инженеры Uber разработали стратегию, используя инструмент OpenRewrite для ускорения процесса. Этот инструмент позволяет выполнять детерминированные трансформации кода с JUnit 4 на эквиваленты JUnit 5. Инженеры определили рецепты трансформации для обновления аннотаций и замены устаревших правил, а также адаптировали тестовые шаблоны под новые конструкции JUnit Jupiter. Дополнительно были реализованы проверки на наличие несоответствий, что обеспечивало качество переносимого кода.Миграция была основана на итеративной модели, которая начиналась с первоначальных пробных запусков, выявляющих ошибки сборки и тестов. Каждая итерация улучшала покрытие автоматизации, позволяя обрабатывать большие объемы кода с минимальным вмешательством разработчиков. При этом использовалась внутренняя система оркестрации Shepherd для параллельного применения трансформаций.
Практическое значение для разработчиков
Миграция с JUnit 4 на JUnit 5 — важный опыт для разработчиков, работающих с крупными кодовыми базами. Это показывает, что внедрение автоматизированных решений может существенно ускорить и упростить процесс обновления устаревших систем. Аналогичные проекты для российских команд могут потребовать внедрения автоматизации для повышения продуктивности, а также обеспечения долгосрочной поддерживаемости кода.В дальнейшем Uber планирует интегрировать OpenRewrite в Bazel для сборок Spring Boot 3 и обновление библиотек, таких как Guava, к стандартным Java API.