Page 260 - 《软件学报》2026年第4期
P. 260

汪莹 等: 基于大语言模型的故障复现测试用例生成方法                                                      1701


                 为__call__函数. 在根函数定位阶段, 首先将问题报告所在的仓库克隆到本地, 并根据该问题报告的                          base_commit
                 信息切换到问题报告提出时的版本. 随后, 使用              tree-sitter 工具  [39] , 根据抽取出的报错文件和报错根函数名, 提取
                 报错根函数的内容. 如图        4  所示, 依据图  3  中抽取的报错根函数信息, 定位到          Django/core/validators.py  文件中
                 的__call__函数, 具体报错位置为第       130  行. 至此, 本文将整个__call__函数的内容作为报错根函数信息, 后续将用
                 于构建   prompt, 为大语言模型提供问题报告的报错信息.












                                                 图 4 报错根函数定位示意图

                    此外, 本文进一步研究发现, SWE-bench Lite 数据集中, 300       个问题报告中并不都存在错误栈信息, 仅有              58  个
                 问题报告包含错误栈信息, 占比          19.3%. 因此, 本文方法不依赖于问题报告中的错误栈信息, 而是仅将错误栈视为
                 参考信息, 辅助大语言模型定位故障问题的原因, 为生成测试用例提供支持. 若问题报告中包含错误栈, 本文将使
                 用静态分析工具抽取错误栈相关代码上下文, 提供给大语言模型. 若不存在错误栈信息, 本文检索增强生成策略中
                 添加了额外的上下文信息         (import 语句、测试用例样本) 辅助大语言模型理解问题报告. 通过这样的方式, 本文方
                 法弥补了   GitHub  问题报告中错误栈缺失问题, 提升了大语言模型生成故障复现测试用例的效果.
                  3.2   测试文件选择与  import 语句抽取
                    在第  2  节的实证研究中, 本文发现开发人员在编写故障复现测试用例以复现问题报告并验证问题报告是否解
                 决时, 有  40.68%  的情况是基于现有测试函数进行修改的. 这一发现表明, 代码仓库中现有的测试函数蕴含着一定
                 的有效信息, 能够为开发人员提供有价值的参考. 利用这些已有测试用例, 开发人员不仅可以节省编写新故障复现
                 测试用例的时间, 还能有效提升开发效率.
                    基于这一发现, 本文设计了测试文件选择与              import 语句抽取的方法, 旨在通过检索与问题报告最相关的测试
                 文件, 充分利用其中的现有信息, 从而提升大语言模型的故障复现测试用例生成效果. 在这一过程中, 测试文件中
                 的  import 信息是本文重点关注的内容, 因为大语言模型在面对庞大的代码仓库时, 往往难以理解其文件结构, 这
                 可能导致无法正确调用仓库内的            API. 因此, 在选择相关测试文件后, 本文将抽取其            import 语句, 并将其作为检索
                 增强生成的内容, 纳入后续测试用例生成的              prompt 中, 以帮助大语言模型更准确地调用仓库内的              API. 当大语言
                 模型生成故障复现测试用例后, 本文将在所选测试文件的相同路径下创建新的测试文件, 将生成的测试用例放入
                 其中. 由于抽取出的      import 语句代表了代码仓库中正确的调用方式, 这样的处理能够有效避免潜在的                      import 语句
                 调用语法错误, 从而提高生成故障复现测试用例的准确性和可靠性.
                  3.2.1    测试文件选择
                    考虑到大语言模型具备强大的语义理解能力, 本文将测试用例选择这一粗粒度的检索任务交由大语言模型处
                 理. 具体步骤包括测试文件的抽取、文件路径的截取、prompt 的构建, 以及结果的多级选择. 这一方法旨在高效
                 挖掘与问题报告相关的测试文件, 从而为后续的故障复现测试用例生成提供支持.
                    在测试文件抽取阶段, 本文对          SWE-bench Lite 数据集中的  12  个代码仓库逐个进行了分析, 发现每个仓库的
                 测试文件在存储位置上具有相对规范和一致的特点. 为了避免将代码文件错误地抽取出来, 本文为每个代码仓库
                 人工设计了一套测试文件判断规则, 如表             2  所示. 基于这些规则, 本文遍历每个代码仓库中的所有              Python  文件, 抽
                 取出所有符合条件的测试文件路径.
   255   256   257   258   259   260   261   262   263   264   265