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    中通
   10   11   12   13   14   15   16   17   18   19   20