Page 103 - 《软件学报》2025年第4期
P. 103
香佳宏 等: 大模型在软件缺陷检测与修复的应用发展综述 1509
(3) 基于约束的技术难以生成精确的测试断言. 该类技术根据焦点方法的前置和后置条件, 推导出由不变量表
达的程序规范, 从而自动生成断言语句以检查程序行为. 然而, 上下文信息中往往也隐藏着很多约束条件, 仅从焦
点方法直接提取约束生成高质量的断言是非常有挑战性的.
除上述技术各自面临的挑战外, 传统技术还普遍面临如下挑战: (1) 焦点代码上下文相关信息难以有效利用;
(2) 生成测试用例多样性有限; (3) 生成的断言难以捕获缺陷并可能有大量误报. 以上这些挑战都在很大程度上阻
碍了传统技术在工业界的大规模应用.
基于学习的工作应用机器学习和强化学习等技术于测试自动生成领域并达到了较为优异的效果, 其生成的测
试用例在可读性和有效性上都有明显的提升. 然而, 该类技术依然需要面对训练数据质量和数量上的挑战. 现有基
于学习的测试用例生成技术通常使用开源项目中的测试代码作为数据集对模型进行训练. 具体而言, 研究人员根
据注释或文档等相关信息提取出测试代码, 并进一步根据启发式规则进行过滤 (如断言数量 [124] 或重复数据 [125] ).
然而, 一些开源项目包含了修复缺陷的版本, 在这些版本中, 原本用于检测缺陷的测试用例已经失效 [131] , 进而导致
这些失效的测试用例成为训练数据集中的噪声, 影响模型生成测试用例和断言的性能. 此外, 在训练过程中, 基于
学习的方法也容易在有限的数据集上过拟合, 导致在真实场景下表现不佳.
后生成并执行测试用例. 如果测试用例执行失败, TESTPILOT
因此, 基于学习的技术仍然面临高度依赖训练数据的质量和数量上的挑战. 总的来说, 由于训练数据集规模不
足和过拟合等原因, 基于学习的技术并面对生成的测试用例缺乏多样性和有效性较低的关键挑战. 综上, 目前测试
用例自动生成任务仍迫切需要一种简单易用并且智能的技术, 以生成符合软件功能和开发者意图的测试用例.
4.2 基于大模型的测试用例自动生成技术
目前基于学习的测试用例自动生成技术重点在于生成断言, 并且训练数据主要集中于开发者编写的单元测
试. 部分基于学习的测试用例自动生成技术使用模型驱动生成测试用例, 然而其采用的模型在上下文理解和代码
能力方面相较 CodeX 和 ChatGPT 等大模型有较大差距. 而基于神经机器翻译的技术则面临训练语料质量和数量
不足, 以及训练过拟合等问题, 在应用范围上有局限性. 因此, 研究者进一步尝试将上下文学习能力和代码生成能
力更强的大模型应用到测试用例自动生成领域.
使用基于搜索的技术进行测试生成时, 初始随机生成的测试输入可能并没有很好地适配待测程序, 导致难以
通过针对初始测试用例进行变异生成有效的测试用例. 为解决这一问题, Lemieux 等人提出了 CodaMosa [134] , 该工
具结合了基于搜索的软件测试 (search-based software testing, SBST) 和大型语言模型, 在基于搜索的工具陷入覆盖
率停滞时, CodaMosa 应用 CodeX 模型生成覆盖程序更多行为的自动测试用例以增强基于搜索的工具, 帮助开发
人员发现并改进程序中的错误. 实验评估表明, 相对于仅采用搜索或大模型的测试用例生成技术, CodaMosa 实现
了显著的覆盖率提升, 有效地提高了测试用例生成的效率和效果. 然而, CodaMosa 输入 CodeX 模型的提示只包括
函数实现和生成测试用例的指令, 并没有更多探讨不同设置下的效果. 此外, 其生成的测试用例采用了 Mosa 格式,
作者承认这可能会导致可读性下降, 并且这些测试用例并不包含断言.
在 CodaMosa 基础上, Schäfer 等人 [135] 更加精细地探索了 CodeX 模型的不同设置条件对于测试用例生成质量
的影响, 并提出工具 TESTPILOT. 该工具利用函数签名、文档注释、测试用例示例和源代码等进行提示设计, 然
使用包含失败测试和其报错信息的特殊提示再次驱
动 CodeX 模型重新生成新的测试用例. 在实验评估中, TESTPILOT 在 25 个 npm 软件包上达到了目前最优异的语
句覆盖率效果.
如上文所介绍, 开发人员编写测试的目的之一是防止漏洞或者程序错误再次发生. Kang 等人 [22] 通过分析使
用 JUnit 的 300 个开源项目样本, 发现有 28% 的测试是为复现错误报告中的漏洞所添加的. 这表明根据错误报告
生成复现错误的测试是一种被低估但影响重大的自动生成测试的方式. 因此, 他们提出了一种名为 LIBRO 的工
具, 该工具将缺陷报告作为对大语言模型的提示, 从而生成可复现错误的测试案例, 帮助开发者有效诊断并修复错
误. 研究者在两个数据集上进行了实证分析, 发现 LIBRO 可以根据缺陷报告为 251 个缺陷 (占所有研究缺陷的
33.5%) 生成至少一个重现缺陷的测试. 此外, LIBRO 能够以 71.4% 的准确率判断其重现缺陷的尝试是否成功. 相