Page 268 - 《软件学报》2026年第4期
P. 268
汪莹 等: 基于大语言模型的故障复现测试用例生成方法 1709
表 3 本文方法与 Libro 方法的故障复现测试用例生成评估指标对比
成功生成故障复现测试用例 成功生成故障复现测试用例
代码仓库名 问题报告数量 的问题报告数量 的问题报告比例 (%)
Libro 本文方法 Libro 本文方法
astropy/astropy 6 0 1 0 16.67
Django/Django 114 11 22 9.65 19.30
pallets/Flask 3 0 0 0 0
matplotlib/matplotlib 23 8 11 34.78 47.83
pylint-dev/pylint 6 0 1 0 16.67
pytest-dev/pytest 17 0 3 0 17.65
psf/requests 6 0 2 0 33.33
scikit-learn/scikit-learn 23 0 0 0 0
mwaskom/seaborn 4 0 1 0 25.00
sphinx-doc/sphinx 16 0 0 0 0
sympy/sympy 77 0 24 0 31.17
pydata/xarray 5 1 2 20.00 40.00
总计 300 20 67 6.57 22.33
此外, 针对本文方法成功生成故障复现测试用例的问题报告数量为 0 的 3 个代码仓库, 本文对其问题报告实
例进行了深入的分析, 发现本质原因是代码仓库的领域存在差异性以及问题报告较为复杂. 以下是对 3 个生成成
功率为 0 的代码仓库的详细分析: (1) Flask 是一个基于 Python 的轻量级 Web 框架, 其问题报告中通常涉及框架底
层机制、请求处理流程、路由解析等较为隐蔽的框架知识. 由于大语言模型在这类框架知识方面的积累有限, 往
往难以准确理解问题报告的上下文及相关代码逻辑, 从而导致故障复现测试用例的生成效果不佳. (2) scikit-learn
是一个基于 Python 的机器学习库, 包含较多的机器学习算法和工具, 问题报告中往往涉及模型参数调整、算法实
现细节、性能优化等难度较高的问题, 这些问题通常需要深入理解算法原理和模型行为. 由于大语言模型在处理
复杂数学推理和特定算法实现方面的能力有限, 因此在生成故障复现测试用例时, 难以准确捕获这些高级问题的
上下文和逻辑关系, 不能正确生成故障复现测试用例. (3) sphinx 是一个基于 Python 的文档生成工具, 通常用于生
成 API 文档、技术手册、项目文档等. 其问题报告通常涉及对文件的读写操作, 且代码中往往包含与文件系统相
关的真实路径信息. 由于大语言模型缺乏本地的环境上下文, 无法访问或模拟真实的文件系统环境, 因此在处理与
文件读写相关的任务时, 模型难以准确理解路径、文件内容及构建流程, 因此生成的故障复现测试用例往往不够
准确或无法有效执行.
综上所述, 不同领域和复杂度的代码仓库会显著影响大语言模型生成故障复现测试用例的效果. 例如, 在本文
的实验中, 效果最差的代码仓库故障复现测试用例生成成功率为 0, 而最高可达 47.83%. 其中, matplotlib 仓库的效
果最好, 因为其问题报告相对较为简单, 功能模块独立, 大语言模型更擅长处理这类上下文直接、逻辑清晰的问题
报告, 因此生成效果较优. 然而, 对于复杂框架、算法库或涉及环境上下文的问题报告, 大语言模型仍面临较大的挑
战. 这也反映出, 在仓库级别的故障复现测试用例生成任务中, 现有方法尚未完全解决模型理解复杂代码上下文的
难题, 未来的研究仍需进一步探索更有效的上下文建模和生成策略, 以提升模型在不同领域和复杂任务中的适用性.
4.3 消融实验 (RQ4)
本文在使用检索增强生成策略时共检索了 3 部分内容, 包括报错根函数、import 语句和测试用例样本. 为了探
究各个内容对实验结果的影响, 本文设计了消融实验. 在该实验中, 本文依次将每个检索的内容去除, 以观察不
同情况下的效果. 具体而言, 本文将去除报错根函数后的方法称为“–报错根函数”, 去除 import 语句后的方法称为
“–import 语句”, 去除测试用例样本后的方法称为“–测试用例样本”. 为进行消融实验, 本文在 SWE-bench Lite 数据
集中随机抽取了 100 条数据进行测试.
消融实验结果如表 4 所示. 在随机抽取的 100 个 GitHub 问题报告中, 本文方法成功为 27 个问题报告生成故
障复现测试用例, 占比 27%; 而去除报错根函数的方法成功生成 24 个问题报告的故障复现测试用例, 占比 24%,

