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 编译器正
   15   16   17   18   19   20   21   22   23   24   25