Page 267 - 《软件学报》2026年第4期
P. 267
1708 软件学报 2026 年第 37 卷第 4 期
本文选择了 Jimenez 等人 [8] 开源的 SWE-bench Lite 数据集. 该数据集是 SWE-bench 数据集的子集, 共包含 300 条
典型的 GitHub 问题报告数据, 这些问题报告来自 12 个热门的 Python 代码仓库, 具体的数据分布如图 1 所示. 每
条数据除了包含问题报告的基本信息, 如所在仓库、问题报告标题和问题报告描述外, 还包括与解决该问题报告
相关的重要信息, 如 patch、test_patch、FAIL_TO_PASS 和 PASS_TO_PASS 等. 这一数据集为本文的研究提供了
宝贵的基础, 帮助评估本文方法生成的测试用例有效性.
4.1.3 对比方法
为验证本文提出的基于大语言模型的故障复现测试用例生成方法的效果, 本文将其与 Kang 等人 提出的 Libro
[6]
方法在 SWE-bench Lite 数据集上进行对比. 尽管一些基于智能代理 (agent) 的研究, 如 SWE-agent、OpenDevin、
CodeR 等, 也在解决 GitHub 问题报告过程中关注了故障复现问题, 但由于这些方法本质上与 Libro 方法相似, 它
们同样依赖大语言模型和 prompt 技术来生成故障复现代码, 并且方法较为简化, 因此本文以 Libro 作为该类工作
的代表技术, 在实验中将 Libro 作为主要对比技术.
Libro 方法同样旨在解决故障复现测试用例生成任务, 但其是在 Defects4J 数据集上进行验证, 该数据集从 17
个 Java 项目中人工收集了真实的代码问题, 并且每个问题通常包含错误栈信息. 因此, 相较于 SWE-bench Lite 数
据集, Defects4J 的数据集相对较为简单. Libro 方法利用大语言模型和提示工程技术生成测试用例, 但在 prompt 构
建中使用 one-shot 技术, 提供了固定的问题报告-测试用例对, 而未提供与给定问题报告相关的上下文信息. 图 10
展示了 Libro 方法论文中的 prompt 模板示意图, 该 prompt 中仅包含问题报告的标题和描述、复现问题报告的指
令以及待补全的测试函数. 由于 Libro 方法并未开源, 本文根据其 prompt 模板, 并结合对论文的理解, 对其测试用
例生成部分进行了复现, 并将其应用于 SWE-bench Lite 数据集中, 以便与本文方法进行比较.
图 10 Libro 方法的 prompt 模板示意图
4.2 测试用例生成效果对比 (RQ3)
本文使用成功生成故障复现测试用例的问题报告比例这一指标来评估方法的有效性. 具体而言, 本文将
Libro 方法与所提出的方法应用于 SWE-bench Lite 数据集中的 300 条 GitHub 问题报告, 每个问题报告生成 5 个
故障复现测试用例. 当一个测试用例在解决给定问题报告的代码补丁应用前未通过, 而在应用后通过, 则该测试用
例被判定为故障复现测试用例. 对于每个方法生成的 5 个测试用例, 只要其中有任意一个为故障复现测试用例, 便
认为该方法成功为该问题报告生成了故障复现测试用例. 最终, 通过计算成功生成故障复现测试用例的问题报告
在 300 个问题报告中的比例, 来评估两种方法的效果.
对比实验结果如表 3 所示. 针对 SWE-bench Lite 数据集中的 300 个 GitHub 问题报告, Libro 方法仅成功为
20 个问题报告生成故障复现测试用例, 占比 6.57%; 而本文提出的方法成功为 67 个问题报告生成故障复现测试用
例, 占比提升至 22.33%. 此外, 从各个代码仓库的结果来看, Libro 仅在 3 个代码仓库的问题报告上成功生成故障
复现测试用例, 而本文方法在 9 个代码仓库的问题报告上成功生成故障复现测试用例. 在 Libro 方法结果为 0 的
9 个代码仓库中, 本文方法有 6 个仓库的结果不为 0, 且问题报告测试用例生成的平均成功比例达 23.42%. 在 Libro
方法结果不为 0 的 3 个代码仓库中, 本文方法的结果均有提升, 平均提高了 14.23%. 这些结果表明, 基于给定问题
报告检索报错根函数、import 语句和测试用例样本等内容的方法是有效的, 进一步证明了本文方法的有效性.

