用大模型帮助程序员发现bug,中科院分析了102篇论文,总结了这些解决方案
用大模型帮助程序员发现bug,中科院分析了102篇论文,总结了这些解决方案
中科院开始“找bug”,一口气总结出N个选项!
法宝就是大模型。
由于其出色的自然语言理解、推理等能力,大型模型已被应用于各种场景,并取得了前所未有的成果。
同样,软件测试领域也受益于其强大的能力,可以帮助生成真实且多样化的测试输入,模拟各种异常,加速缺陷的发现,提高测试效率,并潜在地提高软件质量。
来自中国科学院软件研究所、澳大利亚大学、加拿大约克大学的研究团队收集了截至2023年10月30日发表的102篇相关论文,从软件测试和大规模的角度进行了综合分析。这是对大模型在软件测试领域的应用的全面回顾。
(论文地址见文末)
研究发现概览图是这样的:
下面我们就来看看详细内容。
从软件测试的角度来看
首先,研究人员从软件测试的角度进行分析,并根据测试任务整理收集到的研究工作。
如下图所示,大模型的应用主要集中在软件测试生命周期的后期,用于测试用例准备(包括单元测试用例生成、测试预测生成、系统级测试输入生成) )、测试报告分析、程序调试和修复任务。 然而,目前还没有使用大型语言模型来完成测试生命周期早期任务(例如测试需求、测试计划等)的相关工作。
此外,研究人员还对大型模型在各种软件测试任务中的应用进行了详细分析。
以单元测试用例生成为例,单元测试用例生成任务主要涉及为独立软件或组件单元编写测试用例,以保证其正确性。 基于搜索、约束或随机化的传统生成技术存在测试用例覆盖率弱或可读性差的问题。
引入大模型后,与传统方法相比,大模型不仅可以更好地理解领域知识以生成更准确的测试用例,而且可以理解有关软件项目和代码上下文的信息,从而生成更全面的测试用例。
对于系统级的测试输入,模糊测试作为一种常用技术,主要围绕生成无效的、意外的或随机的测试输入来达到测试的目的。 研究人员还详细分析了大型模型如何改进传统的模糊测试技术。
例如,一些研究提出了通用的模糊测试框架等,一些研究侧重于基于大模型模糊测试技术的具体软件开发,包括深度学习库、编译器、求解器、移动应用、信息物理系统等。
这些研究的重点之一是生成不同的测试输入以实现更高的覆盖率,通常是将突变技术与基于大型模型的生成相结合; 另一个重点是生成可以更早触发错误的测试输入。 对于测试输入,常见的做法是收集历史上触发错误的程序来微调大型模型或在查询大型模型时将其用作演示程序。
论文对各项研究的技术思路进行了较为详细的介绍和比较。
从大模型角度来看
随后,研究人员从大模型的角度分析了软件测试任务中使用的大模型,并进一步介绍了如何使大模型适应测试任务,包括及时的工程技术、大模型的输入以及与传统测试技术的融合。 和这个结合。
从选用的大模型来看,如下图所示,最常用的大模型前三名分别是Codex和. 后两个是专门在多种编程语言的代码语料库上训练的大型模型。 它们可以根据自然语言描述生成完整的代码片段,因此非常适合涉及源代码的测试任务,例如测试用例生成和缺陷修复。
此外,虽然已有 14 项研究使用 GPT-4(排名第四),但作为多模态大模型,研究人员表示尚未发现相关研究探索其图像相关功能在软件测试任务中的使用(例如UI截图、编程演示),这值得在未来的研究中探索。
就如何调整大型模型的行为来胜任软件测试任务而言,主要有两种技术手段:预训练或微调和即时工程。
如下图所示,38项研究使用预训练或微调模式来微调大型模型的行为,而64项研究则使用提示工程来指导大型模型达到期望的结果。
提示:工程技术的主要优势在于无需更新模型权重即可使大模型适应特定领域和任务,并加强对大模型的理解和推理能力。 目前使用的技术包括零样本或少样本学习、自洽和思考。 连锁、自动提醒等技术。
此外,研究人员发现,35项研究使用了大型模型,并结合了传统的测试技术,包括突变测试、差异测试、程序分析、统计分析等,以实现更好的测试有效性和覆盖率。
尽管大型模型在各种任务中显示出巨大的潜力,但仍然存在一些局限性,例如难以理解和处理复杂的程序结构。
因此,大型模型与其他技术相结合,可以最大限度地发挥其优势,避免劣势,从而在特定情况下取得更好的结果,例如生成更多样化、更复杂的代码,更好地模拟现实场景。
发现大型模型的错误有哪些挑战?
近两年,利用大模型进行软件测试的成功实践有很多。 然而,研究人员指出,它仍处于发展的早期阶段,还有许多挑战和悬而未决的问题需要探索。
挑战一:实现高覆盖率的挑战
探索被测软件的多样化行为以实现高覆盖率始终是软件测试的重要焦点。 直接实现大型模型所需的多样性仍然非常具有挑战性。 例如,在单元测试用例生成中,SF110数据集上的行覆盖率仅为2%,分支覆盖率仅为1%。
在系统测试输入生成方面,对于深度学习库的模糊测试,API覆盖率为66%(2215/3316)。 现有的工作通常将突变测试与大型模型结合起来,以生成更多样化的输出。
其他潜在的研究方向包括利用与测试相关的数据来训练或微调专门的大型模型,这些模型可以理解测试要求并自动生成不同的输出。
挑战2:检验预言的挑战
测试预言机问题一直是各种测试应用面临的挑战。 现有工作中的常见方法是将其转换为更易于访问的形式,通常通过差异测试或仅关注易于自动识别的测试预言(例如崩溃错误)。 ,虽然取得了不错的效果,但是只适合少数情况。
探索使用大型模型来解决其他类型的测试预言问题将是有价值的。
例如,转换测试也是缓解测试预测问题的常用技术。 它可以探索基于人机交互或领域知识的转换关系的自动生成,也可以探索大型模型基于转换关系自动生成测试用例,覆盖各种输入。 此外,像 GPT-4 这样的大型多模态模型还提供了检测用户界面相关缺陷并协助得出测试预测的可能性。
挑战三:准确评估绩效的挑战
△
缺乏基准数据集以及基于大型模型的技术潜在的数据泄漏问题给进行严格和全面的性能评估带来了挑战。 通过检查用于训练大型模型的数据源,研究人员发现基准数据集中使用的四个代码库都包含在两者中,并且包含整个代码库。
因此,大型模型在预训练时看到了现有的程序修复基准数据集,存在严重的数据泄漏问题。 因此,需要建立更专业、更多样化的基准数据集,并采取措施防止数据泄露。
挑战 4:实际项目中使用的挑战
出于对数据隐私的担忧,大多数软件组织在考虑实际应用时倾向于避免商业大型模型,而更愿意采用开源大型模型并使用组织特定的数据进行训练或微调。
此外,由于计算能力的限制或对能源消耗的担忧,一些公司也倾向于采用中等规模的模型。 在这种现实条件下,实现与现有研究工作中报告的类似性能非常具有挑战性。 例如,在广泛使用的数据集中,40 个错误中的 39 个可以自动修复,40 个 Java bug 中的 34 个可以自动修复。
然而,当涉及到从 Stack 收集的深度学习程序(代表实际的编码实践)时,72 个错误中只有 16 个被自动修复。 如何更加关注实际需求,开发相应的技术,才能更有利于技术落地和实际应用。
大型模型也带来研究机会
使用大型模型进行软件测试也带来了许多研究机会,这对于软件测试领域的发展大有裨益。
机会 1:利用大型模型进行更多样化的软件测试任务和阶段
在测试任务的早期阶段,大型模型尚未得到有效利用。 主要原因有两个:一是早期测试任务的主观性需要专家评估; 其次,前期开放数据资源的缺乏限制了大模型的性能。
另外,如下图所示,虽然大模型在单元测试和系统测试中被广泛使用,但在集成测试和验收测试中使用相对较少。 总之,如何充分利用大模型来进行更加多样化的软件测试任务和测试阶段是一个值得深入研究的新方向。 例如,在验收测试方面,大型模型可以与人类测试人员配合,自动生成测试用例并评估测试覆盖率。
机会 2:将大型模型应用于更广泛的测试类型和软件
一方面,虽然大模型在功能测试中广泛使用,但在性能测试、可用性测试等其他方面使用较少。 这可能是因为已经有一些专门的、令人满意的模型和工具用于这些测试。
然而,将大型模型与这些工具相结合仍然是一个潜在的研究方向,例如使用大型模型集成性能测试工具并模拟真实用户行为以生成不同类型的工作负载。
一方面,如下图所示,已经有研究成功地将大型模型应用于各类软件测试中,例如移动应用、深度学习库、自动驾驶系统等。现有技术不仅可以可以迁移到其他类型的软件,但也可以根据某类软件的特点开发针对性的技术。
机遇三:整合先进的快速工程技术
现有的研究尚未充分挖掘大型模型的潜力,如下图所示,仅使用了五种最常见的提示工程技术。 未来的研究应探索更先进的提示工程技术(思维树、多模态思维链等),以更充分地利用或增强大模型的理解和推理能力。
机遇四:与传统技术结合
目前对于大型模型解决软件测试问题的能力还没有明确的共识。 一些研究将大型模型与传统软件测试技术相结合,取得了良好的效果。 这可能意味着大型模型并不是解决软件测试问题的唯一方法。 灵丹妙药。
考虑到已经有很多成熟的软件工程相关技术和工具,我们可以探索大模型和传统技术的结合(比如现有研究中没有探索过的形式化验证),探索其他更先进的结合方法,并与工具集成更好地探索现有工具的潜力。
论文 Arxiv 链接: 链接:
本文来自微信公众号“量子比特”(ID:),作者:中科院王俊杰团队,36氪授权发布。