基于库和客户项目双侧变更信息的API用例自动化更新方法

文档序号:34013496发布日期:2023-04-29 23:23阅读:82来源:国知局
基于库和客户项目双侧变更信息的API用例自动化更新方法

本发明涉及一种基于库和客户项目双侧变更信息的api用例自动化更新方法,在软件项目在依赖软件库迁移到新版本时,项目中对应软件库的客户代码应该如何进行自动化更新以适应新版本的变化,属于计算机。


背景技术:

1、在当前软件开发过程中,使用软件库来实现特定功能,或直接使用框架来搭建项目已经成为许多开发团队的优先选择。无论是库,还是框架,其最常见的使用方式是通过调用api(application programming interface)来使用其提供的功能。而作为一种软件产品,它们同样需要持续不断地开发与维护。在版本更迭中,无论是为了漏洞的修复还是功能的完善,都会对api进行淘汰和更新。此时,依赖该软件库的客户程序需要更新使用了过期api的代码,才能使用更加丰富和完善的功能。但手动修改过期api用例,需要开发人员查询文档,阅读代码,费时费力,因此研究人员提出了辅助开发者更新过期api用例的自动化工具和方法。这些方法可以分为两种类型:一种以库的相关信息为主,利用库的变更、文档或注释等信息来搜索或推理得到api用例的变化规则,我们可以称其为基于库的api用例更新;另一种是以客户项目提供的信息为主,从代码变更历史中挖掘出与api用例更新相关的变化规则,称为基于更新实例的api用例更新。

2、基于库的api用例更新常常只能挖掘到简单的迁移规则,例如类名改变,包名改变,方法参数数量改变等,难以修改组合使用api的代码,而基于更新实例的api用例更新,受限于挖掘数据集的限制,往往缺少非常用api的更新方案。


技术实现思路

1、发明目的:针对现有技术中存在的问题与不足,本发明提供一种api更新规则挖掘和api用例自动化更新的方法。该发明结合库与客户项目双侧变更信息来挖掘api更新规则,并在客户项目中自动搜索待更新代码,匹配合适规则并排序,自动化修改代码,减少开发人员将应用程序依赖库版本迁移到新版本时所需的工作。

2、技术方案:一种基于库和客户项目双侧变更信息的api用例自动化更新方法,包括基于库侧变更信息的简单更新规则抽取策略,基于api生命周期的实例更新规则挖掘方法,基于映射的泛化关系判断和基于泛化关系的更新实例规则冗余去除方法,综合泛化支持度和映射匹配度的实例更新规则评估策略,以及基于抽象语法树节点映射的编辑操作移植方法。具体包含以下步骤:

3、步骤1,分析目标软件库相邻版本间的api变化,提取api在各个版本的变更操作并存储为api生命周期信息,同时利用变更信息生成简单更新规则。

4、步骤2,在客户项目变更历史中进行搜索,根据api生命周期信息抽取演化相关变更代码,生成实例更新规则。

5、步骤3,对实例更新规则进行冗余去除和泛化支持度计算。

6、步骤4,使用所有更新规则涉及的过期api信息,对未更新的客户项目进行待更新目标检测定位。

7、步骤5,匹配可用更新规则,并进行评估排序。

8、步骤6,应用更新规则进行更新。

9、所述步骤1中,利用目标软件库相邻版本间发行包的增量变化,分析得到api生命周期信息和简单更新规则,api生命周期信息为后续的实例更新规则挖掘提供支持,简单更新规则可转化为具体的编辑操作对过期api使用代码进行修改,这种简单的更新规则可以应对相当数量的api过期情况。具体实现过程为:

10、11)下载目标软件库的发行包,并读取版本序列信息。

11、12)将相邻两个版本jar包作为分析对象,使用两个开源的jar包差异分析工具clirr和japicmp对两个版本的jar包进行分析。

12、13)分析clirr和japicmp的输出结果,提取常见的变更生成简单更新规则。

13、14)分析clirr和japicmp的输出结果,综合得到版本区间内class、interface、constructor、field和method五种api类型关于deprecated、removed、hidden、no-longer-deprecated、added六种操作类型的api变更集合。

14、15)收集所有相邻版本间的api变更集合,得到api的生命周期信息。

15、所述步骤2中,在客户项目的变更历史中进行更新实例规则的挖掘,该过程产出比简单更新规则更为复杂的更新规则,旨在处理简单更新规则不能应对的情况,比如api组合调用中多个api同时过期的情况。具体实现过程为:

16、21)快速定位版本演化相关代码变更位置。具体实现过程为:

17、211)在变更历史中找到目标软件库版本(旧版本vold和新版本vnew)发生变更的提交,收集提交中发生的代码变更。

18、212)找到变更中的方法调用、成员变量使用和新建对象操作位置。解析得到对应的api签名后,利用生命周期信息判断是否已过期。如是,该api签名位置定为版本演化相关的关键位置。

19、213)如果关键位置已被记录在已搜集用例中,则不执行后续逻辑。

20、214)解析代码文件变更后的内容,并根据签名将提交前后的各个成员变量和方法声明一一配对。如果关键位置在成员变量初始化处,则将配对的成员变量的初始化内容作为配对用例,返回结果。如果在方法声明体内,则进行方法体内的配对用例搜集。

21、22)对方法体代码的抽象语法树进行节点映射,具体实现过程为:

22、221)使用changedistiller的节点映射逻辑对方法体抽象语法树中的节点进行基础映射,得到初始锚点集合。

23、222)寻找两边抽象语法树中具备唯一特征且特征相同的节点,添加到锚点集合。唯一特征是指节点在语法树中包含其他节点所没有的唯一api调用、唯一类型和唯一内容等。

24、223)对锚点集合进行过滤,将满足如下规则的映射移除:a)映射双方节点类型不同;b)映射双方均为modifier类型节点;c)映射双方均为statement类型节点;d)映射双方均为literalexpr类型节点;e)映射双方均为simplename类型节点且具有不同的文本内容。

25、224)根据锚点集合初始化映射集合。在语法树中,以子节点的角色和位置作为连接父子节点的边,从锚点出发,将相同边值连接的相邻节点加入映射集合,将映射关系扩散。此时映射集合中的映射关系是多对多的,即一方语法树的一个节点可以与另一方语法树上多个节点存在映射。

26、225)利用km算法收束映射集合中的多对多映射关系,转为一对一映射。而使用km算法需要对节点和节点之间的连接权重进行评估,两个节点之间连接权值计算方式如下:

27、wpq=nspq+∫t∈tsct*stpqdt

28、nspq是两个节点p和q双方父节点存在唯一映射节点对的数量,sct是特征t的匹配系数,stpq是节点p和q在特征t上的相同值,当两节点在特征t上相同时,取值为1,否则取值为0。t是选取的特征集合,如方法调用、构造函数调用、成员变量访问等。

29、23)方法体内根据数据依赖关系和映射关系搜集配对的变更前后的api用例进行配对用例搜集,具体实现过程为:

30、231)初始化变更前关键语句集合,加入关键位置所在语句。

31、232)对变更前关键语句集合基于数据依赖关系进行扩展。

32、233)对于扩展后的集合,根据映射关系,得到集合中语句在变更后代码中的映射节点,得到变更后关键语句集合。

33、234)对变更后关键语句集合基于数据依赖关系进行扩展。

34、235)如果234)执行时存在新增的变更后关键语句,则通过映射关系得到映射语句。如果映射语句不在变更前关键语句集合中,则加入该集合,并跳转至232)再次扩展变更前的关键语句集合。

35、236)将变更前后两个关键语句集合按照原有顺序排好,得到配对的api用例。

36、24)构建用例并保存,主要执行用例精简,api移除识别,版本判断识别,最后序列化保存实例更新规则。具体实现过程为:

37、241)精简并检查用例。对于23)中获得的变更前后api用例,重新进行节点映射。删除彼此映射且内容相同的语句,得到精简后的api用例对。

38、242)版本变更相关判断。在241)精简后的用例对中,分析api使用的变更,如果存在过期api被移除的情况,且新引入api未过期的情况,则判定用例变更与软件库版本变更相关。

39、243)根据api调用情况重新分析规则对应的版本。用例对中减少的过期api,并非都是在新版本vnew时被淘汰,可能在更前的版本时就已经过期,因此为了提高规则使用条件的精确性,还要针对用例对中移除的过期api重新分析规则对应的版本。在所有移除的过期api中,最早过期的api在版本vdmin时过期,最晚过期的api在版本vdmax中过期,则令真实旧版本vrold=vdmin-1,真实新版本vrnew=vdmax。将符合条件的用例对保存为实例更新规则,记录用例对移除的过期api和真实目标版本(vrold,vrnew)。

40、244)保存实例的更新规则至更新规则数据库,更新规则数据库是挖掘过程中保存更新规则的数据库,并为之后更新规则的搜索提供支持。

41、所述步骤3,对实例更新规则进行冗余去除和泛化支持度计算。具体实现过程为:

42、31)初步去除冗余。在历史变更中,常出现一次修改重复出现(commit合并)或多处代码内容相同的情况,因此步骤2中搜集的实例规则也存在大量的文本相同的重复冗余。去除相同项目下相同变更前后用例的冗余。

43、32)泛化关系是指两个实例更新规则之间存在的一种二元关系,如果规则a和规则b移除的过期api集合相同,且a的变更前后用例完全被b的变更前后用例包含,则认为规则a泛化规则b。其中包含是指两个用例之间的关系,当用例u与用例p通过节点映射后,用例u中所有语法树节点在用例p中都存在映射节点,用例p包含用例u。先将规则按照移除的过期api集合分组,组内两两进行比较,得到泛化关系集合。

44、33)根据泛化关系进行分组,进一步去除冗余。当两个实例更新规则存在互相泛化的情况时,认为二者等价。将等价的实例更新规则聚合为一组,选择第一个作为代表用例。

45、34)统计实例更新规则的泛化支持度。当一个实例更新规则是许多其他规则的泛化规则时,说明其包含的变更操作更具普遍性。因此统计一个规则泛化其他规则的数目作为泛化支持度g,作为之后应用时一个规则排序的重要评分依据。

46、所述步骤4中,使用所有更新规则涉及的过期api信息,对未更新的客户项目进行待更新目标检测定位。在项目空间中寻找可以更新的目标用例。具体实现过程为:

47、41)从更新规则数据库中查询当前版本可用的规则集合,将它们移除的过期api取并集,得到可更改的api集合,通过这些api的简单名称,在代码文件中进行文本搜索,找到疑似关键位置,并通过解析api签名可以判断是否是需要更新的关键位置。

48、42)对于41)中找到的关键位置,如果在成员变量初始值中,则将该初始值表达式作为目标用例;如果节点在方法体中,则基于数据依赖关系的进行扩展,得到目标关键语句集合,排序后作为初始的目标用例等待更新。

49、所述步骤5中,基于步骤4得到的目标用例匹配合适的规则,并根据实例规则之间的泛化支持度和与目标用例的映射匹配度综合评估排序。具体实现过程为:

50、51)获取候选更新规则集合。使用43)得到关键节点对应的api签名,在更新规则数据库中搜索与其相关的更新规则。通过将目标用例和实例规则变更前用例进行映射,筛选出可以映射到关键节点的规则。

51、52)简单更新规则优先级最高,对实例更新规则进行分数评估。评估方式如下:

52、521)根据51)中的映射结果分析,得到映射节点对的数量nmatched,进而得到规则与目标用例的匹配程度m=nmatched/no。no是变更前用例总的节点数目。

53、522)计算连接桥个数。在目标用例和变更前用例的映射节点对中,如果存在一对类型相同且没有结构性差异的映射节点对(nt,no),no在变更后用例中也存在映射节点nn,则称(nt,no,nn)三个节点以及其映射关系为连接桥。统计连接桥个数nb。

54、523)计算实例更新规则中变更前后用例语句数量的差值nsd。

55、524)读取34)中计算的实例更新规则的泛化支持度g。

56、53)根据(g,m,nb,-nsd)的字典序对实例更新规则进行降序排序,生成规则队列,将简单更新规则加到队列队首。之后依次取出进行步骤6对目标用例进行更新。

57、所述步骤6,使用更新规则对目标用例进行更新。如果是简单更新规则,则使用对应类型的简单更新器对关键节点进行代码修改,如果是实例更新规则,则使用基于抽象语法树节点映射的编辑操作移植方法修改代码,具体实现过程为:

58、61)如果更新规则是实例规则,则利用51)中的映射结果,移除目标用例中不存在映射的语句,精简目标用例,后令目标用例重新与变更前用例进行节点映射。

59、62)利用连接桥抽取编辑操作,具体实现如下:

60、621)层次遍历目标用例节点,寻找连接桥。

61、622)从连接桥中抽取编辑操作。如果no与nt节点类型不同,视为替换操作。如果no与nt节点类型相同,则构建高度为2的简单子树(no与nt作为根节点,其直接子节点作为叶子节点),通过gumtreediff工具抽取这两个简单子树的变更。抽取变更时,将存在映射关系或数据等价的节点视为相同节点。

62、623)转换gumtreediff工具输出的diff结果,得到对nt的操作。

63、63)应用编辑操作,细粒度修改目标用例。当插入变更后用例中的变量时,根据数据节点的映射关系转义为等价的目标用例中的变量。更新目标用例的上下文信息。

64、64)插入在编辑操作过程中未曾使用的语句,根据已移植到目标用例的节点和语句在变更后用例中的相对位置,定位在目标用例节点中的插入位置。

65、65)删除仍旧存在于断桥集合中的断桥节点。

66、66)展示最终更新结果。

67、本发明与现有技术相比具有如下优点:

68、(1)本发明提出利用库和客户项目双侧变更信息的更新规则挖掘方法,能够在保证规则准确性的情况下,尽可能挖掘到更多的更新规则,提高工具可更新代码的数量。

69、(2)本发明提出的泛化支持度以及映射匹配度的规则排序方法,兼具规则的普遍性和特殊性,使更合适的规则率先展示,允许用户依次选择查看,使用方便,快速高效。

70、(3)本发明提出基于语法树节点映射的代码更新方法,通过对不同层次节点的抽象,在尽量保持原始代码的结构下更准确地修改代码,减少了用户二次修改的工作量。

71、(4)本发明提出的基于路径扩散的节点映射改进方法,利用类型信息、语法节点身份信息和api调用信息,提高了节点映射的丰富度和准确度,使不同项目之间的代码之间可以更为精确地进行映射,相比于使用原有映射逻辑,本方法既能提高更新规则的去冗余效率,也能提高实例更新规则的应用成功率。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1