基于大模型的测试断言生成技术
基于大模型的测试断言生成技术房春荣 南京大学演讲嘉宾房春荣南京大学副教授博士,南京大学软件学院准聘副教授、特聘研究员,博士生导师,紫金学者,CCF高级会员,系统软件/容错计算专委会委员,主要从事智能软件工程研究(BigCode &AITesting)。主持国家自然科学基金项目3项,国家重点研发项目骨干2项,教育部产学合作协同育人项目3项,横向科研项目若干。在CCF-A会议/期刊发表论文40余篇,获得国际会议最佳论文1项,申请发明专利10余项,部分成果在华为、百度等知名企业应用。曾担任AST、AIST等国际会议程序委员会共同主席,多次担任国际顶级会议程序委员会委员及顶级期刊审稿人,并多次获得杰出审稿人。参编多项软件工程和工业APP相关国家、省、团体标准。获2022年国家级教学成果奖,CCF TCFTC2021年软件测试青年创新奖,2020国家级一流本科课程、2018国家精品在线开放课程《软件测试》。目 录CONTENTS1. 研究背景2. 单元测试生成和修复3. 单元测试的断言问题①初步探索:面向单元测试场景的大模型断言生成能力②检索角度:基于混合检索增强的单元测试断言生成③训练角度:基于检索生成协同增强的单元测试断言生成4. 应用验证5. 总结与展望研究背景大语言模型和单元测试基础PART 01研究背景-单元测试与测试断言单元测试的例子测试前缀测试断言功能实现预期功能单元测试:一种被广泛接受的甚至是强制性的开发实践断言问题:预期的行为或测试断言应该是什么研究背景-单元测试生成方法存在的主要问题大模型生成单元测试的流程图n 以大模型会话迭代为主要框架的代表性方法充分利用了大模型的语义理解和代码生成能力,n 以 CODAMOSA 为代表的算法,计算资源的开销主要取决于选取的传统测试方法,大模型作为辅助工具来改进传统测试方法研究背景-单元测试生成方法存在的主要问题n 生成无效测试用例:Ø 大型语言模型(LLMs)可能在上下文不足的情况下生成无效的测试用例,导致编译错误。这意味着生成的测试用例无法成功运行,影响测试过程的有效性。n 缺乏测试和覆盖反馈:Ø 缺乏详细的测试反馈和覆盖率信息可能导致生成的测试用例在运行时出现错误,并且覆盖率低。这意味着生成的测试用例可能未能充分测试目标代码,从而降低了测试的全面性和有效性。n 重复抑制问题:Ø 现有方法中,LLMs可能会陷入自我修复或再生成尝试的重复循环,导致生成过程低效。即模型在面对生成错误时,可能会不断尝试修复同样的错误而无法前进,从而浪费计算资源和时间。研究背景-单元测试生成方法存在的主要问题n 基于LLM的单元测试生成的局限性:ØEvoSuite缺乏深入理解源代码的能力,因此复杂的前提条件缩小了基于搜索的测试生成方法的适用范围。Ø尽管LLM在理解语义信息和推理生成能力方面表现出色,但生成的测试用例中不可避免地存在编译错误和运行时错误。如果这些错误能够得到修复,LLM生成的测试用例质量将大大提高。研究背景-自动断言生成方法存在的主要问题n 手动编写单元测试的劳动密集性:Ø 编写测试断言通常非常耗时且劳动密集,需要测试专家手动插入测试输入(如前缀)和测试输出(如断言)。n 现有方法的局限性:Ø 基于深度学习(DL)的方法通常需要大量的训练数据,并且可能在处理特定任务时表现不佳。Ø 依赖于从现有数据中检索相关的测试断言,可能会受到词汇匹配的限制,难以生成语义上有意义的断言。Ø 许多现有方法没有采用联合训练策略,导致检索器和生成器之间缺乏协同优化,无法充分利用各自的优势来生成更准确的断言。Ø 许多现有方法在有限的训练数据上表现不佳,难以生成高质量的断言。Ø 现有使用LLM进行单元测试生成的技术的有效性并没有系统的比较研究。单元测试生成和修复PART 02单元测试生成-基于提示引导和动态反馈的大模型测试用例生成和修复n 生成阶段:是TestART方法的核心步骤,旨在利用大型语言模型(LLM)生成初始的单元测试用例。通过这一阶段,TestART可以自动化生成测试用例,从而减少人工测试的工作量,并提高代码覆盖率。生成阶段的成功执行依赖于有效的上下文预处理和模型提示设计,以充分发挥LLM的潜力。n 修复阶段:修复部分介绍了一种通过联合训练来改进检索增强的深度断言生成方法(AG-RAG),AG-RAG结合外部代码库和预训练语言模型,解决了以前方法中的技术局限,在所有基准和指标上显著优于现有的断言生成方法,大幅提高了准确性和生成唯一断言的能力。单元测试生成-基于提示引导和动态反馈的大模型测试用例生成和修复1、 被测代码预处理n 代码清理与压缩:在生成阶段之前,源代码需要经过预处理,以确保LLM聚焦于代码的关键部分。清理步骤:•去除注释: 移除所有代码注释,以防止注释内容与代码逻辑的不一致导致LLM产生幻觉。•删除多余空行:精简代码结构,提升模型处理效率。上下文压缩:•仅保留焦点方法的完整方法体,其他非关键方法仅保留其方法签名。•保留必要的类变量和常量以维持代码的结构和功能完整性。n 变量和方法信息提取:•提取所需的变量和方法信息,包括方法签名、起始和结束行号、变量名和数据类型。•提取的信息用于构建模型提示,指导生成阶段的测试用例设计。n 生成阶段步骤单元测试生成-基于提示引导和动态反馈的大模型测试用例生成和修复2、调用大模型生成初始测试用例n 提示设计与模型调用:•设计特定的提示以激发LLM生成测试用例的能力。•提示内容包括代码上下文、预期行为描述以及已知测试条件。•利用OpenAI的ChatGPT-3.5,通过API接口生成初始测试用例。n 生成的初始测试用例( 𝑇! ):•ChatGPT-3.5生成的初始测试用例被称为 𝑇! 。•𝑇! 包含对目标代码的多样化测试,包括基本功能测试和边界条件测试。3、 处理生成的初始测试用例n 初步检查和修正:•对生成的测试用例进行初步检查,识别并标记编译错误和语法错误。•修正简单的语法问题,确保测试用例在编译器中通过基础验证。n 生成结果记录与分析:•记录生成测试用例的数量、类型和初步结果。•分析生成的测试用例覆盖范围及其在真实场景下的有效性。n 生成阶段步骤单元测试生成-基于提示引导和动态反馈的大模型测试用例生成和修复4、准备进入修复阶段n 错误标记与修复策略准备:•标记测试用例中的编译和运行时错误,准备进入修复阶段进行详细修复。•应用模板修复策略,自动修复简单错误,减少修复阶段的工作量。n 生成-修复协同进化的准备:•在生成阶段结束时,确保所有初步生成的测试用例已准备好进入修复阶段。•修复后的代码作为新一轮生成的基础,进行迭代优化。ü 利用提示注入优化生成n 提示注入策略:•使用修复后的测试用例作为提示输入,防止LLM在后续生成中出现相同错误。•提示注入能有效减少模型的重复抑制问题,提高生成用例质量。n 提示优化的效果:•修复后的提示能够引导LLM在生成新用例时避免已知错误,并优化测试覆盖率。•实验证明,经过提示优化的生成阶段能显著提高生成用例的通过率和覆盖率。n 生成阶段步骤单元测试生成-基于提示引导和动态反馈的大模型测试用例生成和修复2、错误代码定位与信息提取n通过分析 Maven 编译时的日志来定位问题。日志包含了详
[中智凯灵(北京)科技]:基于大模型的测试断言生成技术,点击即可下载。报告格式为PDF,大小9.65M,页数79页,欢迎下载。
