一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于调用关系的代码变更影响范围分析方法及系统与流程

2021-10-29 22:49:00 来源:中国专利 TAG:调用 变更 关系 代码 影响


1.本发明涉及软件测试技术领域,尤其涉及一种基于调用关系的代码变更影响范围分析方法及系统。


背景技术:

2.当前软件功能不断增加和复杂性的提高,软件的代码的量不断增加。为了升级软件服务以及修复漏洞,在很多场景下,研发人员需要对现有代码进行变更。但是由于软件本身越来越复杂,而且很多代码还隐藏着调用与被调用的关系,导致研发人员在修改代码后不能确定修改内容是否会对软件其他部分造成影响,需要测试人员全面的考虑到代码变更的影响范围并进行测试,如果测试不全面,可能导致上线后出现问题。
3.现有技术中测试人员分析代码变更所带来的影响一般依靠人工分析、通过语法与词法分析或搜索目标符号方法。其中,人工分析方法需要测试人员人工分析寻找代码变更影响范围,以设计全面的测试用例保证测试的全面和质量。不过,因为现在代码量不断迭代,研发人员要对代码逻辑及结构理解也越来越复杂,代码复杂度很高时很难分析变更代码影响范围,人工的进行分析费时费力,而且也会出现遗漏的情况,所以说效率非常低;通过语法与词法分析方法进行,或者通过搜索目标符号(函数、方法、变量等)影响的范围文件,搜索到的结构可能包括了冗余的数据,实现起来难度很大而且无法对代码存在条件分支关系的情况下进行准确的影响范围分析,而且存在调用关系时的遗漏。


技术实现要素:

4.为解决现有技术的不足,本发明提出一种基于调用关系的代码变更影响范围分析方法及系统,可以很准确的定位分析出代码变更行对于其他代码的影响范围,尤其是对于存在调用关系以及多条件分支情况下的代码影响范围分析更加准确,可以有效的减少传统方法进行代码变更影响范围分析的冗余数据,以及改善存在调用关系以及多条件分支情况下影响范围的数据的准确性。
5.为实现以上目的,本发明所采用的技术方案包括:
6.一种基于调用关系的代码变更影响范围分析方法,其特征在于,包括:
7.比对变更代码文件与当前版本代码文件,解析获得变更代码行号和不同分支下条件分支代码行号范围;
8.建立基于条件分支函数的代码调用关系;
9.建立变更代码影响模型;
10.建立输入输出变量名行号关系;
11.使用所述条件分支代码行号范围、代码调用关系、变更代码影响模型和输入输出变量名行号关系分析获得所述变更代码行号所对应的全部影响范围代码行号。
12.进一步地,所述使用所述条件分支代码行号范围、代码调用关系、变更代码影响模型和输入输出变量名行号关系分析获得所述变更代码行号所对应的全部影响范围代码行
号包括:
13.查询变更代码影响模型下的变更代码影响范围数据;
14.判断变更代码影响范围数据是否影响输入输出变量值;
15.当变更代码影响范围数据不影响输入输出变量值时,组装变更代码影响范围数据获得全部影响范围代码行号;
16.当变更代码影响范围数据影响输入输出变量值时,通过输入输出变量名行号关系与代码调用关系查询当前条件分支代码行号范围内存在输入输出变量值的后续行范围数据;
17.组装变更代码影响范围数据和后续行范围数据获得全部影响范围代码行号。
18.进一步地,所述建立基于条件分支函数的代码调用关系包括:
19.将变更代码行号和不同分支下条件分支代码行号范围使用java源码进行编译生成class文件;
20.使用java字节码解析,获取基于条件分支函数的代码调用关系,所述函数所涉及的子节点信息包括代码分支条件所在行、函数所在代码行、所属文件名、函数内部所有代码行、是否影响输入参数以及调用的函数信息。
21.进一步地,所述建立变更代码影响模型包括:
22.解析变更代码行号下代码行是否影响输入输出变量值;
23.当变更代码行号下代码行具有函数调用关系时,查询该函数调用关系是否影响输入输出变量值;
24.将受到影响的输入输出变量值组装为变更代码影响模型,所述变更代码影响模型所涉及的参数包括变更代码是否改变输入参数、变更代码行号和输入输出变量名称。
25.进一步地,所述建立输入输出变量名行号关系包括:
26.根据变更代码影响模型查询函数调用关系下受到变更影响的所有相关代码行;
27.判断相关代码行是否属于不同分支,若属于不同分支,则从相关代码行中去除其他分支下的代码;
28.进一步判断相关代码行是否受到输入输出变量值影响,获得相关代码行中含有输入输出变量名的部分;
29.比对含有输入输出变量名的变更代码行号和含有输入输出变量名的后续行号并建立行号关系。
30.本发明还涉及一种基于调用关系的代码变更影响范围分析系统,其特征在于,包括:
31.变更代码预处理模块,用于解析获得变更代码行号和不同分支下条件分支代码行号范围;
32.代码调用关系生成模块,用于建立基于条件分支函数的代码调用关系;
33.变更代码影响模型生成模块,用于建立变更代码影响模型;
34.输入输出变量名行号关系生成模块,用于建立输入输出变量名行号关系;
35.影响范围代码行号分析模块,用于分析获得所述变更代码行号所对应的全部影响范围代码行号。
36.进一步地,所述影响范围代码行号分析模块包括:
37.变更代码影响范围数据判断子模块,用于判断变更代码影响范围数据是否影响输入输出变量值。
38.本发明还涉及一种计算机可读存储介质,其特征在于,所述存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述的方法。
39.本发明还涉及一种电子设备,其特征在于,包括处理器和存储器;
40.所述存储器,用于存储变更代码文件与当前版本代码文件;
41.所述处理器,用于通过调用变更代码文件与当前版本代码文件,执行上述的方法。
42.本发明的有益效果为:
43.采用本发明所述基于调用关系的代码变更影响范围分析方法及系统,可以很准确的定位分析出代码变更行对于其他代码的影响范围,对于存在调用关系以及多条件分支情况下的代码影响范围分析更加准确,可以有效的减少传统其他方法进行代码变更影响范围分析的冗余数据,以及存在调用关系以及多条件分支情况下的影响范围的数据的准确性,有助于提高影响范围分析数据的准确度和效率,解决影响范围冗余数据多和代码调用函数关系时影响范围计算不准确的问题。
附图说明
44.图1为本发明基于调用关系的代码变更影响范围分析方法流程示意图。
45.图2为本发明基于调用关系的代码变更影响范围分析系统结构示意图。
具体实施方式
46.为了更清楚的理解本发明的内容,将结合附图和实施例详细说明。
47.本发明第一方面涉及一种如图1所示的基于调用关系的代码变更影响范围分析方法,包括:
48.比对变更代码文件与当前版本代码文件,解析获得变更代码行号和不同分支下条件分支代码行号范围;
49.建立基于条件分支函数的代码调用关系,特别是包括将变更代码行号和不同分支下条件分支代码行号范围使用java源码进行编译生成class文件;使用java字节码解析,获取基于条件分支函数的代码调用关系,所述函数所涉及的子节点信息包括代码分支条件所在行、函数所在代码行、所属文件名、函数内部所有代码行、是否影响输入参数以及调用的函数信息;
50.建立变更代码影响模型,特别是包括解析变更代码行号下代码行是否影响输入输出变量值;当变更代码行号下代码行具有函数调用关系时,查询该函数调用关系是否影响输入输出变量值;将受到影响的输入输出变量值组装为变更代码影响模型,所述变更代码影响模型所涉及的参数包括变更代码是否改变输入参数、变更代码行号和输入输出变量名称;
51.建立输入输出变量名行号关系,特别是包括判断相关代码行是否属于不同分支,若属于不同分支,则从相关代码行中去除其他分支下的代码;进一步判断相关代码行是否受到输入输出变量值影响,获得相关代码行中含有输入输出变量名的部分;比对含有输入输出变量名的变更代码行号和含有输入输出变量名的后续行号并建立行号关系;
52.查询变更代码影响模型下的变更代码影响范围数据;
53.判断变更代码影响范围数据是否影响输入输出变量值;
54.当变更代码影响范围数据不影响输入输出变量值时,组装变更代码影响范围数据获得全部影响范围代码行号;
55.当变更代码影响范围数据影响输入输出变量值时,通过输入输出变量名行号关系与代码调用关系查询当前条件分支代码行号范围内存在输入输出变量值的后续行范围数据;
56.组装变更代码影响范围数据和后续行范围数据获得全部影响范围代码行号。
57.本发明还涉及一种如图2所示结构的基于调用关系的代码变更影响范围分析系统,包括:
58.变更代码预处理模块,用于解析获得变更代码行号和不同分支下条件分支代码行号范围;
59.代码调用关系生成模块,用于建立基于条件分支函数的代码调用关系;
60.变更代码影响模型生成模块,用于建立变更代码影响模型;
61.输入输出变量名行号关系生成模块,用于建立输入输出变量名行号关系;
62.影响范围代码行号分析模块,用于分析获得所述变更代码行号所对应的全部影响范围代码行号。
63.使用上述系统可以执行上述方法,以分析某一单行代码为例,具体可以包括以下执行步骤:
64.s1、通过代码平台获取用户提交代码变更文件,通过git diff文件计算变更代码行号。
65.s2、通过java字节码技术解析不同分支下条件分支代码行号范围,并按照不同文件名建立关系,比如(“/com/base/apply.java”,[2,6,8,9,11])。
[0066]
s3、基于java的asm字节码解析技术建立基于条件分支函数的代码调用关系,每个函数的子节点信息包括代码分支条件所在行、函数所在代码行、所属文件名、函数内部所有代码行、是否影响输入参数以及调用的函数信息。每个函数调用关系可以为tree类型数据结构。
[0067]
s4、根据代码变更行代码行搜索s3中的代码调用关系里的函数所在代码行,若没有查询到函数调用则直接解析当前代码行是否影响输入输出变量值。若查询到存在函数调用,则进一步查询函数调用关系数据是否影响输入变量值。
[0068]
s5、建立变更代码影响模型,该模型的参数包括变更代码是否改变输入参数、变更代码行号和输入输出变量名称。
[0069]
s6、建立方法内部变更行号与引用输入输出变量名的变更行后续行的行号关系。根据s5获取的变更代码影响模型,s3获取的代码调用关系中函数内部代码行号查询当前函数变更影响行(相关代码行)下所有的代码。根据s2获取的不同分支下条件分支代码行号范围,判断当前变更代码是否处于分支代码范围,若是则获取其他分支的范围行,并从相关代码行中去除其他分支下的代码。需要注意的是需要先找到变更代码所在的文件名,再根据文件名查询分支范围,比如(“com/pop/mh/kk.java”,{[1,2.3],[6,,8,11]),若当前代码变更行为2,变更影响行下面的所有行为[2,6,8,9,18],则当前变更影响行下面的所有的代码
行则为[2,9,18]。
[0070]
s7、根据变更代码影响模型里的输入输出变量名判断是否存在影响,若输入输出变量值有影响则查询上述获取的变更影响行下面的所有行的代码,获取含有输入输出变量名的代码行。如输入输出变量值没有影响,则当前代码行影响范围计算完成,跳到s13。
[0071]
s8、建立方法内部变更行号与变更行的后续行含有输入输出变量名的代码行的行号关系,该关系包括了文件名、方法名,如(“com/push/m.java”,”func”,”2”,[9,10,11])。
[0072]
s9、根据s8获取的输入输出变量名行号关系,根据行号、文件名依次查询s3获取的基于条件分支函数代码调用关系的函数,若查询到且该函数会影响输入输出变量值,则获取该函数。
[0073]
s10、根据s9中的函数的入参,查询该函数的所有内部代码行,获取引用到该参数的所有代码行(函数内部的代码行),若当前变更代码若处于分支代码范围,则获取其他分支的范围行,那么引用到该参数的所有代码行需要去除其他分支的范围行。
[0074]
s11、建立方法内部变更行号与变更行后续行含有输入输出变量名的代码行的行号关系,特别是也需要根据文件名来建立关系。
[0075]
s12、重复s9,直到没有函数调用或者函数不影响输入输出变量结束,最后得到的结果会是很多文件名与代码变更影响行的关系map数据。
[0076]
s13、组装所有的代码变更影响范围数据,根据文件名、影响范围行建立关系并去重。这里需要把s6的方法内部变更行号与引用输入输出变量名的变更行后续行的行号关系合并到一起进行去重。最后的结构如(“com/push/m.java”,[1,5,6,8]),(“com/pk/k.java”,[2,6,8,9])。
[0077]
通过此方法,可以得到gitlab上分支提交代码变更的java代码的变更影响范围,包括了影响的所有文件的代码范围行,对应不相同的多行代码只需针对每行代码重复此流程即可分别获得其影响范围。
[0078]
进一步地,本发明还涉及一种存储有执行上述基于调用关系的代码变更影响范围分析方法的程序的可读存储介质,通过使用该可读存储介质能够执行该程序从而实现上述基于调用关系的代码变更影响范围分析方法。
[0079]
进一步地,本发明还涉及一种包括有存储器和处理器的电子设备,所述存储器用于存储执行上述基于调用关系的代码变更影响范围分析方法所必要的数据,所述处理器用于执行基于调用关系的代码变更影响范围分析方法。
[0080]
以上所述仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换等都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献

  • 日榜
  • 周榜
  • 月榜