CN117009231A - 基于对话式大语言模型的高可靠单元测试自动生成方法及装置 - Google Patents

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

Info

Publication number
CN117009231A
CN117009231A CN202310937927.7A CN202310937927A CN117009231A CN 117009231 A CN117009231 A CN 117009231A CN 202310937927 A CN202310937927 A CN 202310937927A CN 117009231 A CN117009231 A CN 117009231A
Authority
CN
China
Prior art keywords
test
tested
mutation
language model
prompt
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202310937927.7A
Other languages
English (en)
Other versions
CN117009231B (zh
Inventor
智晨
谢卓魁
陈膺浩
赵新奎
邓水光
尹建伟
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Zhejiang University ZJU
Original Assignee
Zhejiang University ZJU
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Zhejiang University ZJU filed Critical Zhejiang University ZJU
Priority to CN202310937927.7A priority Critical patent/CN117009231B/zh
Publication of CN117009231A publication Critical patent/CN117009231A/zh
Application granted granted Critical
Publication of CN117009231B publication Critical patent/CN117009231B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

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

Description

基于对话式大语言模型的高可靠单元测试自动生成方法及 装置
技术领域
本发明属于单元测试自动生成技术领域,具体涉及基于对话式大语言模型的高可靠单元测试自动生成方法及装置。
背景技术
随着当今的软件规模越来越大、结构越来越复杂,对软件质量的要求也越来越高。即便是微小的缺陷,也足以使企业蒙受巨大的损失。因此,软件测试作为软件交付的最后一道环节变得越来越重要。在软件测试金字塔中,单元测试作为最大、最基本的组成部分,是整个测试流程中最重要的一个环节。但是,单元测试用例的编写需要耗费大量的时间和精力,因此通常被开发者们所忽略。自动生成单元测试用例技术的出现,就致力于解决这一问题。所谓单元测试用例自动生成,是指自动地生成一组单元测试用例,以覆盖尽可能多的代码路径和代码逻辑,以确保软件单元的正确性和稳定性。采用这种技术生成的单元测试用例,可以提高测试覆盖率,减少手动编写测试用例的工作量,并且可以更早地发现和修复软件中的错误和缺陷。
目前,现有的单元测试用例生成方法可以分为三类:基于传统程序分析的方法、基于预训练模型的方法、基于对话式大语言模型的方法。基于传统程序分析的方法通常使用变异测试、随机测试、符号执行等技术来生成单元测试用例;基于预训练模型的方法则使用大规模英文和代码语料库训练预训练模型,并将单元测试用例的生成任务定义为翻译任务,从待测代码直接翻译成测试用例;基于对话式大语言模型的方法通过将待测方法的上下文信息输入预设好的提示模版生成提示,然后通过对话的方式来让大语言模型生成针对待测方法的单元测试。然而,这些方法存在以下尚未解决的技术问题:
1.基于传统程序分析的方法生成的单元测试用例其变量名和函数名不具有任何语义,只关注如何实现更高的覆盖率,具有可读性差、测试意图不明显等特点,导致了它们难以被开发人员理解和维护。
2.基于预训练模型的方法生成的单元测试用例,在可读性上有一定的优势,但目标方法的覆盖率通常比较低,也即生成的单元测试用例中成功调用目标方法的比例较低。另一方面,成功的单元测试用例的比例也很低,但其中相当一部分比例的测试用例可以通过简单的步骤被修复,而预训练模型不具备交互能力,因而只能够多次生成来弥补这一缺陷。导致生成的测试用例通常在目标方法的覆盖率上不够理想。
3.现有的基于对话式大语言模型的方法可靠性不高,通常会存在重复生成、测试输入数据覆盖不全面、断言质量无法保证、生成单元测试用例成功率低的问题。通过多次重复地利用对话式大语言模型对同一个待测方法生成测试可能会出现重复覆盖、搜索不彻底、多次生成的测试相似等问题,无法从根本上保证单元测试的质量。
发明内容
基于上述背景,本发明提出了一种高可靠性的基于对话式大语言模型的单元测试自动生成方法,能够实现解析抽象语法树获取类级别的上下文信息,通过对待测方法进行代码可达分析获取方法级别的上下文信息,随后对待测方法进行测试必要性判断,然后根据不同的测试目的划分不同的测试方向,根据不同的测试方向生成初始测试用例,并尝试修复发生错误的测试用例。随后暴露出成功的测试用例的基本数据类型,然后进行测试输入数据的搜索,以尽可能提高测试输入数据覆盖率。之后对已有的测试用例进行变异测试,并针对失败的测试用例进行重新生成,以尽可能提高断言质量。最后,对所有成功的测试用例组成的测试套件进行缩减,避免生成重复覆盖的测试用例。
本发明的目的是通过以下技术方案实现的:
根据本说明书的第一方面,提供一种基于对话式大语言模型的高可靠单元测试自动生成方法,包括以下步骤:
S1,对待测项目进行解析,提取出对象文件,并对对象文件进行解析,从类级别的上下文信息中提取出待测方法列表,针对每个待测方法进行代码可达分析,获取方法级别的上下文信息,包括每个待测方法所使用的依赖类、字段、调用方法;
S2,针对每个待测方法,使用对话式大语言模型进行测试必要性判断,如果判断待测方法有测试必要,则会对测试目的进行划分,获取测试方向列表;
S3,从测试方向列表中的一个测试方向出发,根据待测方法的代码可达分析结果,使用动态上下文生成技术,在最大提示长度限制下,生成包含尽可能多的待测方法上下文的提示,并将该提示输入对话式大语言模型中,获得包含初始测试用例的回答;
S4,从包含初始测试用例的回答中提取出初始测试用例,对初始测试用例进行语法验证,编译并执行该测试用例,如果在此过程中发生了错误,则尝试利用启发式的方法和/或对话式大语言模型修复该错误;
S5,针对每个成功的测试用例,首先将测试用例中基本数据类型字段暴露出来,再对测试输入数据的空间进行搜索;
S6,针对所有生成的测试用例,采用变异测试的方式对测试用例的断言质量进行验证;针对没有成功解决的突变,将突变信息融入一个新的提示,利用对话式大语言模型再次生成新的测试用例,直到解决突变或达到最大尝试次数;
S7,对所有成功生成的测试用例组成的测试套件进行最小化,以保证套件中的测试用例在测试目的、覆盖情况、突变解决情况上不会重复。
进一步地,S1具体为:
S1.1,遍历整个待测项目,提取出对象文件,并对对象文件进行解析,使用解析器将对象文件解析成抽象语法树AST的形式;
S1.2,从抽象语法树的根节点出发,遍历整个抽象语法树,从抽象语法树中提取出类级别的上下文信息,包括包声明语句、引入的外部依赖、类签名、类构造函数、类字段、获取器和设置器的方法签名、以及待测方法列表;
S1.3,针对每个待测方法进行代码可达分析,获取方法级别的上下文信息,包括方法体、方法的修饰符、方法是否使用到了字段、方法是否使用到了获取器和设置器、方法所使用的依赖类、调用方法的信息。
进一步地,S2具体为:
S2.1,针对每个待测方法,将其渲染进一个包含有测试必要性判断和测试目的划分的提示模版中,输入对话式大语言模型,并指定回答格式,通过正则表达式根据回答内容判断测试必要性;
S2.2,如果对话式大语言模型判断待测方法有测试必要性时,则根据回答内容获取通过测试目的划分得到的测试方向列表。
进一步地,S3具体为:
S3.1,根据一个待测方向,以及待测方法所在类的关键信息、待测方法的可达代码块,在确保不超出预设的最大提示长度的情况下,尽可能提供更多的待测方法上下文,渲染成提示;具体为:
尝试生成最小上下文,在最小上下文中必须包含方法体、所在类的签名、构造函数的签名、可达字段以及相应的获取器和设置器的签名;如果最小上下文的长度大于预设的最大提示长度,则会取消此次生成测试用例的尝试;
根据待测方法是否依赖于外部类来动态添加更多的待测方法上下文;如果待测方法依赖于外部类,则尝试在上下文信息中添加该外部类以及被调用方法的签名,添加信息后会进行提示生成,确保提示的长度小于预设的最大提示长度;如果待测方法没有外部依赖,则尝试在上下文信息中添加待测方法所在类中被调用方法的签名,如果仍然未超出预设的最大提示长度,则尝试在上下文信息中添加待测方法所在类中所有方法的签名;如果在尝试添加更多信息到上下文信息过程中,出现了提示超出预设的最大提示长度的情况,则会停止此次的添加行为;
S3.2,在步骤S3.1生成了满足要求的待测方法上下文后,将该上下文按照上下文的内容,渲染至相应的提示模版中;具体为:
如果上下文中包含有依赖信息,则将上下文信息渲染至包含有依赖的模版中;如果上下文中不包含有依赖信息,则将上下文信息渲染至无依赖的模版中;最终生成一个满足最大提示长度限制、符合当前测试方向、富含待测方法上下文的提示;
S3.3,将S3.2生成的提示输入对话式大语言模型中,获得包含初始测试用例的回答。
进一步地,S4具体为:
S4.1,提取初始测试用例,如果提取失败,则本次尝试将会被放弃;
S4.2,对初始测试用例进行语法验证,具体为:
使用语法解析器尝试对有效测试用例进行解析,如果在解析过程出现了错误,则尝试以语句结束符或者代码块结束符作为标志来修复测试用例,如果修复失败,则本次尝试将会被放弃;
S4.3,对测试用例的编译正确性进行验证,具体为:
使用编译器尝试对测试用例进行编译,如果在编译过程中出现了错误,则将取出的代码片段与待测方法所在的类的包声明语句和导入依赖的语句进行逐行比对,针对测试用例中没有包含的语句,逐一将缺失的语句添加至测试用例中;如果仍然出现了编译错误,则通过既有的规则匹配出最为相关的错误信息,融合错误信息、测试用例、待测方法上下文,生成用于修复错误的提示;如果修复失败,则本次尝试将会被放弃;
S4.4在S4.3验证了编译正确性后,执行测试用例;具体为:
如果在执行过程中出现了错误,则通过既有的规则匹配出最为相关的错误信息,融合错误信息、测试用例、待测方法上下文,生成用于修复错误的提示;如果修复失败,则本次尝试将会被放弃。
进一步地,S4.1具体为:
测试用例在大语言模型的回答中主要有两种存在形式,一种是存在明确定界符,且回答将测试用例包含在起始和结束定界符中;另一种则是没有明确的定界符;
针对第一种形式的回答,采用正则表达式来匹配并提取出回答中所有的代码片段;对所有代码片段进行筛选,筛选出同时包含有“@Test”、“class”、“import”关键词的代码片段作为一个有效的测试用例;
针对第二种形式的回答,采用定界法来界定包含测试用例代码片段的上界和下界;具体地,首先定位到包含有“class”+方法名+“Test”关键词所在的行,并以该行作为起始行,分别向上和向下寻找边界;在寻找边界的过程中,判断一行的结束字符是否被允许作为一个语句的结束字符,,如果允许则判断该行是代码片段中的一部分,否则判断该行为代码片段的边界。
进一步地,S5具体为:
S5.1,针对每个成功通过的测试用例,对其进行解析,记录基本数据类型的赋值语句作为搜索的入口;
S5.2,开始搜索过程,对基本数据类型所有可能出现的值进行枚举和组合,之后修改原测试用例中的赋值语句形成新的测试用例,执行测试用例并记录其执行结果,包括覆盖率和测试通过情况;不断重复执行直到所有可能出现的值都已经被遍历或者达到了最大的搜索时间限制,搜索结束;
S5.3,根据搜索过程中的执行结果,将所有的测试输入数据进行分类,最后只保留不同覆盖情况且执行通过的测试用例。
进一步地,S6具体为:
S6.1,在原待测方法中植入突变,包括条件变异、算术运算符变异、一般表达式变异、语句变异、边界值变异、返回值变异、逻辑操作符变异,形成变异后的待测方法;
S6.2,将所有测试方向生成的全部测试用例运行在变异后的待测方法上,如果原来通过的测试用例在变异后的待测方法上执行失败,则说明植入的突变被解决了;该步骤同时需要记录突变的解决情况;
S6.3,如果仍存在未解决的突变,则将突变的信息、待测方法的上下文信息动态地渲染进提示模版中生成一个为了解决该突变的提示,输入大语言模型中,生成新的测试用例,直到该突变被解决或者达到了最大尝试次数。
进一步地,S7具体为:
S7.1针对所有生成的测试用例的覆盖情况,选择删除体积最大、覆盖情况一致且解决突变一致的测试用例,直到所有的测试用例的覆盖情况、解决突变情况均不一致;
S7.2合并所有的测试用例到一个测试套件中,运行该测试套件;如果测试套件未能运行成功,则说明该测试套件中存在有冲突的测试用例,首先尝试加入准备环境和清理环境的步骤,如果未能成功解决该冲突,则尝试删除部分测试用例。
根据本说明书的第二方面,提供一种基于对话式大语言模型的高可靠单元测试自动生成装置,包括存储器和一个或多个处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,用于实现如第一方面所述的基于对话式大语言模型的高可靠单元测试自动生成方法。
基于上述技术方案,本发明具有以下有益技术效果:
1.本发明提出了一个高可靠性的基于对话式大语言模型的单元测试自动生成方法,能够自动对项目解析、进行代码可达分析、提取相关信息、测试目的划分、动态生成上下文,自动生成并修复初始测试用例,随后对初始测试用例的测试输入数据进行搜索,使用变异测试来保证生成的测试用例的质量,最后最小化测试用例,最终输出正确、可靠、覆盖率高、体积小的测试套件。
2.在实验中,本发明在不同的项目上(包括大小、领域和版本等不同特点)都表现出了稳定的效果。相较于传统方法,无论在分支覆盖率还是行覆盖率上,都展现出了显著的优势。同样,在与基于预训练模型的方法比较时,本发明在行覆盖率和待测方法的覆盖率上均优于该类方法。最后,在和已有的基于对话式大语言模型的方法对比时,无论是在测试意图、测试输入数据的完整性、测试断言的质量,还是在测试用例的重复度上,本发明都表现出了显著的优势。
3.实验证明,本发明生成的测试用例在可读性、可理解性、可维护性、测试输入数据完整性、断言质量、体积上具有显著优势。
附图说明
图1为生成完整测试套件的流程示意图。
图2为解析项目、提取待测方法上下文信息的流程示意图。
图3为测试必要性和测试方向划分的流程示意图。
图4为生成初始测试用例的流程示意图。
图5为验证和修复初始测试用例的流程示意图。
图6为测试输入数据搜索的流程示意图
图7为变异测试的流程示意图。
图8为最小化测试套件示意图。
具体实施方式
为了更加具体地描述本发明,下面结合附图及具体实施方式对本发明的技术方案进行详细说明。
如图1所示,本发明实施例提供的一种基于对话式大语言模型的高可靠单元测试自动生成方法,包括如下步骤:
S10,对待测项目进行解析,提取出对象文件,并对对象文件进行解析,从类级别的上下文信息中提取出待测方法列表,针对每个待测方法进行代码可达分析,获取方法级别的上下文信息,包括每个待测方法所使用的依赖类、字段、调用方法;
S20,针对每个待测方法,使用对话式大语言模型进行测试必要性判断,如果判断待测方法有测试必要时,则会对测试目的进行划分,获取测试方向列表;
S30,从测试方向列表中的一个测试方向出发,根据待测方法的代码可达分析结果,使用动态上下文生成技术,在最大提示长度限制下,生成包含尽可能多的待测方法上下文的提示,并将该提示输入对话式大语言模型中,获得包含初始测试用例的回答;
S40,从包含初始测试用例的回答中提取出初始测试用例,对初始测试用例进行语法验证,编译并执行这个测试用例,如果在此过程中发生了错误,则尝试利用启发式的方法和/或对话式大语言模型修复该错误;
S50,针对每个成功的测试用例,首先将测试用例中基本数据类型字段暴露出来,再对测试输入数据的空间进行搜索;
S60,针对所有生成的测试用例,采用变异测试的方式对测试用例的断言质量进行验证;针对没有成功解决的突变,将突变信息融入一个新的提示,利用对话式大语言模型再次生成新的测试用例,直到解决突变或达到最大尝试次数;
S70,对所有成功生成的测试用例组成的测试套件进行最小化,以保证套件中的测试用例在测试目的、覆盖情况、突变解决情况上不会重复。
如图2所示,S10的具体实现方式为:
S101,遍历整个待测项目,提取出对象文件,并对对象文件进行解析,使用解析器将对象文件解析成抽象语法树AST的形式;
S102,从抽象语法树的根节点出发,遍历整个抽象语法树,从抽象语法树中提取出类级别的上下文信息,包括包声明语句、引入的外部依赖、类签名、类构造函数、类字段、获取器和设置器的方法签名、以及待测方法列表;
S103,针对每个待测方法进行代码可达分析,获取方法级别的上下文信息,包括方法体、方法的修饰符、方法是否使用到了字段、方法是否使用到了获取器和设置器、方法所使用的依赖类、调用方法的信息。
如图3所示,S20的具体实现方式为:
S201,针对每个待测方法,将其渲染进一个包含有测试必要性判断和测试目的划分的提示模版中,输入对话式大语言模型,并指定回答格式,通过正则表达式根据回答内容判断测试必要性;
S202,如果对话式大语言模型判断待测方法有测试必要性时,则根据回答内容获取通过测试目的划分得到的测试方向列表。
如图4所示,S30的具体实现方式为:
S301,根据一个待测方向,以及待测方法所在类的关键信息、待测方法的可达代码块,在确保不超出预设的最大提示长度的情况下,尽可能提供更多的待测方法上下文,渲染成提示;具体为:
首先尝试生成最小上下文,在最小上下文中必须包含方法体、所在类的签名、构造函数的签名、可达字段以及相应的获取器和设置器的签名;如果最小上下文的长度大于预设的最大提示长度,则会取消此次生成测试用例的尝试;
然后,根据待测方法是否依赖于外部类来动态添加更多的待测方法上下文;如果待测方法依赖于外部类,则尝试在上下文信息中添加该外部类以及被调用方法的签名,添加信息后会进行提示生成,确保提示的长度小于预设的最大提示长度;如果待测方法没有外部依赖,则尝试在上下文信息中添加待测方法所在类中被调用方法的签名,如果仍然未超出预设的最大提示长度,则尝试在上下文信息中添加待测方法所在类中所有方法的签名;如果在尝试添加更多信息到上下文信息过程中,出现了提示超出预设的最大提示长度的情况,则会停止此次的添加行为;
S302,在步骤S301生成了满足要求的待测方法上下文后,将该上下文按照上下文的内容,渲染至相应的提示模版中;具体为:
如果上下文中包含有依赖信息,则将上下文信息渲染至包含有依赖的模版中;如果上下文中不包含有依赖信息,则将上下文信息渲染至无依赖的模版中;最终生成一个满足最大提示长度限制、符合当前测试方向、富含待测方法上下文的提示;
S303,将S302生成的提示输入对话式大语言模型中,获得包含初始测试用例的回答。
如图5所示,S40的具体实现方式为:
S401,提取初始测试用例。测试用例在大语言模型的回答中主要有两种存在形式,一种是存在明确定界符,且回答将测试用例包含在起始和结束定界符中;另一种则是没有明确的定界符。
针对第一种形式的回答,本发明采用正则表达式来匹配并提取出回答中所有的代码片段;由于提取出的代码片段可能存在不完整、不包含测试用例等情况,本发明进一步对所有代码片段进行筛选,筛选出同时包含有“@Test”、“class”、“import”关键词的代码片段作为一个有效的测试用例。
针对第二种形式的回答,本发明采用定界法来界定包含测试用例代码片段的上界和下界;具体地,本发明首先定位到包含有“class”+方法名+“Test”关键词所在的行,并以该行作为起始行,分别向上和向下寻找边界;具体地,在寻找边界的过程中,判断一行的结束字符是否被允许作为一个语句的结束字符,这些字符通常包含“;”、“}”、“)”、“{”、“(”、空格、制表符,如果允许则判断该行是代码片段中的一部分,否则判断该行为代码片段的边界。
如果提取初始测试用例失败,则本次尝试将会被放弃。
S402,在S401提取了有效的初始测试用例之后,对初始测试用例进行语法验证;具体为:
使用语法解析器尝试对有效测试用例进行解析,如果在解析过程出现了错误,则尝试以语句结束符或者代码块结束符作为标志来修复测试用例;具体地,从代码片段的最后一个字符开始,向前查找语句结束符“;”以及代码块结束符“}”,当找到语句结束符或代码块结束符时停止,取出前一代码片段,并尝试为其添加字符“}”来完整其结构,本发明能够保证代码块结束符的数量与代码块开始符的数量相匹配。
如果修复失败,则本次尝试将会被放弃。
S403,在S402验证了语法正确性后,对测试用例的编译正确性进行验证;具体为:
使用编译器尝试对测试用例进行编译,如果在编译过程中出现了错误,则将取出的代码片段与待测方法所在的类的包声明语句和导入依赖的语句进行逐行比对,针对测试用例中没有包含的语句,逐一将缺失的语句添加至测试用例中;如果仍然出现了编译错误,则通过既有的规则匹配出最为相关的错误信息,融合错误信息、测试用例、待测方法上下文,生成用于修复错误的提示,具体地,在预设的最大提示长度限制下,尝试添加测试用例、待测方法上下文、以及错误信息渲染至用于修复错误的提示模版中形成提示,如果该提示长度超出了最大提示长度限制,则尝试对错误信息进行删减直到满足限制条件;与此同时,本发明还会保证最低的错误信息长度,以确保修复任务的有效性。
如果修复失败,则本次尝试将会被放弃。
S404,在S403验证了编译正确性后,执行测试用例;具体为:
如果在执行过程中出现了错误,则通过既有的规则匹配出最为相关的错误信息,融合错误信息、测试用例、待测方法上下文,生成用于修复错误的提示,具体地,在预设的最大提示长度限制下,尝试添加测试用例、待测方法上下文、以及错误信息渲染至用于修复错误的提示模版中形成提示,如果该提示长度超出了最大提示长度限制,则尝试对错误信息进行删减直到满足限制条件;与此同时,本发明还会保证最低的错误信息长度,以确保修复任务的有效性。
如果修复失败,则本次尝试将会被放弃。
如图6所示,S50的具体实现方式为:
S501,针对每个成功通过的测试用例,首先对其进行解析,记录基本数据类型的赋值语句作为搜索的入口;
S502,开始搜索过程,对基本数据类型所有可能出现的值进行枚举和组合,之后修改原测试用例中的赋值语句形成新的测试用例,执行测试用例并记录其执行结果,包括覆盖率和测试通过情况;不断重复执行直到所有可能出现的值都已经被遍历或者达到了最大的搜索时间限制,搜索结束;
S503,根据搜索过程中的执行结果,将所有的测试输入数据进行分类,最后只保留不同覆盖情况且执行通过的测试用例。
如图7所示,S60的具体实现方式为:
S601,在原待测方法中植入突变,包括条件变异、算术运算符变异、一般表达式变异、语句变异、边界值变异、返回值变异、逻辑操作符变异,形成变异后的待测方法;
S602,将前述所有测试方向生成的全部测试用例运行在变异后的待测方法上,如果原来通过的测试用例在变异后的待测方法上执行失败,则说明植入的突变被解决了;该步骤同时需要记录突变的解决情况;
S603,如果仍存在未解决的突变,则将突变的信息、待测方法的上下文信息动态地渲染进提示模版中生成一个为了解决该突变的提示,输入大语言模型中,生成新的测试用例,直到该突变被解决或者达到了最大尝试次数。
如图8所示,S70的具体实现方式为:
S701,针对所有生成的测试用例的覆盖情况,选择删除体积最大、覆盖情况一致且解决突变一致的测试用例,直到所有的测试用例的覆盖情况、解决突变情况均不一致;
S702,合并所有的测试用例到一个测试套件中,运行该测试套件;如果测试套件未能运行成功,则说明该测试套件中存在有冲突的测试用例,首先尝试加入准备环境和清理环境的步骤,如果未能成功解决该冲突,则尝试删除部分测试用例。
与前述基于对话式大语言模型的高可靠单元测试自动生成方法的实施例相对应,本发明还提供了基于对话式大语言模型的高可靠单元测试自动生成装置的实施例。
本发明实施例提供的基于对话式大语言模型的高可靠单元测试自动生成装置,包括存储器和一个或多个处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,用于实现上述实施例中的基于对话式大语言模型的高可靠单元测试自动生成方法。
本发明基于对话式大语言模型的高可靠单元测试自动生成装置的实施例可以应用在任意具备数据处理能力的设备上,该任意具备数据处理能力的设备可以为诸如计算机等设备或装置。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
本发明实施例还提供一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时,实现上述实施例中的基于对话式大语言模型的高可靠单元测试自动生成方法。
所述计算机可读存储介质可以是前述任一实施例所述的任意具备数据处理能力的设备的内部存储单元,例如硬盘或内存。所述计算机可读存储介质也可以是任意具备数据处理能力的设备的外部存储设备,例如所述设备上配备的插接式硬盘、智能存储卡(Smart Media Card,SMC)、SD卡、闪存卡(Flash Card)等。进一步的,所述计算机可读存储介质还可以既包括任意具备数据处理能力的设备的内部存储单元也包括外部存储设备。所述计算机可读存储介质用于存储所述计算机程序以及所述任意具备数据处理能力的设备所需的其他程序和数据,还可以用于暂时地存储已经输出或者将要输出的数据。
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。

Claims (10)

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所述的基于对话式大语言模型的高可靠单元测试自动生成方法,其特征在于,S4具体为:
S4.1,提取初始测试用例,如果提取失败,则本次尝试将会被放弃;
S4.2,对初始测试用例进行语法验证,具体为:
使用语法解析器尝试对有效测试用例进行解析,如果在解析过程出现了错误,则尝试以语句结束符或者代码块结束符作为标志来修复测试用例,如果修复失败,则本次尝试将会被放弃;
S4.3,对测试用例的编译正确性进行验证,具体为:
使用编译器尝试对测试用例进行编译,如果在编译过程中出现了错误,则将取出的代码片段与待测方法所在的类的包声明语句和导入依赖的语句进行逐行比对,针对测试用例中没有包含的语句,逐一将缺失的语句添加至测试用例中;如果仍然出现了编译错误,则通过既有的规则匹配出最为相关的错误信息,融合错误信息、测试用例、待测方法上下文,生成用于修复错误的提示;如果修复失败,则本次尝试将会被放弃;
S4.4在S4.3验证了编译正确性后,执行测试用例;具体为:
如果在执行过程中出现了错误,则通过既有的规则匹配出最为相关的错误信息,融合错误信息、测试用例、待测方法上下文,生成用于修复错误的提示;如果修复失败,则本次尝试将会被放弃。
6.根据权利要求1所述的基于对话式大语言模型的高可靠单元测试自动生成方法,其特征在于,S4.1具体为:
测试用例在大语言模型的回答中主要有两种存在形式,一种是存在明确定界符,且回答将测试用例包含在起始和结束定界符中;另一种则是没有明确的定界符;
针对第一种形式的回答,采用正则表达式来匹配并提取出回答中所有的代码片段;对所有代码片段进行筛选,筛选出同时包含有“@Test”、“class”、“import”关键词的代码片段作为一个有效的测试用例;
针对第二种形式的回答,采用定界法来界定包含测试用例代码片段的上界和下界;具体地,首先定位到包含有“class”+方法名+“Test”关键词所在的行,并以该行作为起始行,分别向上和向下寻找边界;在寻找边界的过程中,判断一行的结束字符是否被允许作为一个语句的结束字符,,如果允许则判断该行是代码片段中的一部分,否则判断该行为代码片段的边界。
7.根据权利要求1所述的基于对话式大语言模型的高可靠单元测试自动生成方法,其特征在于,S5具体为:
S5.1,针对每个成功通过的测试用例,对其进行解析,记录基本数据类型的赋值语句作为搜索的入口;
S5.2,开始搜索过程,对基本数据类型所有可能出现的值进行枚举和组合,之后修改原测试用例中的赋值语句形成新的测试用例,执行测试用例并记录其执行结果,包括覆盖率和测试通过情况;不断重复执行直到所有可能出现的值都已经被遍历或者达到了最大的搜索时间限制,搜索结束;
S5.3,根据搜索过程中的执行结果,将所有的测试输入数据进行分类,最后只保留不同覆盖情况且执行通过的测试用例。
8.根据权利要求1所述的基于对话式大语言模型的高可靠单元测试自动生成方法,其特征在于,S6具体为:
S6.1,在原待测方法中植入突变,包括条件变异、算术运算符变异、一般表达式变异、语句变异、边界值变异、返回值变异、逻辑操作符变异,形成变异后的待测方法;
S6.2,将所有测试方向生成的全部测试用例运行在变异后的待测方法上,如果原来通过的测试用例在变异后的待测方法上执行失败,则说明植入的突变被解决了;该步骤同时需要记录突变的解决情况;
S6.3,如果仍存在未解决的突变,则将突变的信息、待测方法的上下文信息动态地渲染进提示模版中生成一个为了解决该突变的提示,输入大语言模型中,生成新的测试用例,直到该突变被解决或者达到了最大尝试次数。
9.根据权利要求1所述的基于对话式大语言模型的高可靠单元测试自动生成方法,其特征在于,S7具体为:
S7.1针对所有生成的测试用例的覆盖情况,选择删除体积最大、覆盖情况一致且解决突变一致的测试用例,直到所有的测试用例的覆盖情况、解决突变情况均不一致;
S7.2合并所有的测试用例到一个测试套件中,运行该测试套件;如果测试套件未能运行成功,则说明该测试套件中存在有冲突的测试用例,首先尝试加入准备环境和清理环境的步骤,如果未能成功解决该冲突,则尝试删除部分测试用例。
10.一种基于对话式大语言模型的高可靠单元测试自动生成装置,包括存储器和一个或多个处理器,所述存储器中存储有可执行代码,其特征在于,所述处理器执行所述可执行代码时,用于实现如权利要求1-9中任一项所述的基于对话式大语言模型的高可靠单元测试自动生成方法。
CN202310937927.7A 2023-07-28 2023-07-28 基于对话式大语言模型的高可靠单元测试自动生成方法及装置 Active CN117009231B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310937927.7A CN117009231B (zh) 2023-07-28 2023-07-28 基于对话式大语言模型的高可靠单元测试自动生成方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310937927.7A CN117009231B (zh) 2023-07-28 2023-07-28 基于对话式大语言模型的高可靠单元测试自动生成方法及装置

Publications (2)

Publication Number Publication Date
CN117009231A true CN117009231A (zh) 2023-11-07
CN117009231B CN117009231B (zh) 2024-03-29

Family

ID=88570393

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310937927.7A Active CN117009231B (zh) 2023-07-28 2023-07-28 基于对话式大语言模型的高可靠单元测试自动生成方法及装置

Country Status (1)

Country Link
CN (1) CN117009231B (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117370994A (zh) * 2023-12-08 2024-01-09 浙江君同智能科技有限责任公司 基于模糊测试的大语言模型漏洞检测方法和装置
CN117783697A (zh) * 2023-12-26 2024-03-29 深圳市中瑞成通讯设备有限公司 天线测试方法、系统、装置及存储介质
CN117806980A (zh) * 2024-03-01 2024-04-02 西安中朗智控科技有限公司 一种基于大语言模型的测试用例自动生成装置
CN117971704A (zh) * 2024-03-28 2024-05-03 合肥综合性国家科学中心人工智能研究院(安徽省人工智能实验室) 一种青少年编程场景的自我引导代码纠错数据集生成方法
CN118051920A (zh) * 2024-04-16 2024-05-17 杭州默安科技有限公司 一种漏洞验证请求包生成方法、装置、设备及存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5784553A (en) * 1996-01-16 1998-07-21 Parasoft Corporation Method and system for generating a computer program test suite using dynamic symbolic execution of JAVA programs
US20140289708A1 (en) * 2013-03-17 2014-09-25 Typemock Ltd. Methods, Circuits, Devices, Systems and Associated Computer Executable Code for Testing Software Code
US20170132116A1 (en) * 2013-03-17 2017-05-11 Typemock Ltd. Methods Circuits Apparatuses Systems and Associated Computer Executable Code for Generating a Software Unit Test
CN110543421A (zh) * 2019-08-31 2019-12-06 华南理工大学 基于测试用例自动生成算法的单元测试自动执行方法
CN116431476A (zh) * 2023-03-14 2023-07-14 西北大学 一种基于代码上下文变异的jvm模糊测试方法

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5784553A (en) * 1996-01-16 1998-07-21 Parasoft Corporation Method and system for generating a computer program test suite using dynamic symbolic execution of JAVA programs
US20140289708A1 (en) * 2013-03-17 2014-09-25 Typemock Ltd. Methods, Circuits, Devices, Systems and Associated Computer Executable Code for Testing Software Code
US20170132116A1 (en) * 2013-03-17 2017-05-11 Typemock Ltd. Methods Circuits Apparatuses Systems and Associated Computer Executable Code for Generating a Software Unit Test
CN110543421A (zh) * 2019-08-31 2019-12-06 华南理工大学 基于测试用例自动生成算法的单元测试自动执行方法
CN116431476A (zh) * 2023-03-14 2023-07-14 西北大学 一种基于代码上下文变异的jvm模糊测试方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
杨正卉;: "自动化测试工具覆盖率对比分析", 现代计算机, no. 15, 25 May 2020 (2020-05-25), pages 148 - 153 *

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117370994A (zh) * 2023-12-08 2024-01-09 浙江君同智能科技有限责任公司 基于模糊测试的大语言模型漏洞检测方法和装置
CN117370994B (zh) * 2023-12-08 2024-02-27 浙江君同智能科技有限责任公司 基于模糊测试的大语言模型漏洞检测方法和装置
CN117783697A (zh) * 2023-12-26 2024-03-29 深圳市中瑞成通讯设备有限公司 天线测试方法、系统、装置及存储介质
CN117806980A (zh) * 2024-03-01 2024-04-02 西安中朗智控科技有限公司 一种基于大语言模型的测试用例自动生成装置
CN117806980B (zh) * 2024-03-01 2024-05-28 西安中朗智控科技有限公司 一种基于大语言模型的测试用例自动生成装置
CN117971704A (zh) * 2024-03-28 2024-05-03 合肥综合性国家科学中心人工智能研究院(安徽省人工智能实验室) 一种青少年编程场景的自我引导代码纠错数据集生成方法
CN117971704B (zh) * 2024-03-28 2024-06-04 合肥综合性国家科学中心人工智能研究院(安徽省人工智能实验室) 一种青少年编程场景的自我引导代码纠错数据集生成方法
CN118051920A (zh) * 2024-04-16 2024-05-17 杭州默安科技有限公司 一种漏洞验证请求包生成方法、装置、设备及存储介质

Also Published As

Publication number Publication date
CN117009231B (zh) 2024-03-29

Similar Documents

Publication Publication Date Title
CN117009231B (zh) 基于对话式大语言模型的高可靠单元测试自动生成方法及装置
US20210334093A1 (en) Automating Identification of Code Snippets for Library Suggestion Models
US20230333828A1 (en) Inductive equivalence in machine-based instruction editing
US20060150160A1 (en) Software analyzer
US11971808B2 (en) Generation of test models from behavior driven development scenarios based on behavior driven development step definitions and similarity analysis using neuro linguistic programming and machine learning mechanisms
CN111382070A (zh) 兼容性测试方法、装置、存储介质和计算机设备
Monteiro et al. Bounded model checking of C++ programs based on the Qt cross‐platform framework
CN111459500A (zh) 基于海鹰翼辉操作系统的安全编译方法及装置
US20060041873A1 (en) Computer system and method for verifying functional equivalence
Kiss Generalizing the split factor of the minimizing delta debugging algorithm
US20220374212A1 (en) Indexing and accessing source code snippets contained in documents
CN112286784B (zh) 一种测试用例生成方法、装置、服务器及存储介质
CN115951890A (zh) 一种不同前端框架间的代码转换方法及系统及装置
CN113051262B (zh) 一种数据质检方法、装置、设备及存储介质
KR100777103B1 (ko) 테스트 드라이버 생성 장치 및 방법
Palka Testing an Optimising Compiler by Generating Random Lambda Terms
US11119740B2 (en) Parsability of code snippets
CN113434430A (zh) 一种sql查询语句性能检测方法和装置
Figueroa et al. Towards progressive program verification in Dafny
CN114489653A (zh) 基于编译器的数据处理方法、装置以及可读存储介质
CN117390055B (zh) Jooq连表语句生成方法、设备以及介质
Gao et al. MUT: Human-in-the-Loop Unit Test Migration
CN117008919A (zh) 仿真模型文件的解析方法、装置、电子设备及存储介质
CN117348887A (zh) 一种代码压缩方法、装置、设备及存储介质
CN116991699A (zh) 页面代码的测试方法、装置、计算机可读介质及电子设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant