Page 20 - 《软件学报》2026年第7期
P. 20
赵英全 等: 基于大语言模型的 Java 新特性测试程序生成 2705
输出格式, 确保其结构化和规范化, 避免生成其他冗余信息影响后续测试程序的合成.
You are an expert Java code synthesis engine with deep understanding of JVM internals
角色设定: and JDK evolution…
Generate syntactically and semantically valid Java code that COMPLIES WITH THE
任务描述:
FOLLOWING CONSTRAINTS: “CONSTRAINTS”. The code snippet you generate should utilize the
following new JVM features: “FEATURES”, and use the following variables and methods:
“REUSEABLE PROGRAM ELEMENT”.
约束条件: Prohibited Generation Constraints and Must Satisfy Constraints.
使用描述: “JEP 126: Lambda Expressions & Virtual Extension Methods…”
程序元素: String str = “com.example.*;!*”;…
输出格式: Your response should consist solely of a code snippet…
图 7 代码片段生成提示词示例
3.2.3 测试程序生成
在新特性代码片段生成之后, LumiX 会将其直接插入至种子程序中随机选择的插入点中, 从而生成完整的测
试程序. 具体来说, LumiX 会将大模型返回的代码片段解析为 AST, 随后将其插入至种子程序 AST 中被选中的插
入点之前. 相较于现有工作, 如 JavaTailor、VECT 需要为插入的代码片段设计额外的被破坏约束修复策略, LumiX
生成的代码可以直接插入到指定的插入点之前, 而无需额外的修复策略. 其主要原因在于: 一方面, LumiX 严格约
束代码片段使用的程序元素必须在上下文信息中被定义或在新生成的代码片段中被定义; 另一方面, LumiX 设计
了大量的约束规则保障生成代码片段的有效性. 最后, LumiX 将插入新生成代码片段之后的 AST 转换为源码, 生
成新的测试程序.
3.3 测试程序编译与执行
在 Java 生态中, 语言新特性的实现不仅依赖于 Java 编译器的支持, 还依赖 Java 虚拟机对相应字节码的正确
解析与执行. 因此, 语言新特性的缺陷可能出现在 Java 编译器生成字节码的过程中, 也可能出现在 JVM 对生成字
节码的解析和执行过程. 为了系统性地发现这些缺陷, 对于新生成的测试程序, LumiX 采用双层差分测试的机制,
即分别使用不同的 Java 编译器和 JVM 对其进行编译和执行, 以检测它们中潜在的缺陷.
图 8 展示了双层差分测试的示意图.
测试程序 (源码)
第1层: 编译差分
javac ECJ
测试程序 (字节码) 测试程序 (字节码)
第2层: 执行差分
图 8 双层差分测试示意图
具体来说, 对于新生成的测试程序, LumiX 首先使用 javac 和 ECJ 两个 Java 编译器进行编译, 如图 8 中的第 1 层
差分所示. 如果两个不同的编译器实现在编译阶段出现不一致行为, 例如, 对于一个测试程序, 一个 Java 编译器正

