当前位置: 首页 > 专利查询>浙江大学专利>正文

基于对话式大语言模型的高可靠单元测试自动生成方法及装置制造方法及图纸

技术编号:39322247 阅读:27 留言:0更新日期:2023-11-12 16:02
本发明专利技术提出了一种基于对话式大语言模型的高可靠单元测试自动生成方法及装置。首先,对项目进行解析和分析提取出上下文信息,然后判断待测方法测试必要性并根据测试目的划分生成不同的测试方向列表。在生成和修复初始测试用例之后,对通过的测试用例进行输入数据搜索,完善测试输入数据。随后,对所有测试用例进行变异测试,对失败的突变重新生成测试用例以提升断言质量。最后,对成功的测试用例进行缩减和合并,以避免重复覆盖。本发明专利技术在覆盖率、测试数据完整性、断言质量等方面优于现有方法,且在不同规模和领域的项目上表现稳定。生成的测试用例在可读性、可理解性、可维护性、测试输入数据完整性、断言质量、体积上具有显著优势。体积上具有显著优势。体积上具有显著优势。

【技术实现步骤摘要】
基于对话式大语言模型的高可靠单元测试自动生成方法及装置


[0001]本专利技术属于单元测试自动生成
,具体涉及基于对话式大语言模型的高可靠单元测试自动生成方法及装置。

技术介绍

[0002]随着当今的软件规模越来越大、结构越来越复杂,对软件质量的要求也越来越高。即便是微小的缺陷,也足以使企业蒙受巨大的损失。因此,软件测试作为软件交付的最后一道环节变得越来越重要。在软件测试金字塔中,单元测试作为最大、最基本的组成部分,是整个测试流程中最重要的一个环节。但是,单元测试用例的编写需要耗费大量的时间和精力,因此通常被开发者们所忽略。自动生成单元测试用例技术的出现,就致力于解决这一问题。所谓单元测试用例自动生成,是指自动地生成一组单元测试用例,以覆盖尽可能多的代码路径和代码逻辑,以确保软件单元的正确性和稳定性。采用这种技术生成的单元测试用例,可以提高测试覆盖率,减少手动编写测试用例的工作量,并且可以更早地发现和修复软件中的错误和缺陷。
[0003]目前,现有的单元测试用例生成方法可以分为三类:基于传统程序分析的方法、基于预训练模型的方法、基于对话式大语言模型的方法。基于传统程序分析的方法通常使用变异测试、随机测试、符号执行等技术来生成单元测试用例;基于预训练模型的方法则使用大规模英文和代码语料库训练预训练模型,并将单元测试用例的生成任务定义为翻译任务,从待测代码直接翻译成测试用例;基于对话式大语言模型的方法通过将待测方法的上下文信息输入预设好的提示模版生成提示,然后通过对话的方式来让大语言模型生成针对待测方法的单元测试。然而,这些方法存在以下尚未解决的技术问题:
[0004]1.基于传统程序分析的方法生成的单元测试用例其变量名和函数名不具有任何语义,只关注如何实现更高的覆盖率,具有可读性差、测试意图不明显等特点,导致了它们难以被开发人员理解和维护。
[0005]2.基于预训练模型的方法生成的单元测试用例,在可读性上有一定的优势,但目标方法的覆盖率通常比较低,也即生成的单元测试用例中成功调用目标方法的比例较低。另一方面,成功的单元测试用例的比例也很低,但其中相当一部分比例的测试用例可以通过简单的步骤被修复,而预训练模型不具备交互能力,因而只能够多次生成来弥补这一缺陷。导致生成的测试用例通常在目标方法的覆盖率上不够理想。
[0006]3.现有的基于对话式大语言模型的方法可靠性不高,通常会存在重复生成、测试输入数据覆盖不全面、断言质量无法保证、生成单元测试用例成功率低的问题。通过多次重复地利用对话式大语言模型对同一个待测方法生成测试可能会出现重复覆盖、搜索不彻底、多次生成的测试相似等问题,无法从根本上保证单元测试的质量。

技术实现思路

[0007]基于上述背景,本专利技术提出了一种高可靠性的基于对话式大语言模型的单元测试自动生成方法,能够实现解析抽象语法树获取类级别的上下文信息,通过对待测方法进行代码可达分析获取方法级别的上下文信息,随后对待测方法进行测试必要性判断,然后根据不同的测试目的划分不同的测试方向,根据不同的测试方向生成初始测试用例,并尝试修复发生错误的测试用例。随后暴露出成功的测试用例的基本数据类型,然后进行测试输入数据的搜索,以尽可能提高测试输入数据覆盖率。之后对已有的测试用例进行变异测试,并针对失败的测试用例进行重新生成,以尽可能提高断言质量。最后,对所有成功的测试用例组成的测试套件进行缩减,避免生成重复覆盖的测试用例。
[0008]本专利技术的目的是通过以下技术方案实现的:
[0009]根据本说明书的第一方面,提供一种基于对话式大语言模型的高可靠单元测试自动生成方法,包括以下步骤:
[0010]S1,对待测项目进行解析,提取出对象文件,并对对象文件进行解析,从类级别的上下文信息中提取出待测方法列表,针对每个待测方法进行代码可达分析,获取方法级别的上下文信息,包括每个待测方法所使用的依赖类、字段、调用方法;
[0011]S2,针对每个待测方法,使用对话式大语言模型进行测试必要性判断,如果判断待测方法有测试必要,则会对测试目的进行划分,获取测试方向列表;
[0012]S3,从测试方向列表中的一个测试方向出发,根据待测方法的代码可达分析结果,使用动态上下文生成技术,在最大提示长度限制下,生成包含尽可能多的待测方法上下文的提示,并将该提示输入对话式大语言模型中,获得包含初始测试用例的回答;
[0013]S4,从包含初始测试用例的回答中提取出初始测试用例,对初始测试用例进行语法验证,编译并执行该测试用例,如果在此过程中发生了错误,则尝试利用启发式的方法和/或对话式大语言模型修复该错误;
[0014]S5,针对每个成功的测试用例,首先将测试用例中基本数据类型字段暴露出来,再对测试输入数据的空间进行搜索;
[0015]S6,针对所有生成的测试用例,采用变异测试的方式对测试用例的断言质量进行验证;针对没有成功解决的突变,将突变信息融入一个新的提示,利用对话式大语言模型再次生成新的测试用例,直到解决突变或达到最大尝试次数;
[0016]S7,对所有成功生成的测试用例组成的测试套件进行最小化,以保证套件中的测试用例在测试目的、覆盖情况、突变解决情况上不会重复。
[0017]进一步地,S1具体为:
[0018]S1.1,遍历整个待测项目,提取出对象文件,并对对象文件进行解析,使用解析器将对象文件解析成抽象语法树AST的形式;
[0019]S1.2,从抽象语法树的根节点出发,遍历整个抽象语法树,从抽象语法树中提取出类级别的上下文信息,包括包声明语句、引入的外部依赖、类签名、类构造函数、类字段、获取器和设置器的方法签名、以及待测方法列表;
[0020]S1.3,针对每个待测方法进行代码可达分析,获取方法级别的上下文信息,包括方法体、方法的修饰符、方法是否使用到了字段、方法是否使用到了获取器和设置器、方法所使用的依赖类、调用方法的信息。
[0021]进一步地,S2具体为:
[0022]S2.1,针对每个待测方法,将其渲染进一个包含有测试必要性判断和测试目的划分的提示模版中,输入对话式大语言模型,并指定回答格式,通过正则表达式根据回答内容判断测试必要性;
[0023]S2.2,如果对话式大语言模型判断待测方法有测试必要性时,则根据回答内容获取通过测试目的划分得到的测试方向列表。
[0024]进一步地,S3具体为:
[0025]S3.1,根据一个待测方向,以及待测方法所在类的关键信息、待测方法的可达代码块,在确保不超出预设的最大提示长度的情况下,尽可能提供更多的待测方法上下文,渲染成提示;具体为:
[0026]尝试生成最小上下文,在最小上下文中必须包含方法体、所在类的签名、构造函数的签名、可达字段以及相应的获取器和设置器的签名;如果最小上下文的长度大于预设的最大提示长度,则会取消此次生成测试用例的尝试;
[0027]根据待测方法是否依赖于外部类来动态添加更多的待测方法上下文;如果本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于对话式大语言模型的高可靠单元测试自动生成方法,其特征在于,包括以下步骤:S1,对待测项目进行解析,提取出对象文件,并对对象文件进行解析,从类级别的上下文信息中提取出待测方法列表,针对每个待测方法进行代码可达分析,获取方法级别的上下文信息,包括每个待测方法所使用的依赖类、字段、调用方法;S2,针对每个待测方法,使用对话式大语言模型进行测试必要性判断,如果判断待测方法有测试必要,则会对测试目的进行划分,获取测试方向列表;S3,从测试方向列表中的一个测试方向出发,根据待测方法的代码可达分析结果,使用动态上下文生成技术,在最大提示长度限制下,生成包含尽可能多的待测方法上下文的提示,并将该提示输入对话式大语言模型中,获得包含初始测试用例的回答;S4,从包含初始测试用例的回答中提取出初始测试用例,对初始测试用例进行语法验证,编译并执行该测试用例,如果在此过程中发生了错误,则尝试利用启发式的方法和/或对话式大语言模型修复该错误;S5,针对每个成功的测试用例,首先将测试用例中基本数据类型字段暴露出来,再对测试输入数据的空间进行搜索;S6,针对所有生成的测试用例,采用变异测试的方式对测试用例的断言质量进行验证;针对没有成功解决的突变,将突变信息融入一个新的提示,利用对话式大语言模型再次生成新的测试用例,直到解决突变或达到最大尝试次数;S7,对所有成功生成的测试用例组成的测试套件进行最小化,以保证套件中的测试用例在测试目的、覆盖情况、突变解决情况上不会重复。2.根据权利要求1所述的基于对话式大语言模型的高可靠单元测试自动生成方法,其特征在于,S1具体为:S1.1,遍历整个待测项目,提取出对象文件,并对对象文件进行解析,使用解析器将对象文件解析成抽象语法树AST的形式;S1.2,从抽象语法树的根节点出发,遍历整个抽象语法树,从抽象语法树中提取出类级别的上下文信息,包括包声明语句、引入的外部依赖、类签名、类构造函数、类字段、获取器和设置器的方法签名、以及待测方法列表;S1.3,针对每个待测方法进行代码可达分析,获取方法级别的上下文信息,包括方法体、方法的修饰符、方法是否使用到了字段、方法是否使用到了获取器和设置器、方法所使用的依赖类、调用方法的信息。3.根据权利要求1所述的基于对话式大语言模型的高可靠单元测试自动生成方法,其特征在于,S2具体为:S2.1,针对每个待测方法,将其渲染进一个包含有测试必要性判断和测试目的划分的提示模版中,输入对话式大语言模型,并指定回答格式,通过正则表达式根据回答内容判断测试必要性;S2.2,如果对话式大语言模型判断待测方法有测试必要性时,则根据回答内容获取通过测试目的划分得到的测试方向列表。4.根据权利要求1所述的基于对话式大语言模型的高可靠单元测试自动生成方法,其特征在于,S3具体为:
S3.1,根据一个待测方向,以及待测方法所在类的关键信息、待测方法的可达代码块,在确保不超出预设的最大提示长度的情况下,尽可能提供更多的待测方法上下文,渲染成提示;具体为:尝试生成最小上下文,在最小上下文中必须包含方法体、所在类的签名、构造函数的签名、可达字段以及相应的获取器和设置器的签名;如果最小上下文的长度大于预设的最大提示长度,则会取消此次生成测试用例的尝试;根据待测方法是否依赖于外部类来动态添加更多的待测方法上下文;如果待测方法依赖于外部类,则尝试在上下文信息中添加该外部类以及被调用方法的签名,添加信息后会进行提示生成,确保提示的长度小于预设的最大提示长度;如果待测方法没有外部依赖,则尝试在上下文信息中添加待测方法所在类中被调用方法的签名,如果仍然未超出预设的最大提示长度,则尝试在上下文信息中添加待测方法所在类中所有方法的签名;如果在尝试添加更多信息到上下文信息过程中,出现了提示超出预设的最大提示长度的情况,则会停止此次的添加行为;S3.2,在步骤S3.1生成了满足要求的待测方法上下文后,将该上下文按照上下文的内容,渲染至相应的提示模版中;具体为:如果上下文中包含有依赖信息,则将上下文信息渲染至包含有依赖的模版中;如果上下文中不包含有依赖信息,则将上下文信息渲染至无依赖的模版中;最终生成一个满足最大提示长度限制、符合当前测试方向、富含待测方法上下文的提示;S3.3,将S3.2生成的提示输入对话式大语言模型中,获得包含初始测试用例的回答。5.根据权利要求1所述的基于对话式大语言模型的高可靠单元测试自动生成方...

【专利技术属性】
技术研发人员:智晨谢卓魁陈膺浩赵新奎邓水光尹建伟
申请(专利权)人:浙江大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1