Voltar para o blog
Machine Learning

Uber automatiza migração de mais de 75 mil classes de teste de JUnit 4 para JUnit 5 com OpenRewrite

27 de abril de 2026
11:45
engenharia de softwareJavaJUnitTeste AutomatizadoMigração de CódigoOpenRewriteBazelInfraestrutura de TestesTransformação de CódigoMonorepo
Uber automatiza migração de mais de 75 mil classes de teste de JUnit 4 para JUnit 5 com OpenRewrite

A Uber concluiu a migração de mais de 75 mil classes de teste e 1,25 milhão de linhas de código do framework JUnit 4 para JUnit 5 em seu monorepo Java, utilizando transformação automatizada de código com a ferramenta OpenRewrite e orquestração interna. Essa iniciativa visa modernizar a infraestrutura de testes da empresa, garantindo maior extensibilidade e reduzindo a dívida técnica associada à manutenção do legado.

Motivação para a migração

O JUnit 4 está em modo de manutenção desde 2021, enquanto o JUnit 5 oferece uma arquitetura modular construída sobre a JUnit Platform, suportando o motor Jupiter e aprimorando testes parametrizados. Para a Uber, continuar usando o JUnit 4 limitava o acesso a recursos modernos, tornando a migração necessária apesar da complexidade imposta pela escala e infraestrutura.

Desafios técnicos enfrentados

  • Escala do monorepo: centenas de milhares de testes integrados com o Bazel, que não suporta nativamente JUnit 5.
  • Consistência: transformações determinísticas foram essenciais para garantir uniformidade em toda a base.
  • Limitações da IA generativa: tentativas de usar IA para migração automática geraram resultados inconsistentes devido à variedade de padrões de teste personalizados da Uber.

Solução adotada

Para superar a incompatibilidade do Bazel com JUnit 5, os engenheiros da Uber habilitaram um modelo de execução unificado na JUnit Platform, permitindo que testes JUnit 4 e JUnit 5 fossem executados juntos via motores Vintage e Jupiter. Essa camada de compatibilidade possibilitou a migração incremental sem interromper os fluxos existentes.

Com a fundação estabelecida, a Uber adotou o OpenRewrite para automatizar mudanças no código-fonte. Essa ferramenta opera sobre uma representação semântica do código, permitindo transformações determinísticas das APIs do JUnit 4 para equivalentes do JUnit 5. Foram definidas receitas de transformação para atualizar anotações, substituir regras legadas e converter padrões de testes parametrizados para construções Jupiter.

Além disso, a equipe criou transformações customizadas para padrões internos, como runners e classes base específicas da Uber. Foram implementadas verificações prévias para evitar migração parcial de arquivos e excluir padrões não suportados pela automação.

Orquestração e validação em escala

A execução em larga escala foi gerenciada pelo sistema interno Shepherd, que aplicou as transformações em milhares de alvos Bazel em paralelo. O Shepherd gerou diffs de código e validou as alterações via pipelines de integração contínua, incluindo execução de testes unitários e integração, assegurando a correção comportamental antes da aceitação das mudanças.

A migração foi realizada de forma iterativa, com runs iniciais que identificaram falhas de build e teste, permitindo refinamentos nas receitas de transformação. Com o avanço, a cobertura da automação aumentou, reduzindo a necessidade de intervenção manual.

Impacto prático e próximos passos

Essa migração não só modernizou a infraestrutura de testes da Uber como também estabeleceu uma base para futuras transformações em larga escala usando OpenRewrite. Atualmente, a equipe trabalha na integração dessa ferramenta ao Bazel para builds com Spring Boot 3, além da migração de bibliotecas como Guava para APIs Java padrão e Joda-Time para java.time.

Quem pode se beneficiar

Empresas e equipes que mantêm grandes bases de código Java com testes legados podem aproveitar as estratégias e ferramentas adotadas pela Uber para modernizar seus frameworks de teste sem comprometer a estabilidade. A combinação de OpenRewrite para transformações semânticas e orquestração robusta com validação contínua é uma referência para migrações em escala.

Disponibilidade e acesso às ferramentas

Links úteis