首页> 中国专利> JAVA程序的回归测试方法以及测试装置

JAVA程序的回归测试方法以及测试装置

摘要

本申请提供了一种JAVA程序的回归测试方法以及测试装置,该方法包括:获取差异代码以及预定函数,差异代码为迭代后代码文件与迭代前代码文件不同的代码内容,预定函数为差异代码直接影响的函数;差异代码进行静态分析,确定关联函数,关联函数为与预定函数有调用关系的函数;根据预定函数以及关联函数,生成差异代码的回归测试报告。本申请缓解了现有技术中JAVA程序的回归测试的测试效率低下的问题。

著录项

  • 公开/公告号CN114816984A

    专利类型发明专利

  • 公开/公告日2022-07-29

    原文格式PDF

  • 申请/专利权人 中国邮政储蓄银行股份有限公司;

    申请/专利号CN202210232669.8

  • 发明设计人 王鹏;李清;祝君平;刘义;

    申请日2022-03-09

  • 分类号G06F11/36(2006.01);

  • 代理机构北京康信知识产权代理有限责任公司 11240;

  • 代理人霍文娟

  • 地址 100032 北京市西城区金融大街3号

  • 入库时间 2023-06-19 16:11:11

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-08-16

    实质审查的生效 IPC(主分类):G06F11/36 专利申请号:2022102326698 申请日:20220309

    实质审查的生效

说明书

技术领域

本申请涉及JAVA回归测试程序领域,具体而言,涉及一种JAVA程序的回归测试方法、测试装置、处理器以及电子设备。

背景技术

在JAVA程序的快速迭代开发中,随着版本的不断发布,回归测试也愈加频繁。如何确定回归测试的范围就显得尤为重要。范围过大,直接造成大量时间和人力的浪费。范围过小,容易遗漏缺陷。当前回归范围的选定主要由测试人员根据需求文档或范围说明书、与开发人员的沟通、自身的测试经验和测试策略来确定回归测试范围。在整个过程中,人为因素的影响较多,回归范围是否准确依赖于测试人员的技术水平和经验。通常情况下,为了避免缺陷的遗漏,总是进行大范围回归,测试效率低、成本高。

在背景技术部分中公开的以上信息只是用来加强对本文所描述技术的背景技术的理解,因此,背景技术中可能包含某些信息,这些信息对于本领域技术人员来说并未形成在本国已知的现有技术。

发明内容

本申请的主要目的在于提供一种JAVA程序的回归测试方法、测试装置、处理器以及电子设备,以解决现有技术中JAVA程序的回归测试的测试效率低下的问题。

根据本发明实施例的一个方面,提供了一种JAVA程序的回归测试方法,包括:获取差异代码以及预定函数,所述差异代码为迭代后代码文件与迭代前代码文件不同的代码内容,所述预定函数为所述差异代码直接影响的函数;对所述差异代码进行静态分析,确定关联函数,所述关联函数为与所述预定函数有调用关系的函数;根据所述预定函数以及所述关联函数,生成所述差异代码的回归测试报告。

可选地,对所述差异代码进行静态分析,确定关联函数,包括:采用类层次分析法对所述差异代码进行分析,得到初始函数调用图;根据所述差异代码,采用快速分析法对所述初始函数调用图进行优化,得到函数调用图;根据所述函数调用图,确定所述关联函数。

可选地,采用类层次分析法对所述差异代码进行分析,得到初始函数调用图,包括:根据所述差异代码,确定类层次图,所述类层次图包括多个类以及各所述类的继承关系;获取各所述类对应的第一函数以及第一调用关系,所述第一调用关系为各所述第一函数之间的调用关系;在各所述类中存在父类的情况下,根据所述继承关系确定所述父类的所有子类;确定所述所有子类对应的第二函数以及第二调用关系,所述第二调用关系包括各所述第二函数之间的调用关系和/或所述第一函数与所述第二函数之间的调用关系;根据所述第一函数、所述第一调用关系、所述第二函数以及所述第二调用关系,生成所述初始函数调用图。

可选地,根据所述差异代码,采用快速分析法对所述初始函数调用图进行优化,得到函数调用图,包括:在所述初始函数调用图中存在虚函数的情况下,确定所述虚函数对应的第一预定类和/或第二预定类,所述第一预定类为所述虚函数的赋值语句中未实例化的所述类,所述第二预定类为所述赋值语句中的实例化信息不可达的所述类;从所述初始函数调用图中删除所述虚函数与所述第一预定类和/或所述第二预定类之间的调用关系,得到所述函数调用图。

可选地,获取差异代码以及预定函数,包括:采用分布式版本控制系统处理所述迭代前代码文件以及所述迭代后代码文件,得到所述差异代码;确定所述差异代码对应的所述预定函数。

可选地,根据所述预定函数以及所述关联函数,生成所述差异代码的回归测试报告,包括:根据所述预定函数以及所述关联函数,确定对应的测试用例;在存在与所述测试用例匹配的自动化测试脚本的情况下,确定所述自动化测试脚本为目标自动化测试脚本;运行所述目标自动化测试脚本,生成所述回归测试报告。

可选地,在不存在与所述测试用例匹配的所述自动化测试脚本的情况下,所述方法还包括:发送提示信息,所述提示信息为提示对所述测试用例进行人工测试的信息。

根据本发明实施例的另一方面,还提供了一种JAVA程序的回归测试装置,包括:获取单元,用于获取差异代码以及预定函数,所述差异代码为迭代后代码文件与迭代前代码文件不同的代码内容,所述预定函数为所述差异代码直接影响的函数;分析单元,用于对所述差异代码进行静态分析,确定关联函数,所述关联函数为与所述预定函数有调用关系的函数;生成单元,用于根据所述预定函数以及所述关联函数,生成所述差异代码的回归测试报告。

根据本发明实施例的另一方面,还提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行任意一种所述的方法。

根据本发明实施例的另一方面,还提供了一种电子设备,包括:一个或多个处理器,存储器以及一个或多个程序,其中,所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述一个或多个程序包括用于执行任意一种所述的方法。

在本发明实施例中,所述的JAVA程序的回归测试方法,首先,获取差异代码以及所述差异代码直接影响的预定函数;然后,对所述差异代码进行静态分析,确定与所述预定函数有调用关系的关联函数;最后,根据所述预定函数以及所述关联函数,生成所述差异代码的回归测试报告。相比现有技术中,人为确定回归测试范围并进行测试,得到测试报告,造成测试效率低下的问题,本申请的所述方法中,通过对迭代前后代码文本版本存在差异的差异代码进行分析,得到因代码变动而直接受到影响的预定函数,再对差异代码进行静态分析,确定与预定函数有调用关系的关联函数,最后根据预定函数以及关联函数生成回归测试报告,实现了对迭代前后的差异代码的自动回归测试,从而保证了测试效率较高。并且,相比现有技术中为了避免缺陷的遗漏,技术人员通常会进行大范围回归,从而造成测试效率低下的问题,本申请根据直接受到差异代码影响的预定函数,以及根据静态分析得到的关联函数来得到回归测试报告,保证了回归测试的范围较为合理,缓解甚至避免了回归范围或大或小的问题,从而进一步地提升了回归测试效率。另外,由于本申请为自动回归测试,这样无需依赖技术人员的技术水平和经验,从而降低了回归范围选择中人为因素的干扰,保证了得到的回归测试报告较为客观,同时解放了人力,节省人力测试成本。

附图说明

构成本申请的一部分的说明书附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1示出了根据本申请的实施例的JAVA程序的回归测试方法的流程示意图;

图2示出了根据本申请的实施例的JAVA程序的回归测试装置的示意图;

图3示出了根据本申请的一种具体实施例的初始函数调用图的示意图;

图4示出了根据本申请的一种具体实施例的中间函数调用图的示意图;

图5示出了根据本申请的一种具体实施例的函数调用图的示意图。

其中,上述附图包括以下附图标记:

10、获取单元;20、分析单元;30、生成单元。

具体实施方式

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

应该理解的是,当元件(诸如层、膜、区域、或衬底)描述为在另一元件“上”时,该元件可直接在该另一元件上,或者也可存在中间元件。而且,在说明书以及权利要求书中,当描述有元件“连接”至另一元件时,该元件可“直接连接”至该另一元件,或者通过第三元件“连接”至该另一元件。

正如背景技术中所说的,现有技术中JAVA程序的回归测试的测试效率低下,为了解决上述问题,本申请的一种典型的实施方式中,提供了一种JAVA程序的回归测试方法、测试装置、处理器以及电子设备。

根据本申请的实施例,提供了一种JAVA程序的回归测试方法。

图1是根据本申请实施例的JAVA程序的回归测试方法的流程图。如图1所示,该方法包括以下步骤:

步骤S101,获取差异代码以及预定函数,上述差异代码为迭代后代码文件与迭代前代码文件不同的代码内容,上述预定函数为上述差异代码直接影响的函数;

步骤S102,对上述差异代码进行静态分析,确定关联函数,上述关联函数为与上述预定函数有调用关系的函数;

步骤S103,根据上述预定函数以及上述关联函数,生成上述差异代码的回归测试报告。

上述的JAVA程序的回归测试方法,首先,获取差异代码以及上述差异代码直接影响的预定函数;然后,对上述差异代码进行静态分析,确定与上述预定函数有调用关系的关联函数;最后,根据上述预定函数以及上述关联函数,生成上述差异代码的回归测试报告。相比现有技术中,人为确定回归测试范围并进行测试,得到测试报告,造成测试效率低下的问题,本申请的上述方法中,通过对迭代前后代码文本版本存在差异的差异代码进行分析,得到因代码变动而直接受到影响的预定函数,再对差异代码进行静态分析,确定与预定函数有调用关系的关联函数,最后根据预定函数以及关联函数生成回归测试报告,实现了对迭代前后的差异代码的自动回归测试,从而保证了测试效率较高。并且,相比现有技术中为了避免缺陷的遗漏,技术人员通常会进行大范围回归,从而造成测试效率低下的问题,本申请根据直接受到差异代码影响的预定函数,以及根据静态分析得到的关联函数来得到回归测试报告,保证了回归测试的范围较为合理,缓解甚至避免了回归范围或大或小的问题,从而进一步地提升了回归测试效率。另外,由于本申请为自动回归测试,这样无需依赖技术人员的技术水平和经验,从而降低了回归范围选择中人为因素的干扰,保证了得到的回归测试报告较为客观,同时解放了人力,节省人力测试成本。

具体地,上述回归测试报告包括差异代码是否异常的结果、测试用例执行信息以及失败用例重试信息。当然,上述回归测试报告并不限于上述的内容,本领域技术人员可以根据实际需要灵活设置上述回归测试报告的内容。

一种具体的实施例中,对上述差异代码进行静态分析,确定关联函数,包括:采用类层次分析法对上述差异代码进行分析,得到初始函数调用图;根据上述差异代码,采用快速分析法对上述初始函数调用图进行优化,得到函数调用图;根据上述函数调用图,确定上述关联函数。本实施例中,先根据类层次分析法,得到初始函数调用图,由于类层次分析法可以较为简单快捷地得到初始函数调用图,但是该初始函数调用图对应的测试范围过大;在此基础上,再采用快速分析法对上述初始函数调用图进行优化,得到函数调用图,使用快速类型分析方法,优化所得的函数调用图,其主要是考虑函数可达性,因为对于该函数调用点而言,它的接收对象的可能类型必须是在程序中实例化了的类型,这样就减少了类层次分析法得到的初始函数调用图中接收对象可能类型的集合,从而进一步地保证了回归测试的测试效率较高。

为了进一步地保证较为容易地得到的上述初始函数调用图,从而进一步地保证回归测试准确性,根据本申请的再一种具体的实施例,采用类层次分析法对上述差异代码进行分析,得到初始函数调用图,包括:根据上述差异代码,确定类层次图,上述类层次图包括多个类以及各上述类的继承关系;获取各上述类对应的第一函数以及第一调用关系,上述第一调用关系为各上述第一函数之间的调用关系;在各上述类中存在父类的情况下,根据上述继承关系确定上述父类的所有子类;确定上述所有子类对应的第二函数以及第二调用关系,上述第二调用关系包括各上述第二函数之间的调用关系和/或上述第一函数与上述第二函数之间的调用关系;根据上述第一函数、上述第一调用关系、上述第二函数以及上述第二调用关系,生成上述初始函数调用图。本申请先得到类层次图,具体地,类层次图中,节点表示上述的类,边表示类之间的继承关系;再考虑子类与父类的覆写关系,得到上述初始调用图,由于类层次分析法为不用考虑类型传播、直接计算函数调用点中对象运行时可能类型的分析法,故较为容易实现,且算法较为简单,从而进一步地保证了较为简单容易得到上述初始函数调用图。

在实际的应用过程中,上述第一函数是根据函数调用点确定的函数。

根据本申请的另一种具体的实施例,采用快速分析法对上述初始函数调用图进行优化,得到函数调用图,包括:在上述初始函数调用图中存在虚函数的情况下,确定上述虚函数对应的第一预定类和/或第二预定类,上述第一预定类为上述虚函数的赋值语句中未实例化的上述类,上述第二预定类为上述赋值语句中的实例化信息不可达的上述类;从上述初始函数调用图中删除上述虚函数与上述第一预定类和/或上述第二预定类之间的调用关系,得到上述函数调用图。快速分析法的主要思想就是根据程序中的实例化信息来简化对象的可能类型集合,通过快速分析法确定接收对象的可达性,快速分析法结合了JAVA语法中的多态,简化了预定函数与关联函数的调用关系,减小了回归测试的范围,从而进一步地保证了回归测试的测试效率较高。

根据本申请的一种具体的实施例,对上述差异代码进行静态分析,确定关联函数的具体步骤如下:

步骤201:基于类层次分析方法得到初始函数调用图。类层次分析方法的主要思想是如果一个接收对象的声明类型为C,那么根据类层次分析,此接收对象的运行时可能类型就包括C以及它的所有子类类型。此时如果该虚函数调用点在其所有接收对象的可能类型中未被覆写,那么此时的虚函数调用可以转化为对父类中目标函数的直接调用。

步骤202:使用快速类型分析方法,优化步骤201所得的初始函数调用图。其主要思想是考虑函数可达性,因为对于虚函数调用点而言,它的接收对象的可能类型必须是在程序中实例化了的类型,这样就进一步减少了类层次分析中接收对象可能类型的集合。

步骤203:考虑可达函数中实例化对象的类型传播及实例化信息对可达函数内的虚函数调用中接收对象的可达性。即对函数M中的某个函数调用点x.run(),M中存在这样一系列赋值语句:u=new C(),x1=u,x2=x1,……,xn=xn-1,x=xn,即类C的实例化语句存在M中,且通过赋值进行类型传播,类C的实例化信息可到达接收对象x。

下面以一段具体的Java示例程序对上述过程进行具体说明。

上述Java示例程序如下:

由上述Java示例程序可知,类B继承于A,类C和D都继承于B,且在四个类中都定义了run方法。程序从main函数开始执行,main调用了f和g函数,具体过程为:

步骤301:当程序执行到f(a1)时,调用f函数,因为f函数中存在虚函数调用点a1.run(),对于接收对象a1而言,其声明类型为A,根据类层次分析可知,其在运行时的实际类型可以是A、B、C、D四种类型,且对于目标函数run(),类B、C、D分别覆写了run()函数,因此对于调用点a1.run(),其运行时可能有4种情况。同理,对于虚函数调用点b2.run(),因为b2的声明类型为B,类C和D都是B的子类并完成了覆写,因此运行时的情况可能有3种。由此可得图3所示的初始函数调用图。

步骤302:对于示例程序而言,程序中只实例化了类型A、B和C,所以虚函数调用点a1.run()运行时可能的类型集合就缩减到A、B和C。虚函数调用点b2.run()运行时可能的函数类型集合就缩减到B和C,由此可得优化后的图4所示的中间函数调用图。

步骤303:在main函数中,类B的实例化信息对a1而言是可达的(因为对于函数f的a1.run()调用点存在B d=new B();a1=d的赋值语句),而A和C是不可达的。由此可知,a1的运行时的可能类型就只有B,B中的run函数是可达的。对于虚函数节点b2.run()而言,分析结果不变。由此可得优化后的图5所示的函数调用图。

为了较为简单快捷地得到上述差异代码以及上述预定函数,从而进一步地方便后续的回归测试,根据本申请的又一种具体的实施例,获取差异代码以及预定函数,包括:采用分布式版本控制系统处理上述迭代前代码文件以及上述迭代后代码文件,得到上述差异代码;确定上述差异代码对应的上述预定函数。

具体地,可以通过Git(Gnu Interactive Tools,分布式版本控制系统)自带的diff(different file,差异文件)等命令,获取迭代前后版本的代码差异,得到差异代码,并进行分析,得到因代码变动而直接受到影响的预定函数,整个过程全部由程序运行完成,不存在人为因素干扰,从而进一步地保证回归测试准确性。当然,上述的分布式版本控制系统并不限于Git,还可以为其他任意可行的分布式版本控制系统。

本申请的再一种具体的实施例中,确定上述差异代码对应的上述预定函数的具体步骤如下:分析差异代码,摒弃无效的变更,如函数体中添加一个空行、删除一个无效的引用之类等,该部分不影响函数本身的功能,故不在回归测试考虑范围内,最终获得此次变动所直接影响的预定函数。

为了进一步地保证得到的回归测试报告的准确性较高,从而进一步地保证回归测试准确性,根据本申请的一种具体的实施例,根据上述预定函数以及上述关联函数,生成上述差异代码的回归测试报告,包括:根据上述预定函数以及上述关联函数,确定对应的测试用例;在存在与上述测试用例匹配的自动化测试脚本的情况下,确定上述自动化测试脚本为目标自动化测试脚本;运行上述目标自动化测试脚本,生成上述回归测试报告。

在实际的应用过程中,在敏捷开发项目中,自动化测试脚本的建设往往在第一个版本发布后已经完成,已形成测试用例和自动化测试脚本的映射关系,因此根据该关系,由测试用例挑选确定上述自动化测试脚本为目标自动化测试脚本。

根据本申请的另一种具体的实施例,在不存在与上述测试用例匹配的上述自动化测试脚本的情况下,上述方法还包括:发送提示信息,上述提示信息为提示对上述测试用例进行人工测试的信息。在匹配不到相应的自动化测试脚本时,通过发送提示信息,来提示技术人员进行人工测试,避免了造成测试信息遗漏的问题。

本申请通过以上方法实现了运用静态类型分析进行精准回归的目的。

需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

本申请实施例还提供了一种JAVA程序的回归测试装置,需要说明的是,本申请实施例的JAVA程序的回归测试装置可以用于执行本申请实施例所提供的用于JAVA程序的回归测试方法。以下对本申请实施例提供的JAVA程序的回归测试装置进行介绍。

图2是根据本申请实施例的JAVA程序的回归测试装置的示意图。如图2所示,该装置包括获取单元10、分析单元20以及生成单元30,其中,上述获取单元10用于获取差异代码以及预定函数,上述差异代码为迭代后代码文件与迭代前代码文件不同的代码内容,上述预定函数为上述差异代码直接影响的函数;上述分析单元20用于对上述差异代码进行静态分析,确定关联函数,上述关联函数为与上述预定函数有调用关系的函数;上述生成单元30用于根据上述预定函数以及上述关联函数,生成上述差异代码的回归测试报告。

上述的JAVA程序的回归测试装置中,通过上述获取单元获取差异代码以及上述差异代码直接影响的预定函数;通过上述分析单元对上述差异代码进行静态分析,确定与上述预定函数有调用关系的关联函数;通过上述生成单元根据上述预定函数以及上述关联函数,生成上述差异代码的回归测试报告。相比现有技术中,人为确定回归测试范围并进行测试,得到测试报告,造成测试效率低下的问题,本申请的上述装置中,通过对迭代前后代码文本版本存在差异的差异代码进行分析,得到因代码变动而直接受到影响的预定函数,再对差异代码进行静态分析,确定与预定函数有调用关系的关联函数,最后根据预定函数以及关联函数生成回归测试报告,实现了对迭代前后的差异代码的自动回归测试,从而保证了测试效率较高。并且,相比现有技术中为了避免缺陷的遗漏,技术人员通常会进行大范围回归,从而造成测试效率低下的问题,本申请根据直接受到差异代码影响的预定函数,以及根据静态分析得到的关联函数来得到回归测试报告,保证了回归测试的范围较为合理,缓解甚至避免了回归范围或大或小的问题,从而进一步地提升了回归测试效率。另外,由于本申请为自动回归测试,这样无需依赖技术人员的技术水平和经验,从而降低了回归范围选择中人为因素的干扰,保证了得到的回归测试报告较为客观,同时解放了人力,节省人力测试成本。

具体地,上述回归测试报告包括差异代码是否异常的结果、测试用例执行信息以及失败用例重试信息。当然,上述回归测试报告并不限于上述的内容,本领域技术人员可以根据实际需要灵活设置上述回归测试报告的内容。

根据本申请的一种具体实施例,上述分析单元包括分析模块、优化模块以及确定模块,其中,上述分析模块用于采用类层次分析法对上述差异代码进行分析,得到初始函数调用图;上述优化模块用于根据上述差异代码,采用快速分析法对上述初始函数调用图进行优化,得到函数调用图;上述确定模块用于根据上述函数调用图,确定上述关联函数。本实施例中,先根据类层次分析法,得到初始函数调用图,由于类层次分析法可以较为简单快捷地得到初始函数调用图,但是该初始函数调用图对应的测试范围过大;在此基础上,再采用快速分析法对上述初始函数调用图进行优化,得到函数调用图,使用快速类型分析方法,优化所得的函数调用图,其主要是考虑函数可达性,因为对于该函数调用点而言,它的接收对象的可能类型必须是在程序中实例化了的类型,这样就减少了类层次分析法得到的初始函数调用图中接收对象可能类型的集合,从而进一步地保证了回归测试的测试效率较高。

为了进一步地保证较为容易地得到的上述初始函数调用图,从而进一步地保证回归测试准确性,根据本申请的再一种具体的实施例,上述分析模块包括第一确定子模块、获取子模块、第二确定子模块、第三确定子模块以及生成子模块,其中,上述第一确定子模块用于根据上述差异代码,确定类层次图,上述类层次图包括多个类以及各上述类的继承关系;上述获取子模块用于获取各上述类对应的第一函数以及第一调用关系,上述第一调用关系为各上述第一函数之间的调用关系;上述第二确定子模块用于在各上述类中存在父类的情况下,根据上述继承关系确定上述父类的所有子类;上述第三确定子模块用于确定上述所有子类对应的第二函数以及第二调用关系,上述第二调用关系包括各上述第二函数之间的调用关系和/或上述第一函数与上述第二函数之间的调用关系;上述生成子模块用于根据上述第一函数、上述第一调用关系、上述第二函数以及上述第二调用关系,生成上述初始函数调用图。本申请先得到类层次图,具体地,类层次图中,节点表示上述的类,边表示类之间的继承关系;再考虑子类与父类的覆写关系,得到上述初始调用图,由于类层次分析法为不用考虑类型传播、直接计算函数调用点中对象运行时可能类型的分析法,故较为容易实现,且算法较为简单,从而进一步地保证了较为简单容易得到上述初始函数调用图。

在实际的应用过程中,上述第一函数是根据函数调用点确定的函数。

根据本申请的另一种具体的实施例,如图4所示,上述优化模块包括第四确定子模块以及删除子模块,其中,上述第四确定子模块用于在上述初始函数调用图中存在虚函数的情况下,确定上述虚函数对应的第一预定类和/或第二预定类,上述第一预定类为上述虚函数的赋值语句中未实例化的上述类,上述第二预定类为上述赋值语句中的实例化信息不可达的上述类;上述删除子模块用于从上述初始函数调用图中删除上述虚函数与上述第一预定类和/或上述第二预定类之间的调用关系,得到上述函数调用图。快速分析法的主要思想就是根据程序中的实例化信息来简化对象的可能类型集合,通过快速分析法确定接收对象的可达性,快速分析法结合了JAVA语法中的多态,简化了预定函数与关联函数的调用关系,减小了回归测试的范围,从而进一步地保证了回归测试的测试效率较高。

根据本申请的又一种具体的实施例,上述差异代码进行静态分析,确定关联函数的具体步骤如下:

步骤201:基于类层次分析方法得到初始函数调用图。类层次分析方法的主要思想是如果一个接收对象的声明类型为C,那么根据类层次分析,此接收对象的运行时可能类型就包括C以及它的所有子类类型。此时如果该虚函数调用点在其所有接收对象的可能类型中未被覆写,那么此时的虚函数调用可以转化为对父类中目标函数的直接调用。

步骤202:使用快速类型分析方法,优化步骤201所得的初始函数调用图。其主要思想是考虑函数可达性,因为对于虚函数调用点而言,它的接收对象的可能类型必须是在程序中实例化了的类型,这样就进一步减少了类层次分析中接收对象可能类型的集合。

步骤203:考虑可达函数中实例化对象的类型传播及实例化信息对可达函数内的虚函数调用中接收对象的可达性。即对函数M中的某个函数调用点x.run(),M中存在这样一系列赋值语句:u=new C(),x1=u,x2=x1,……,xn=xn-1,x=xn,即类C的实例化语句存在M中,且通过赋值进行类型传播,类C的实例化信息可到达接收对象x。

下面以一段具体的Java示例程序对上述过程进行具体说明。

上述Java示例程序如下:

由上述Java示例程序可知,类B继承于A,类C和D都继承于B,且在四个类中都定义了run方法。程序从main函数开始执行,main调用了f和g函数,具体过程为:

步骤301:当程序执行到f(a1)时,调用f函数,因为f函数中存在虚函数调用点a1.run(),对于接收对象a1而言,其声明类型为A,根据类层次分析可知,其在运行时的实际类型可以是A、B、C、D四种类型,且对于目标函数run(),类B、C、D分别覆写了run()函数,因此对于调用点a1.run(),其运行时可能有4种情况。同理,对于虚函数调用点b2.run(),因为b2的声明类型为B,类C和D都是B的子类并完成了覆写,因此运行时的情况可能有3种。由此可得图3所示的初始函数调用图。

步骤302:对于示例程序而言,程序中只实例化了类型A、B和C,所以虚函数调用点a1.run()运行时可能的类型集合就缩减到A、B和C。虚函数调用点b2.run()运行时可能的函数类型集合就缩减到B和C,由此可得优化后的图4所示的中间函数调用图。

步骤303:在main函数中,类B的实例化信息对a1而言是可达的(因为对于函数f的a1.run()调用点存在B d=new B();a1=d的赋值语句),而A和C是不可达的。由此可知,a1的运行时的可能类型就只有B,B中的run函数是可达的。对于虚函数节点b2.run()而言,分析结果不变。由此可得优化后的图5所示的函数调用图。

为了较为简单快捷地得到上述差异代码以及上述预定函数,从而进一步地方便后续的回归测试,根据本申请的又一种具体的实施例,上述获取单元包括采用模块以及第一确定模块,其中,上述采用模块用于采用分布式版本控制系统处理上述迭代前代码文件以及上述迭代后代码文件,得到上述差异代码;上述第一确定模块用于确定上述差异代码对应的上述预定函数。

具体地,可以通过Git自带的diff等命令,获取迭代前后版本的代码差异,得到差异代码,并进行分析,得到因代码变动而直接受到影响的预定函数,整个过程全部由程序运行完成,不存在人为因素干扰,从而进一步地保证回归测试准确性。当然,上述的分布式版本控制系统并不限于Git,还可以为其他任意可行的分布式版本控制系统。在本申请的实施例中,确定上述差异代码对应的上述预定函数的具体步骤如下:分析差异代码,摒弃无效的变更,如函数体中添加一个空行、删除一个无效的引用之类等,该部分不影响函数本身的功能,故不在回归测试考虑范围内,最终获得此次变动所直接影响的预定函数。

为了进一步地保证得到的回归测试报告的准确性较高,从而进一步地保证回归测试准确性,根据本申请的一种具体的实施例,上述生成单元包括第二确定模块以及第三确定模块,其中,上述第二确定模块用于根据上述预定函数以及上述关联函数,确定对应的测试用例;上述第三确定模块用于在存在与上述测试用例匹配的自动化测试脚本的情况下,确定上述自动化测试脚本为目标自动化测试脚本;运行上述目标自动化测试脚本,生成上述回归测试报告。

在实际的应用过程中,在敏捷开发项目中,自动化测试脚本的建设往往在第一个版本发布后已经完成,已形成测试用例和自动化测试脚本的映射关系,因此根据该关系,由测试用例挑选确定上述自动化测试脚本为目标自动化测试脚本。

根据本申请的另一种具体的实施例,上述装置还包括发送单元,上述发送单元用于在不存在与上述测试用例匹配的上述自动化测试脚本的情况下,发送提示信息,上述提示信息为提示对上述测试用例进行人工测试的信息。在匹配不到相应的自动化测试脚本时,通过发送提示信息,来提示技术人员进行人工测试,避免了造成测试信息遗漏的问题。

上述JAVA程序的回归测试装置包括处理器和存储器,上述获取单元、上述分析单元以及上述生成单元等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。

处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来解决现有技术中JAVA程序的回归测试的测试效率低下的问题。

存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM),存储器包括至少一个存储芯片。

本发明实施例提供了一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时实现上述JAVA程序的回归测试方法。

本发明实施例提供了一种处理器,上述处理器用于运行程序,其中,上述程序运行时执行上述JAVA程序的回归测试方法。

本发明实施例提供了一种设备,设备包括处理器、存储器及存储在存储器上并可在处理器上运行的程序,处理器执行程序时实现至少以下步骤:

步骤S101,获取差异代码以及预定函数,上述差异代码为迭代后代码文件与迭代前代码文件不同的代码内容,上述预定函数为上述差异代码直接影响的函数;

步骤S102,对上述差异代码进行静态分析,确定关联函数,上述关联函数为与上述预定函数有调用关系的函数;

步骤S103,根据上述预定函数以及上述关联函数,生成上述差异代码的回归测试报告。

本文中的设备可以是服务器、PC、PAD、手机等。

本申请还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化有至少如下方法步骤的程序:

步骤S101,获取差异代码以及预定函数,上述差异代码为迭代后代码文件与迭代前代码文件不同的代码内容,上述预定函数为上述差异代码直接影响的函数;

步骤S102,对上述差异代码进行静态分析,确定关联函数,上述关联函数为与上述预定函数有调用关系的函数;

步骤S103,根据上述预定函数以及上述关联函数,生成上述差异代码的回归测试报告。

本申请实施例还提供了一种电子设备,包括一个或多个处理器,存储器以及一个或多个程序,其中,上述一个或多个程序被存储在上述存储器中,并且被配置为由上述一个或多个处理器执行,上述一个或多个程序包括用于执行上述的方法。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如上述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

上述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

上述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例上述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

从以上的描述中,可以看出,本申请上述的实施例实现了如下技术效果:

1)、本申请的上述的JAVA程序的回归测试方法,首先,获取差异代码以及上述差异代码直接影响的预定函数;然后,对上述差异代码进行静态分析,确定与上述预定函数有调用关系的关联函数;最后,根据上述预定函数以及上述关联函数,生成上述差异代码的回归测试报告。相比现有技术中,人为确定回归测试范围并进行测试,得到测试报告,造成测试效率低下的问题,本申请的上述方法中,通过对迭代前后代码文本版本存在差异的差异代码进行分析,得到因代码变动而直接受到影响的预定函数,再对差异代码进行静态分析,确定与预定函数有调用关系的关联函数,最后根据预定函数以及关联函数生成回归测试报告,实现了对迭代前后的差异代码的自动回归测试,从而保证了测试效率较高。并且,相比现有技术中为了避免缺陷的遗漏,技术人员通常会进行大范围回归,从而造成测试效率低下的问题,本申请根据直接受到差异代码影响的预定函数,以及根据静态分析得到的关联函数来得到回归测试报告,保证了回归测试的范围较为合理,缓解甚至避免了回归范围或大或小的问题,从而进一步地提升了回归测试效率。另外,由于本申请为自动回归测试,这样无需依赖技术人员的技术水平和经验,从而降低了回归范围选择中人为因素的干扰,保证了得到的回归测试报告较为客观,同时解放了人力,节省人力测试成本。

2)、本申请的上述的JAVA程序的回归测试装置中,通过上述获取单元获取差异代码以及上述差异代码直接影响的预定函数;通过上述分析单元对上述差异代码进行静态分析,确定与上述预定函数有调用关系的关联函数;通过上述生成单元根据上述预定函数以及上述关联函数,生成上述差异代码的回归测试报告。相比现有技术中,人为确定回归测试范围并进行测试,得到测试报告,造成测试效率低下的问题,本申请的上述装置中,通过对迭代前后代码文本版本存在差异的差异代码进行分析,得到因代码变动而直接受到影响的预定函数,再对差异代码进行静态分析,确定与预定函数有调用关系的关联函数,最后根据预定函数以及关联函数生成回归测试报告,实现了对迭代前后的差异代码的自动回归测试,从而保证了测试效率较高。并且,相比现有技术中为了避免缺陷的遗漏,技术人员通常会进行大范围回归,从而造成测试效率低下的问题,本申请根据直接受到差异代码影响的预定函数,以及根据静态分析得到的关联函数来得到回归测试报告,保证了回归测试的范围较为合理,缓解甚至避免了回归范围或大或小的问题,从而进一步地提升了回归测试效率。另外,由于本申请为自动回归测试,这样无需依赖技术人员的技术水平和经验,从而降低了回归范围选择中人为因素的干扰,保证了得到的回归测试报告较为客观,同时解放了人力,节省人力测试成本。

以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号