Page 263 - 《软件学报》2026年第4期
P. 263
1704 软件学报 2026 年第 37 卷第 4 期
例样本, 旨在从已有的代码仓库中检索出与测试给定问题报告相关的测试函数. 这些提取出的测试函数将作为检
索增强生成的内容纳入 prompt 中, 为大语言模型提供可参考的测试用例, 从而提升其生成故障复现测试用例的效
果. 该方法具体分为两个主要步骤: 首先是测试函数的抽取, 其次是基于相似度计算的测试用例样本选取, 最终选
取与问题报告相关性最高的 3 个测试函数.
在测试函数抽取阶段, 前期的准备工作与 import 语句的抽取阶段相似. 首先, 将大语言模型选择出的截取后
的测试文件路径还原为完整路径, 并根据问题报告的 base_commit 信息将克隆后的代码仓库恢复到问题报告提出
时的版本. 接下来, 根据还原后的文件路径定位到相应的测试文件, 并将该文件的全部内容读取为一个字符串. 获
得测试文件中的完整代码后, 本文使用 tree-sitter 工具对该代码字符串进行解析. 通过分析各个代码段的节点属性,
成功提取出测试文件中所有的测试函数. 这些提取的函数片段将以字符串列表的形式保存, 便于后续的相似度计
算与排序过程.
在基于相似度计算的测试用例样本选取阶段, 考虑到抽取出的测试函数与问题报告内容之间最重要的是语义
相关性, 而非单纯的字符相似性, 本文采用了稠密检索方法中的基于 embedding 的相似度计算. 具体而言, 本文对
抽取出的每个测试函数的代码字符串与问题报告标题之间计算 embedding 相似度得分. 根据这些相似度得分, 对
抽取出的测试函数进行排序, 最终选取得分最高的 3 个测试函数作为测试用例样本. 这种方法有效地确保了所选
样本在语义上的相关性, 从而为后续的故障复现测试用例生成提供了更为精准的参考.
如图 7 所示, 该例子展示了本文抽取的测试用例样本, 依然以上文 Django 仓库的问题报告为例, 提问为问题
报告的标题, 即“URLField 报错内容有误”. 在测试文件选择阶段选出的 test_urlfield.py 文件中, 将所有测试函数与
问题报告标题进行了 embedding 相似度计算, 最终得分最高的 3 个测试函数如图 7 所示. 其中, 相似度得分最高的
测试函数为 test_urlfield_clean_invalid, 该函数定义了一个 URLField 类, 并设计了多个非法 URL 列表, 以测试调
用 clean 方法时是否会输出 ValidationError. 这一测试函数恰好与问题报告标题中所表达的问题高度相关. 因此,
可以得出结论, 代码仓库中已有的测试函数往往包含与特定问题报告相关的内容, 通过有效地抽取这些测试函数
并提供给大语言模型, 能够帮助其更好地理解如何生成符合需求的故障复现测试用例代码.
图 7 测试用例样本示意图

