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

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


                 试  (search-based testing) 利用搜索算法生成测试用例, 旨在通过智能搜索策略提升测试效率与覆盖率. 其核心思想
                 是将测试用例生成视为一个优化问题, 通过定义适应度函数                   (fitness function) 来评估测试用例的质量, 以引导搜索
                 过程. 例如, Fraser 等人  [13] 提出的  EvoSuite 工具通过遗传算法生成测试用例, 首先定义适应度函数以评估测试用例
                 质量, 然后随机生成一组初始测试用例, 接着通过选择、交叉和变异操作不断优化适应度函数, 迭代生成新的测试
                 用例, 直到达到预设的覆盖率或迭代次数. Baars 等人            [14] 提出了一种构建适应度函数的算法, 该算法将符号信息与
                 动态分析相结合, 可在尝试生成分支充分测试数据时提高基于搜索的测试的效率. 基于约束的测试                                 (constraint-
                 based testing) 通过定义特定约束条件生成测试用例, 其核心在于使用约束求解器自动生成满足约束的输入, 从而
                 确保测试用例覆盖了特定的程序行为或代码路径. 例如, Blasi 等人                 [15] 提出的  CallMeMaybe 方法使用自然语言处
                 理技术分析    Javadoc 注释, 从中识别时间约束, 并指导测试用例生成器执行遵守时间约束的方法调用序列. DeMilli
                 等人  [16] 开发的  Godzilla 工具则使用代数约束描述旨在发现特定类型故障的测试用例, 自动生成并解决约束以创建
                 单元和模块测试用例. 基于随机测试            (random-based testing) 则主要通过随机生成输入数据来测试程序行为. 这种
                 随机生成测试用例的方法通常效果不佳, 因此              Pacheco  等人  [17] 通过结合从执行测试输入中获得的反馈改进了生成
                 效果. 传统的   3  类测试用例生成方法都旨在提升测试用例的测试覆盖率, 测试覆盖率工具主要关注的是代码路径,
                 然而由于   GitHub  问题报告均来自实际软件开发场景, 往往只提供问题描述和上下文信息, 缺少必要的代码路径信
                 息, 难以用测试覆盖率来进行测试. 因此, 传统测试用例生成方法在面向                    GitHub  问题报告时存在较大的局限性.
                    随着深度学习技术的发展, 近年来许多研究在传统测试用例生成技术的基础上, 引入模型作为辅助, 取得了显
                 著效果. Dinella 等人  [18] 提出了  TOGA  方法, 这是一种基于  Transformer 的神经方法  (neural approach), 可以根据焦
                 点方法的上下文推断异常和断言测试预言. Schafer 等人             [19] 则尝试利用  API 文档的信息来增强模型对代码的理解,
                 通过在模型输入中添加额外的文档信息, 从而生成更有效的单元测试. 上述方法利用深度学习技术, 将模型在大量
                 代码数据上进行训练, 使模型具备了从上下文推断潜在异常和测试预言的能力, 在一定程度上克服了传统测试用
                 例生成方法中对特征依赖较强、难以泛化的问题. 随着大语言模型的出现, Yuan                       等人  [20] 采用大语言模型技术, 通
                 过迭代反馈生成测试函数, 不断将报错信息反馈给模型, 直到没有错误反馈或达到迭代次数上限. 然而, 由于                              GitHub
                 问题报告没有明确的内容规范要求, 其通常缺乏明确的报错信息或                      API 文档, 无法直接给模型提供额外上下文信
                 息. 此外, 在解决   GitHub  问题报告时, 模型需要同时理解和协调多个函数、类甚至文件的更改, 并处理极长的上下
                 文, 推理难度远远超出模型的能力范围, 因此这些方法在实际应用中并不十分适用.
                    针对故障复现测试用例生成的问题, 已有一些研究提出了相应的解决方案. Soltani 等人                       [3] 提出了基于搜索的
                 EvoCrash  方法, 用于生成复现崩溃的测试用例. 该方法通过一个适应度函数引导搜索过程, 适应度函数结合了                             3
                 种启发式方法: 代码覆盖率、崩溃覆盖率以及错误栈相似度. 此外, EvoCrash                  还探索了多目标优化方法, 以提高生
                 成测试用例的多样性. Nayrolles 等人     [4] 提出的  JCHARMING  方法结合崩溃追踪和模型检查, 旨在通过自动化手段
                 复现软件崩溃. 该方法首先分析崩溃堆栈数据, 识别与崩溃相关的程序状态, 并利用模型检查技术进一步确认哪些
                 程序语句是复现崩溃所必需的, 进而复现程序崩溃. Chen               等人  [5] 则提出了一种基于收集到的崩溃栈追踪的崩溃复
                 现框架, 该框架结合了高效的逆向符号执行和创新的序列方法组合技术, 生成能够复现原始崩溃的单元测试用例,
                 并且避免了增加额外的运行时开销. 在该框架中, 逆向符号执行用于分析崩溃栈, 识别复现崩溃所需的关键执行路
                 径, 而序列方法组合则帮助生成准确的单元测试用例. 上述研究均聚焦于程序崩溃的复现技术, 其方法都依赖于崩
                 溃栈追踪信息, 然而      GitHub  问题报告中并不直接提供此类信息, 因此这些方法不适用于解决                   GitHub  问题报告中
                 的故障复现测试用例生成问题.
                                                                               [7]
                    为解决这一问题, Kang     等人  [6] 提出的  Libro  方法使用大语言模型和    few-shot 技术生成故障复现测试用例. 该
                 方法通过在    prompt 中提供固定的问题描述和对应的故障复现测试用例, 帮助大语言模型理解如何生成测试用例.
                 然而, Libro  方法仅为大语言模型提供简单且固定的输入输出样本, 缺乏与                  GitHub  问题报告相关的上下文信息, 未
                 能从根本上帮助模型更好地理解问题报告内容. 此外, 现有一些基于智能代理                         (agent) 的研究, 如  SWE-agent  [10] 、
                 OpenDevin [21] 、CodeR [22] 等, 也在解决  GitHub  问题报告的过程中关注了故障复现问题. 这些方法均依赖于大语言
                 模型和   prompt 技术, 通过向智能代理提供       GitHub  问题报告的问题描述, 要求其生成复现问题报告的代码, 进而帮
   248   249   250   251   252   253   254   255   256   257   258