惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
B
Blog
博客园 - Franky
博客园 - 三生石上(FineUI控件)
A
About on SuperTechFans
N
Netflix TechBlog - Medium
MyScale Blog
MyScale Blog
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
宝玉的分享
宝玉的分享
小众软件
小众软件
P
Proofpoint News Feed
aimingoo的专栏
aimingoo的专栏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
D
DataBreaches.Net
量子位

InfoQ - 促进软件开发领域知识与创新的传播

Meta 收购 Manus 这事儿泡汤了 5.5万 Star 开源项目 Ghostty 被迫出走,GitHub 正在终结一代技术人的乌托邦 Slack 长时运行多智能体系统的上下文管理方案 从 T+1 到分钟级:金城银行基于 Apache Doris 构建高可靠、强一致的实时数据平台 谷歌云推出 Agents CLI,简化 AI 智能体开发全流程 Claude官方击穿高薪、高学历的安全防线!Anthropic点名10大高危职业,但有群人暂时稳了 亚马逊云科技终止 WorkMail 服务,并将 App Runner 转入维护模式 OPPO小布记忆:全模态碎片化内容的理解与智能整理实践|AICon上海 模力工场038周AI应用周榜:工具在消失,工作流在出现 Akamai CEO Tom Leighton:Agent 时代来临,云基础设施正从“中心化”转向“分布式边缘” 日均数百亿入库背后:从“人肉调度”到K8s弹性架构,度小满金融基于OceanBase重构入库架构实践 百度文库网盘发布GenFlow 4.0:月活用户超1亿,要把网盘变成全端AI工作台 Altman 投的 Agent 终端 Warp 开源了!斩获3.5万star 哪些客户需要拒, 敢让龙虾决定吗?_AI&大模型_InfoQ 中文站_InfoQ精选视频 从开发到生产:为什么越来越多的机器学习团队纷纷迁移到 Snowflake | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 探索多智能体工作流:LangGraph Snowflake Cortex AI | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 腾讯云分布式缓存数据库:AI Agent - 从提示词工程到 Harness 工程 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 基于 Streamlit 为 CSV 数据构建分析智能体 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 AI 智能体:告别文档缺漏 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 构建 AI 驱动的数据管道:深度探讨 Snowflake Openflow 与非结构化数据 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 云端太贵、本地不够聪明,英特尔押注“端云混合AI”:智能体PC会替人完成工作 不到10%的存储投入,可能拖垮90%的GPU投资!IBM把AI Agent塞进存储系统,算清企业最容易忽略的一笔账 Snowpark 上手实战 | BUILD 2025_大数据_王玮_InfoQ精选视频 ClickHouse + Langfuse,构建 Agent 可观测基石 腾讯云分布式缓存数据库:Cluster Proxy 共享连接架构深度解析 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 AI 写代码太烧钱了:Copilot、Claude 一起涨价,不如把程序员请回来? 英特尔发布至强600系列工作站处理器与锐炫Pro B70 GPU,全新AI工作站来了 腾讯云分布式缓存数据库:从 Redis 到 Valkey - 开源社区如何快速创新 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 印奇这次要“从0重做”智驾模型!首谈阶跃和千里双公司布局:中国AI商业闭环要靠车跑出来 从Cursor返聘归来,90后华裔女高管带Claude开启日更模式:token成本比工程师工资低多了!
Uber 利用自动化代码转换,将 75000 多个测试类从 JUnit 4 迁...
作者:Leela Kum · 2026-05-05 · via InfoQ - 促进软件开发领域知识与创新的传播

Uber 工程师利用自动代码转换和编排工具,在他们的一个 Java 单体存储库中将超过 75000 个测试类和 125 万多行代码从 JUnit 4 迁移到了 JUnit 5。此次迁移的动因在于需要采用一个可扩展性更强的现代化测试框架,并减少与处于维护模式的遗留系统相关的技术债务。

JUnit 4 自 2021 年起已经进入维护模式,而 JUnit 5 则引入了基于 JUnit Platform 的模块化架构,支持 Jupiter 引擎,并改进了参数化测试功能。对于 Uber 而言,继续使用 JUnit 4 会限制对新功能的使用,因此尽管规模和基础设施限制带来了复杂性,迁移仍然是必要的。

来自 Uber 的 Anshuman Mishra 和 Kaushik Vejju 指出:

在这种规模下,确定性转换工具对于确保一致性至关重要。

Uber 工程师指出,生成式 AI 在自定义测试用例中生成的结果存在不一致的情况。Uber 的单体存储库包含数十万个与 Bazel 集成的测试,而 Bazel 本身并未提供对 JUnit 5 的原生支持。为了解决这一问题,工程师们首先利用 JUnit Platform 实现了统一的执行模型,使 JUnit 4 和 JUnit 5 测试能够通过 Vintage 和 Jupiter 引擎一起运行。这一兼容层使得迁移工作可以分阶段进行,而且不会打乱现有的工作流程。

使 JUnit 5 支持 Bazel (图片来源: Uber 博客

在构建了执行基础后,Uber 采用 OpenRewrite 来实现源代码变更的自动化。OpenRewrite 基于代码的语义表示进行操作,能够将 JUnit 4 API 确定性地转换为等效的 JUnit 5 实现。工程师们定义了转换规则,用于更新注解、替换旧版规则,并将参数化测试模式转换为 JUnit Jupiter 结构。

为了支持内部测试模式,团队针对 Uber 特有的测试运行器和基类,对这些模板进行了扩展,并添加了自定义转换。他们引入了先决条件检查,目的是避免测试文件迁移不完全,并确保将不受支持的模式排除在自动更新之外。工程师们还分析了整个代码库的使用模式,优先处理高频结构,提高了自动化覆盖率和效率。

大规模执行通过一个名为 Shepherd 的内部编排系统进行管理,该系统能够并行对数千个 Bazel 目标应用转换操作。Shepherd 会生成代码差异,并通过持续集成管道(包括单元测试和集成测试的执行)对其进行验证,从而在接受更改之前确保行为正确性。

通过 Shepherd 自动生成差异(图片来源: Uber 博客)

此次迁移采用了迭代部署模式。初始运行出现了构建和测试失败的情况,为更新转换逻辑提供了依据。经过多次迭代,自动化覆盖率得到提升,从而使他们能够在几乎无需人工干预的情况下迁移更大的代码库部分。

Uber 工程师表示,此次迁移为利用 OpenRewrite 进行大规模转换奠定了基础。当前进行中的工作包括将其集成到 Bazel 中以支持 Spring Boot 3 的构建,并将 Guava 迁移至标准 Java API,同时将 Joda-Time 迁移至 java.time。

原文链接:

https://www.infoq.com/news/2026/04/uber-junit4-junit5-migration/