Page 15 - 《软件学报》2026年第7期
P. 15
2700 软件学报 2026 年第 37 卷第 7 期
的执行结果来检测潜在的 JVM 缺陷. 如果在编译和执行的任意一阶段出现不一致行为, LumiX 则会输出不一致报
告以及相应的揭错测试程序. 如果在编译和执行阶段均未出现不一致行为, 新生成的测试程序将被放回至历史揭
错种子程序池中, 用于接收其他新特性的代码片段. 接下来, 本节将对 LumiX 的 3 个主要步骤进行详细的介绍.
输入 总结 选择 生成
LLM
① ② ③ ⑥ 不一致
新特性
新特性 代码片段 ⑧ 编译 报告
JEP文档 大模型 使用描述池 LLM
使用描述 +
插
⑦ 入
选择 分析 提取
大模型 新特性
③ ④ ⑤
测试程序 揭错
历史揭错 种子程序 程序分析 可复用 测试程序
种子程序池 程序元素 种子程序 ⑨ 执行
输出
未发现不一致
新特性使用描述总结及测试程序生成 测试程序编译执行
图 2 LumiX 整体流程图
3.1 新特性使用描述总结
为了生成针对新特性的测试程序, 首先需要获取新特性的准确使用描述, 即明确其语法形式以及在实际代码
中的典型用法. 这一描述为测试程序生成提供了结构化的信息基础, 确保生成的测试用例能够覆盖新特性的关键
行为和边界条件. 通常, Java 的新特性会在官方文档中进行详细的描述, 如 JEP 提案 [2] . JEP 是 Java 生态中用于收
集和管理 Java 开发工具包 (Java development kit, JDK) 增强功能的提案, 涵盖 JDK 各个方面, 如 JVM、JRE 以及
语言特性等. JEP 的存在使得 Java 生态能够收集来自不同社区的需求, 不断增强和完善 Java 体系, 使其更加适应
现代软件开发的需求.
具体来说, JEP 中包含了不同状态的提案, 如进行中的提案 (in-flight JEP)、已交付的特性与基础设施提案
(delivered feature and infrastructure JEP)、已撤回的提案 (withdrawn JEP) 等. 鉴于是对已经实现且集成到 JDK 中的
新特性进行测试, 本文仅针对已交付的特性与基础设施提案中的新特性进行测试. 每个 JEP 提案中都包含对应新
特性的详细描述, 如新特性的总结、动机、描述及测试方式等. 例如, 图 3 展示了 JEP 126 提案中的内容. 该提案
描述了 Java 8 中引入 Lambda 的目的、动机以及使用方法. 图 3 中, 标题栏中的 JEP 编号 (即 JEP 126) 为该提案的
唯一标识符, 提案标题为: “Lambda 表达式及虚拟扩展方法”. 版本信息中描述了提案作者信息、创建日期、发布
版本 (Release 8) 以及所属组件 (tools/javac) 等. 其中, 发布版本标志该提案所属的 Java 版本, 可以用于引入该提案
的版本以及后续版本的测试. 因为 Java 向前兼容, 所以后续版本的 Java 编译器和 JVM 能够正确解析和执行历史
版本中的语言特性. 例如, Java 11 可以覆盖 Java 8 中引入的新特性, 而 Java 8 则无法覆盖 Java 11 中的新特性.
在总结中, 包含了提案主要改动的简要描述. 在动机及描述中, 则通常会包含引入该特性的目的、使用场景、
方法以及示例代码. 例如, 图 3 中的动机描述了引入 Lambda 表达式的目的以及示例代码. 这些信息对于准确地生
成能够覆盖新特性的测试程序非常重要, 同时, 示例代码也为 LumiX 生成针对新特性的代码片段提供了参考. 除
此之外, 提案的内容还包括该特性的测试方法及依赖关系等信息. 为了能对新特性进行有效的测试, LumiX 首先过
滤了非语言特性的 JEP. 例如, 针对 JDK 文档、平台适配、编译方式以及虚拟机选项验证等. 这些 JEP 并非引入
新的特性, 而是针对工具链、运行环境或者平台兼容性进行优化, 因其难以通过代码生成的方式对其进行测试, 故
对语法新特性的研究意义较小. 在完成对 JEP 的筛选与过滤后, LumiX 对剩下的 JEP 进行文本解析, 提取 JEP 中
的标题、发布版本、动机、描述、示例代码等关键信息. 其中, 特性的引入版本用于明确该语言特性首次出现于
哪个 Java 版本, 为后续测试程序的编译与运行阶段选择兼容的 Java 编译器及 JVM 环境提供依据. 其次, JEP 中通

