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

1710                                                       软件学报  2026  年第  37  卷第  4  期


                 较本文方法降低了       3%. 去除  import 语句的方法成功为     21  个问题报告生成故障复现测试用例, 占比           21%, 相较于
                 本文方法降低了      6%. 最后, 去除测试用例样本的方法仅成功为             14  个问题报告生成故障复现测试用例, 占比           14%,
                 相较于本文方法降低了        13%. 这些结果表明, 本文检索增强生成的           3  部分内容对故障复现测试用例生成均发挥了
                 积极作用, 且其中测试用例样本的贡献最大.


                                                     表 4 消融实验结果

                                                                              成功生成故障复现测试用例的
                                          成功生成故障复现测试用例的问题报告数量
                                    问题报                                           问题报告比例 (%)
                      代码仓库名
                                    告数量    –报错根   –import语句  –测试用  本文方法   –报错根    –import语句  –测试用  本文方法
                                            函数              例样本             函数             例样本
                     Django/Django    37     8        8       6     11     21.62    21.62   16.22  29.73
                    matplotlib/matplotlib  6  3       2       2      2     50.00    33.33   33.33  33.33
                     pylint-dev/pylint  1    0        0       0      0       0        0      0      0
                     pytest-dev/pytest  8    2        0       1      1     25.00      0     12.50  12.50
                       psf/requests   1      0        0       0      1       0        0      0      100
                   scikit-learn/scikit-learn  7  0    0       0      0       0        0      0      0
                    mwaskom/seaborn   1      0        0       0      0       0        0      0      0
                    sphinx-doc/sphinx  7     0        0       0      0       0        0      0      0
                      sympy/sympy     29     10      10       4     11     34.48    34.48   13.79  37.93
                      pydata/xarray   3      1        1       1      1     33.33    33.33   33.33  33.33
                         总计          100     24      21      14     27     24.00    21.00   14.00  27.00

                    此外, 本文观察到, 在某些情况下, 去除报错根函数的方法效果优于本文提出的方法. 例如, 在                          matplotlib  代码
                 仓库中, 去除报错根函数的方法成功为            3  个  GitHub  问题报告生成了故障复现测试用例, 而本文方法仅为             2  个问题
                 报告成功生成. 该结果表明, 基于         GitHub  问题报告中的错误栈信息抽取报错根函数可能会误导大语言模型, 从而
                 降低其测试用例生成的效果. 这进一步说明, GitHub            问题报告中的错误栈根函数信息可能并不总是导致问题的根
                 本原因, 反映出了     GitHub  问题报告的复杂性.
                  4.4   检索增强生成内容准确性分析       (RQ5)
                    为了进一步分析本文检索增强生成内容的准确性, 本文设计了新的评估指标, 以验证检索内容与给定问题报
                 告之间的相关性. 考虑到报错根函数是基于错误栈中的文件路径信息直接获取的, 且表                            4  中的结果显示其对测试
                 用例生成的影响有限, 因此本文将重点分析              import 语句和测试用例样本与问题报告之间的关联性. 帮助研究者更
                 好地理解这些检索内容在故障复现测试用例生成中的作用.
                    如表  1  所示, SWE-bench Lite 数据集中每个问题报告都有对应的         FAIL_TO_PASS  和  PASS_TO_PASS  测试用
                 例信息. 具体而言, FAIL_TO_PASS    测试用例在解决问题报告的补丁应用前未能通过, 但在应用后成功通过, 这些
                 测试用例用来复现问题报告并验证问题报告是否解决. 而                   PASS_TO_PASS  测试用例则是在解决问题报告的补丁
                 应用前后均能通过, 代表代码仓库中原本与问题报告相关的测试用例, 类似于回归测试. 因此, 本文认为, 在问题报
                 告提交时, 与该问题报告相关的所有测试用例都包含在这两类测试用例中.
                    FAIL_TO_PASS  和  PASS_TO_PASS  列表中的测试用例均包含测试函数名和所在测试文件的信息, 例如“test_
                 urlfield_clean_invalid (forms_tests.field_tests.test_urlfield.URLFieldTest)”表示测试函数名为  test_urlfield_clean_
                 invalid, 所在测试文件为   forms_tests.field_tests.test_urlfield.py. 因此, 为评估检索到的测试文件与给定问题报告的
                 相关性, 本文判断该测试文件是否在           FAIL_TO_PASS  或  PASS_TO_PASS  测试用例列表中. 若检索出的测试文件
                 存在于列表中, 则认为该测试文件与问题报告相关, 进一步认为从该测试文件中抽取出的                            import 语句与给定问题
                 报告相关. 同理, 若检索出的测试用例样本中有任意一个属于                  FAIL_TO_PASS  或  PASS_TO_PASS  中的测试函数,
                 则认为这些样本对生成给定问题报告的故障复现测试用例是有帮助的. 本文将检索到的测试文件在                                   FAIL_TO_
                 PASS  或  PASS_TO_PASS  测试用例列表中的问题报告数量记为           F_N, 比例记为   F_P; 将检索到的测试用例样本有
   264   265   266   267   268   269   270   271   272   273   274