Page 259 - 《软件学报》2026年第4期
P. 259
1700 软件学报 2026 年第 37 卷第 4 期
(2) 测试文件选择与 import 语句抽取方法概述: 为了让大语言模型能够更好地理解并利用 GitHub 问题报告所
在代码仓库中的现有方法与外部依赖库, 在为 GitHub 问题报告生成故障复现测试用例时, 本文进一步提出了检索
与问题报告内容最相关的测试文件, 并从中抽取 import 语句的方法. import 语句信息有助于大语言模型理解项目
中的 API 调用方式和外部依赖, 从而提高生成测试用例的质量. 具体而言, 本文首先根据启发式规则抽取 GitHub
问题报告所在代码仓库中的所有测试文件, 包括每个测试文件的文件名及其路径. 然后, 将所有测试文件名组成一
个集合, 并通过大语言模型的理解能力选择出与问题报告最相关的测试文件. 在选择过程中, 采用多次生成的方
式, 最终选取出现频率最高的测试文件作为最相关的测试文件. 最后, 使用正则表达式规则抽取选定测试文件中的
所有 import 语句. 通过这一方法, 本文为大语言模型提供了与给定 GitHub 问题报告相关的 API 接口上下文信息,
帮助模型更好地理解仓库中的现有方法和外部依赖, 从而生成更准确的故障复现测试用例.
(3) 基于相似度计算的测试用例样本选取方法概述: 考虑到 GitHub 问题报告通常来自真实软件开发过程, 具
有较高的复杂性, 本文进一步通过在现有代码仓库中检索与问题报告内容相关的测试函数作为样例, 帮助大语言
模型理解特定代码仓库中测试用例写法, 从而提升为 GitHub 问题报告生成故障复现测试用例的效果. 具体而言,
本文首先根据检索出的与问题报告最相关的测试文件, 利用程序分析技术抽取测试文件中的所有测试函数. 接着,
采用基于 embedding 的相似度计算方法, 计算每个测试函数与给定问题报告之间的相似度. 最后, 根据相似度得分
对测试函数进行排序, 筛选出与当前问题报告最相关的 3 个测试函数作为样例, 提供给大语言模型, 用于生成故障
复现测试用例. 通过这一方法, 本文进一步提高了生成的测试用例的准确性和适用性.
(4) 故障复现测试用例生成方法概述: 在检索到报错根函数、import 语句以及测试用例样本后, 本文将这些检
索到的信息整合进生成测试用例的 prompt 中. 为进一步提升大语言模型的生成效果, 本文采用了多种提示工程方
法, 包括角色扮演、思维链、few-shot 学习等. 这些方法通过精心设计的提示, 引导大语言模型理解任务要求, 准
确生成能够复现并验证 GitHub 问题报告是否解决的故障复现测试用例.
3.1 报错根函数定位
当 GitHub 问题报告涉及代码报错问题时, 描述中通常会包含错误栈, 反映出代码的报错调用链. 本文将报错
调用链中最后一个在代码仓库中的函数定义为报错根函数. 如图 3 所示, 展示了 Django 仓库 [38] 的一个问题报告描
述, 其中包含了相关的错误栈信息. 基于启发式经验, 本文认为只有在问题报告所在仓库中的函数才可能是导致问
题的原因, 因此不考虑第三方库调用的函数. 例如, 最后一行的 urlsplit 函数属于第三方库 urllib. 因此, 该问题报告
的报错根函数为 Django/core/validators.py 文件中的__call__函数.
图 3 GitHub 问题报告描述中错误栈举例图
本文采用基于规则的方法来实现报错根函数的定位, 分为两步: 抽取报错根函数信息和根函数定位. 在抽取
报错根函数信息阶段, 首先使用字符串处理方法识别问题报告描述中的“Traceback”字符串, 以判断是否包含错误
栈信息, 并提取所有相关的错误栈内容. 接着, 利用正则表达式逐行解析错误栈, 提取每一行中的报错文件、报错
代码行和报错函数信息. 最后, 过滤掉第三方库调用的函数, 仅保留最后一个报错函数作为报错根函数. 以图 3
中的错误栈信息为例, 本文抽取出的报错文件为 Django/core/validators.py, 报错代码行为第 130 行, 报错根函数

