CN117520136A - 应用程序的功能测试方法、装置、设备及可读存储介质 - Google Patents
应用程序的功能测试方法、装置、设备及可读存储介质 Download PDFInfo
- Publication number
- CN117520136A CN117520136A CN202210892437.5A CN202210892437A CN117520136A CN 117520136 A CN117520136 A CN 117520136A CN 202210892437 A CN202210892437 A CN 202210892437A CN 117520136 A CN117520136 A CN 117520136A
- Authority
- CN
- China
- Prior art keywords
- code
- target
- line
- version
- changed
- 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.)
- Pending
Links
- 238000003860 storage Methods 0.000 title claims abstract description 16
- 238000010998 test method Methods 0.000 title claims abstract description 10
- 238000012360 testing method Methods 0.000 claims abstract description 143
- 230000006870 function Effects 0.000 claims abstract description 80
- 238000000034 method Methods 0.000 claims abstract description 71
- 239000003550 marker Substances 0.000 claims description 28
- 230000015654 memory Effects 0.000 claims description 23
- 238000012986 modification Methods 0.000 claims description 19
- 230000004048 modification Effects 0.000 claims description 19
- 238000004590 computer program Methods 0.000 claims description 9
- 238000012217 deletion Methods 0.000 claims description 5
- 230000037430 deletion Effects 0.000 claims description 5
- 238000005286 illumination Methods 0.000 claims description 3
- 238000011990 functional testing Methods 0.000 abstract description 9
- 238000013522 software testing Methods 0.000 abstract description 3
- 230000008859 change Effects 0.000 description 45
- 230000007547 defect Effects 0.000 description 21
- 238000007726 management method Methods 0.000 description 19
- 238000010586 diagram Methods 0.000 description 16
- 238000005516 engineering process Methods 0.000 description 13
- 238000011161 development Methods 0.000 description 7
- 230000008569 process Effects 0.000 description 6
- 238000013515 script Methods 0.000 description 6
- 238000004891 communication Methods 0.000 description 5
- 238000012545 processing Methods 0.000 description 5
- 238000004422 calculation algorithm Methods 0.000 description 4
- 238000011156 evaluation Methods 0.000 description 3
- 238000007792 addition Methods 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 2
- 238000013500 data storage Methods 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000008439 repair process Effects 0.000 description 2
- 238000012552 review Methods 0.000 description 2
- 230000000007 visual effect Effects 0.000 description 2
- 241000590419 Polygonia interrogationis Species 0.000 description 1
- 230000002159 abnormal effect Effects 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 230000014509 gene expression Effects 0.000 description 1
- 235000019580 granularity Nutrition 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 239000000463 material Substances 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 238000013102 re-test Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012800 visualization Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/22—Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
- G06F11/26—Functional testing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/368—Test management for test version control, e.g. updating test cases to a new software version
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请提供了一种应用程序的功能测试方法、装置、设备及计算机可读存储介质;方法包括:获取应用程序的目标代码版本及参考代码版本;目标代码版本的创建时间晚于参考代码版本的创建时间;比较目标代码版本与参考代码版本之间的差异,得到相较于参考代码版本、目标代码版本变动的代码行,变动的代码行关联至少两种功能;获取变动的代码行所属的目标声明、以及目标声明关联的引用声明;结合目标声明及引用声明,对变动的代码行所关联的至少两种功能进行测试,得到测试结果。通过本申请,能够保证功能测试的全面性、准确性,提高测试效率。
Description
技术领域
本申请涉及软件测试技术领域,尤其涉及一种应用程序的功能测试方法、装置、设备、计算机可读存储介质及计算机程序产品。
背景技术
在软件的生命周期中,当发生代码升级、版本迭代或者缺陷修复等变化时,需要进行回归测试,以重新测试软件功能,保证上述变化不会破坏软件的原有功能。
然而,在大规模软件系统(如游戏应用)中,代码关联复杂、还可能存在跨语言调用的情况。当发生代码改动的情况下,经常会发生交叉影响,被影响的功能模块一旦被忽略,且未进行相应的回归测试时,可能产生漏测,导致程序运行异常;而大规模的全量回归又会耗费大量的测试时间、浪费大量的测试人力、测试效率低。
发明内容
本申请实施例提供一种应用程序的功能测试方法、装置、电子设备、计算机可读存储介质及计算机程序产品,能够保证功能测试的全面性、准确性,提高测试效率。
本申请实施例的技术方案是这样实现的:
本申请实施例提供一种应用程序的功能测试方法,包括:
获取应用程序的目标代码版本及参考代码版本;
其中,所述目标代码版本的创建时间晚于所述参考代码版本的创建时间;
比较所述目标代码版本与所述参考代码版本之间的差异,得到相较于所述参考代码版本、所述目标代码版本变动的代码行,所述变动的代码行关联至少两种功能;
获取所述变动的代码行所属的目标声明、以及所述目标声明关联的引用声明;
结合所述目标声明及所述引用声明,对所述变动的代码行所关联的至少两种功能进行测试,得到测试结果。
本申请实施例提供一种应用程序的功能测试装置,包括:
第一获取模块,用于获取应用程序的目标代码版本及参考代码版本,其中,所述目标代码版本的创建时间晚于所述参考代码版本的创建时间;
比较模块,用于比较所述目标代码版本与所述参考代码版本之间的差异,得到相较于所述参考代码版本、所述目标代码版本变动的代码行,所述变动的代码行关联至少两种功能;
第二获取模块,用于获取所述变动的代码行所属的目标声明、以及所述目标声明关联的引用声明;
测试模块,用于结合所述目标声明及所述引用声明,对所述变动的代码行所关联的至少两种功能进行测试,得到测试结果。
上述方案中,所述第二获取模块,还用于获取所述目标代码版本的至少一个第一声明信息、及所述参考代码版本的至少一个第二声明信息,其中,所述第一声明信息及所述第二声明信息包括声明的名称、声明的代码行;
基于所述至少一个第一声明信息、及所述至少一个第二声明信息,确定所述变动的代码行所属的目标声明。
上述方案中,所述第二获取模块,还用于当所述变动的代码行属于所述目标代码版本时,针对各所述第一声明信息执行以下操作:将所述变动的代码行与当前所述第一声明信息的代码行进行匹配,当匹配结果表征所述变动的代码行属于当前所述第一声明信息时,将当前所述第一声明信息作为所述目标声明;
当所述变动的代码行不属于所述目标代码版本、且属于所述参考代码版本时,针对各所述第二声明信息执行以下操作:将所述变动的代码行与当前所述第二声明信息的代码行进行匹配,当匹配结果表征所述变动的代码行属于当前所述第二声明信息时,将所述第二声明信息作为所述目标声明。
上述方案中,所述第二获取模块,还用于确定所述变动的代码行归属的目标类别组,所述目标类别组为新增行组、修改行组、删除行组中之一,
所述新增行组,用于存储相较于所述参考代码版本、所述目标代码版本新增的代码行,所述修改行组,用于存储相较于所述参考代码版本、所述目标代码版本修改的代码行,所述删除行组,用于存储相较于所述参考代码版本、所述目标代码版本删除的代码行;
当所述目标类别组为新增行组或修改行组时,从所述目标代码版本的至少一个声明中,确定所述变动的代码行所属的目标声明;
当所述目标类别组为删除行组时,从所述参考代码版本的至少一个声明中,确定所述变动的代码行所属的目标声明。
上述方案中,所述第二获取模块,还用于获取所述目标代码版本中各所述声明的位置信息,所述位置信息包括所述声明的起始行号和结束行号;
针对所述目标代码版本中各所述声明的位置信息,执行以下操作:
当所述变动的代码行的行号大于等于当前位置信息的起始行号、且小于等于所述当前位置信息的结束行号时,将所述当前位置信息所指示的声明作为所述变动的代码行所属的目标声明。
上述方案中,所述第二获取模块,还用于确定所述变动的代码行与所述目标代码版本的第一归属关系、以及所述变动的代码行与所述参考代码版本的第二归属关系;
基于所述第一归属关系及所述第二归属关系,确定所述变动的代码行归属的目标类别组。
上述方案中,所述第二获取模块,还用于当所述第一归属关系表征所述变动的代码行属于所述目标代码版本、且所述第二归属关系表征所述变动的代码行不属于所述参考代码版本时,确定所述变动的代码行属于所述新增行组;
当所述第一归属关系表征所述变动的代码行不属于所述目标代码版本、且所述第二归属关系表征所述变动的代码行属于所述参考代码版本时,确定所述变动的代码行属于所述删除行组;
当所述第一归属关系表征所述变动的代码行属于所述目标代码版本、且所述第二归属关系表征所述变动的代码行属于所述参考代码版本时,确定所述变动的代码行属于所述修改行组。
上述方案中,所述第二获取模块,还用于解析所述变动的代码行,得到所述变动的代码行对应的标记符,所述标记符,用于表征所述变动的代码行的归属;
当所述标记符指示所述变动的代码行属于所述目标代码版本、且不属于所述参考代码版本时,确定所述变动的代码行属于新增行组;
当所述标记符指示所述变动的代码行不属于所述目标代码版本、且属于所述参考代码版本时,确定所述变动的代码行属于删除行组;
当所述标记符指示所述变动的代码行属于所述目标代码版本、且属于所述参考代码版本时,确定所述变动的代码行属于修改行组。
上述方案中,所述第二获取模块,还用于获取所述目标声明所属的代码版本;
当所述目标声明所属的代码版本为所述目标代码版本时,获取所述目标代码版本的声明调用树,所述声明调用树,用于表征所述目标代码版本所关联的至少两个声明间的调用关系;
基于所述声明调用树,确定所述目标声明关联的引用声明。
上述方案中,所述测试模块,还用于结合所述目标声明及所述引用声明,确定所述变动的代码行对应的测试任务,并基于所述测试任务,确定与所述目标声明及所述引用声明对应的目标测试用例;
通过所述目标测试用例,对所述变动的代码行所关联的至少两种功能进行测试,得到测试结果。
上述方案中,所述第一获取模块,还用于获取所述应用程序的至少两个历史代码版本;
基于代码版本的版本号,从所述至少两个历史代码版本中选择所述目标代码版本及所述参考代码版本。
本申请实施例提供一种电子设备,包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现本申请实施例提供的应用程序的功能测试方法。
本申请实施例提供一种计算机可读存储介质,存储有可执行指令,用于引起处理器执行时,实现本申请实施例提供的应用程序的功能测试方法。
本申请实施例提供一种计算机程序产品,包括计算机程序或指令,计算机程序或指令被处理器执行时实现本申请实施例提供的应用程序的功能测试方法。
本申请实施例具有以下有益效果:
应用本申请实施例,比较应用程序的目标代码版本及参考代码版本之间的差异,获取两个代码版本文件之间变动的代码行,如此,能够提高获取差异信息的准确性;然后,确定变动的代码行所属的目标声明、及目标声明关联的引用声明,如此,能够提高获取变动的声明的准确性、全面性;最后,结合目标声明及关联的引用声明,对变动的代码行所关联的各个功能进行测试,如此,能够保证功能测试的全面性、准确性,提高测试效率。
附图说明
图1是本申请实施例提供的应用程序的功能测试系统100的架构示意图;
图2是本申请实施例提供的应用程序的功能测试的电子设备500的结构示意图;
图3是本申请实施例提供的应用程序的功能测试方法的流程示意图;
图4是本申请实施例提供的代码版本选择操作示意图;
图5是本申请实施例提供的代码版本获取方法的流程示意图;
图6是本申请实施例提供的目标声明的获取方法的流程流程图;
图7是本申请实施例提供的声明信息的结构示意图;
图8是本申请实施例提供的基于目标类别组确定目标声明的方法流程图;
图9是本申请实施例提供的目标类别组的确定方法流程图;
图10是本申请实施例提供的基于归属关系确定目标类别组的方法示意图;
图11是本申请实施例提供的基于标记符确定目标类别组的方法示意图;
图12是本申请实施例提供的基于声明的位置信息确定目标声明的方法示意图;
图13是本申请实施例提供的获取关联的引用声明的方法流程图;
图14是本申请实施例提供的变动的代码行关联的功能的测试方法流程图;
图15是本申请实施例提供的变动的代码行的数据存储结构示意图;
图16是本申请实施例提供的应用程序的功能测试方法流程图;
图17是本申请实施例提供的追溯提交记录的方法。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
如果申请文件中出现“第一/第二”的类似描述则增加以下的说明,在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本申请实施例能够以除了在这里图示或描述的以外的顺序实施。
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
对本申请实施例进行进一步详细说明之前,对本申请实施例中涉及的名词和术语进行说明,本申请实施例中涉及的名词和术语适用于如下的解释。
1)版本控制系统(VCS,Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件(帮助软件团队的开发人员协同工作,并存档他们工作的完整历史记录),而且可以对任何类型的文件进行版本控制。用的比较多的如svn,git等。
版本控制中的基线是软件文档或源码(或其它产出物)的一个稳定版本,它是进一步开发的基础;版本控制中的文件库(Repository)存储文件的新版本还有历史资料的地方,通常是在服务器上。
2)测试用例(Test Case):是指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,最终形成文档。简单地认为,测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,用于核实是否满足某个特定软件需求。
3)缺陷追踪系统(DTS,Defect Trace System):对于项目管理,缺陷追踪是很重要的一个环节,它除了可以对需求的完成度进行控制,同时也可以对软件本身的质量进行控制,以保证软件开发迭代的顺利进行。
4)抽象语法树(AST,Abstract Syntax Tree):在计算机科学中,抽象语法树是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
基于上述对本申请实施例中涉及的名词和术语的解释,下面说明本申请实施例提供的应用程序的功能测试系统。参见图1,图1是本申请实施例提供的应用程序的功能测试系统100的架构示意图,为实现支撑一个示例性应用,终端(示例性示出了终端400-1和终端400-2)通过网络300连接服务器200,网络300可以是广域网或者局域网,又或者是二者的组合,使用无线或有线链路实现数据传输。
终端400-1,作为应用程序的测试端,安装有版本控制工具,并基于版本控制工具对应用程序进行版本控制,还安装有缺陷追踪管理系统,用于管理针对应用程序的需求或缺陷管理,用于获取应用程序的目标代码版本及参考代码版本;其中,目标代码版本的创建时间晚于参考代码版本的创建时间;比较目标代码版本与参考代码版本之间的差异,得到相较于参考代码版本、目标代码版本变动的代码行,变动的代码行关联至少两种功能;获取变动的代码行所属的目标声明、以及目标声明关联的引用声明;结合目标声明及引用声明,对变动的代码行所关联的至少两种功能进行测试,得到测试结果。
终端400-2,作为应用程序的开发端,安装有用于进行应用程序开发的开发平台、以及用于对应用程序进行版本控制的版本控制工具,接收到测试端通过缺陷追踪管理应用录入的针对应用程序的需求或缺陷,首先基于版本控制工具从服务器200中下载应用程序的最新代码版本,然后基于最新代码版本对相应的需求或缺陷进行修复,最后将修改后的代码版本通过版本控制工具提交至服务器。
服务器200,用于在接收到终端发送的代码版本检出请求时,将请求检出的代码版本文件发送至终端。
在一些实施例中,服务器200可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(CDN,ContentDelivery Network)、以及大数据和人工智能平台等基础云计算服务的云服务器。终端400可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请实施例中不做限制。
本申请实施例可以借助于云技术(Cloud Technology)实现,云技术是指在广域网或局域网内将硬件、软件、网络等系列资源统一起来,实现数据的计算、储存、处理和共享的一种托管技术。
云技术是基于云计算商业模式应用的网络技术、信息技术、整合技术、管理平台技术、以及应用技术等的总称,可以组成资源池,按需所用,灵活便利。云计算技术将变成重要支撑。技术网络系统的后台服务需要大量的计算、存储资源。伴随着互联网行业的高度发展和应用,将来每个物品都有可能存在自己的识别标志,都需要传输到后台系统进行逻辑处理,不同程度级别的数据将会分开处理,各类行业数据皆需要强大的系统后盾支撑,可以通过云计算来实现。
参见图2,图2是本申请实施例提供的应用程序的功能测试的电子设备500的结构示意图。在实际应用中,电子设备500可以为图1示出的服务器或终端,以电子设备500为图1示出的域名解析节点为例,对实施本申请实施例的应用程序的功能测试的电子设备进行说明,本申请实施例提供的电子设备500包括:至少一个处理器510、存储器550、至少一个网络接口520和用户接口530。电子设备500中的各个组件通过总线系统540耦合在一起。可理解,总线系统540用于实现这些组件之间的连接通信。总线系统540除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图2中将各种总线都标为总线系统540。
处理器510可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(DSP,Digital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
用户接口530包括使得能够呈现媒体内容的一个或多个输出装置531,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口530还包括一个或多个输入装置532,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
存储器550可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器550可选地包括在物理位置上远离处理器510的一个或多个存储设备。
存储器550包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM,Read Only Me mory),易失性存储器可以是随机存取存储器(RAM,Random Access Memor y)。本申请实施例描述的存储器550旨在包括任意适合类型的存储器。
在一些实施例中,存储器550能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
操作系统551,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
网络通信模块552,用于经由一个或多个(有线或无线)网络接口520到达其他计算设备,示例性的网络接口520包括:蓝牙、无线相容性认证(WiFi)、和通用串行总线(USB,Universal Serial Bus)等;
呈现模块553,用于经由一个或多个与用户接口530相关联的输出装置531(例如,显示屏、扬声器等)使得能够呈现信息(例如,用于操作外围设备和显示内容和信息的用户接口);
输入处理模块554,用于对一个或多个来自一个或多个输入装置532之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
在一些实施例中,本申请实施例提供的应用程序的功能测试装置可以采用软件方式实现,图2示出了存储在存储器550中的应用程序的功能测试装置555,其可以是程序和插件等形式的软件,包括以下软件模块:第一获取模块5551、比较模块5552、第二获取模块5553和测试模块5554,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分,将在下文中说明各个模块的功能。
在另一些实施例中,本申请实施例提供的应用程序的功能测试装置可以采用软硬件结合的方式实现,作为示例,本申请实施例提供的应用程序的功能测试装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本申请实施例提供的应用程序的功能测试,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(ASIC,Application Specific Integrated Circuit)、DSP、可编程逻辑器件(PLD,ProgrammableLogic Device)、复杂可编程逻辑器件(CPLD,Complex Programmable Logic Device)、现场可编程门阵列(FPGA,Field-Programmable Gate Array)或其他电子元件。
基于上述对本申请实施例提供的应用程序的功能测试系统及电子设备的说明,下面说明本申请实施例提供的应用程序的功能测试方法。在一些实施例中,本申请实施例提供的应用程序的功能测试方法可由服务器或终端单独实施,或由服务器及终端协同实施,下面以终端实施为例说明本申请实施例提供的应用程序的功能测试方法。
参见图3,图3是本申请实施例提供的应用程序的功能测试方法的流程示意图,本申请实施例提供的应用程序的功能测试方法包括:
在步骤101中,终端获取应用程序的目标代码版本及参考代码版本,其中,目标代码版本的创建时间晚于参考代码版本的创建时间。
在实际应用中,对于软件开发项目而言,终端部署有用于应用程序开发的开发平台应用、用于对该应用程序进行版本控制管理的版本控制管理应用,用于对应用程序的迭代开发过程的所有代码版本进行管理。对于软件测试而言,终端还部署有用于应用程序的缺陷进行追踪管理的缺陷管理系统。应用程序开发人员负责根据缺陷追踪系统的报告进行缺陷重现、修改、反馈,测试人员对应用程序进行测试,并通过缺陷追踪系统对缺陷进行录入、重新测试等。常见的版本控制管理应用包括SVN、GIT等。
在实际实施时,通过终端部署的版本控制管理系统,获取需要对比的代码版本。具体操作可以是在版本控制管理应用提供的操作界面中展示的多个代码版本中选择需要对比的目标代码版本及参考代码版本,通常目标代码版本的提交时间晚于参考代码版本的提交时间,每个代码版本中可以包括一个或多个变动的源文件版本,进行对比的代码版本是指不同程序版本中,同一个源文件的不同代码版本。
示例性的,参见图4,图4是本申请实施例提供的代码版本选择操作示意图,图中编号1中示出了针对应用程序的多个历史代码版本,编号2示出的是选中的需要对比的两个代码版本,每个代码版本对应一个版本号。
在一些实施例中,参见图5,图5是本申请实施例提供的代码版本获取方法的流程示意图,基于图3,步骤101可由步骤1011至1012实现:
步骤1011,终端获取应用程序的至少两个历史代码版本。
在实际实施时,终端部署的针对应用程序的版本管理工具,可以获取应用程序的所有历史代码版本,可根据实际需要选择目标时间跨度内的多个历史代码版本。
步骤1012,基于代码版本的版本号,从至少两个历史代码版本中选择目标代码版本及参考代码版本。
在实际实施时,通过可视化工具可以查看两个代码版本之间的变动情况,在实际应用中,为了将代码版本之间的差异信息通过自定义格式输出,通过会自定义差异方法,方法的输入参数针对源代码文件的代码版本设置可以是自定义格式,如可以是一个字典,其中,字典的关键词(key)的值是代码版本的文件路径,字典的值value是目标代码版本的版本号和参考代码版本的版本号。具体格式如下:{文件路径:(目标代码版本的版本号,参考代码版本的版本号)}。分别根据目标代码版本的版本号和参考代码版本的版本号,基于版本管理工具从服务器上检出所在版本的变动文件到本地,然后对比两个版本每个源代码文件的变动的代码行的行号。
在步骤102中,比较目标代码版本与参考代码版本之间的差异,得到相较于参考代码版本、目标代码版本变动的代码行,其中,变动的代码行关联至少两种功能。
在实际实施时,可以通过第三方工具直接查看两个代码版本之间的差异信息,也可以通过编写脚本语言实现代码版本之间的差异信息的获取,并生成目标格式的差异信息、如txt文本格式。差异信息包括相较于参考代码版本、目标代码版本变动的代码行,变动的代码行关联至少两个功能。
示例性地,可以通过开源库difflib中集成Myers diff算法获取目标代码版本和参考代码版本之间的差异,具体对比的方法如下:difflib.Differ类用于处理多行文本,并产生易于阅读的比较差异或者变化指示,也包括各行文本特有的不同之处。difflib.Differ的输出结果中,带有减号–标识符的代码行存在于参考代码版本,而不存在于目标代码版本;带有加号+标识符的代码行存在于目标代码版本,而不存在于参考代码版本。
在步骤103中,获取变动的代码行所属的目标声明、以及目标声明关联的引用声明。
在实际实施时,终端在目标代码版本、参考代码版本中获取变动的代码行所属的目标声明,其中,若变动的代码行是目标代码版本中新增的代码行、或在目标代码版本中修改过的代码行,在可以直接在目标代码版本中确定变动的代码行所属的目标声明;若变动的代码行是参考代码版本中被删除的代码行,则可以在参考代码版本中确定变动的代码行所属的目标声明。如此,通过确定变动的代码行所属的代码版本,在进行相应目标声明的确定,能够避免每次确定目标声明时,都需要查找目标代码版本和参考代码版本,能够提高目标声明的查找效率。在确定变动的代码行后,可以根据编写代码的编程语言提供的获取代码对应的抽象语法树的方法,确定目标声明的语法树,该语法树中的各节点指示的是与目标声明关联的引用声明,需要说明的是,目标声明用于表征引用了变更的代码行的所有变量、宏、函数、结构体或者类。另外,目标声明关联的引用声明,不仅包括同一种编程语言之间的关联的引用声明,还包括跨语言的关联的声明。
示例性地,在游戏工程中,一些底层接口使用C++/C语言编写,而功能逻辑使用lua等脚本开发,并调用到底层C++/C语言编写的接口,除了能够获取变动的代码行对应lua语言的目标声明,还可以获取目标声明中调用的C++/C语言编写的引用声明。
在一些实施例中,参见图6,图6是本申请实施例提供的目标声明的获取方法的流程流程图,结合图6示出的步骤说明目标声明的获取方式。
步骤201a,终端获取目标代码版本的至少一个第一声明信息、及参考代码版本的至少一个第二声明信息,其中,第一声明信息及第二声明信息包括声明的名称、声明的代码行。
在实际实施时,终端可以先获取目标代码版本中的全部声明信息(可称为第一声明信息)、以及参考代码版本中的全部声明信息(可称为第二声明信息),这里的声明信息可以包括声明的名称、声明的代码行。其中,第一声明信息、第二声明信息可采用字典表示,字典的关键字为声明的名称,字典的值为声明的代码行,具体格式为:{声明的名称:{声明的行号、代码行内容}},代码行内容可以采用序列化形式表示。
示例性地,参见图7,图7是本申请实施例提供的声明信息的结构示意图,图中,变动的代码行所属的声明的名称为addition,编号1示出的是声明的代码行,编号2示出的是变动的代码行的行号。
步骤202a,基于至少一个第一声明信息、及至少一个第二声明信息,确定变动的代码行所属的目标声明。
在实际实施时,将变动的代码行分别与各第一声明信息中各声明对应的代码行进行匹配,确定目标声明,还可以将变动的代码行分别与各第二声明信息中各声明对应的代码行进行匹配,确定变动的代码行所属的目标声明。需要说明的是,上述两种匹配过程是相互独立的,无严格的先后执行顺序。为了提高目标声明的查找效率,还可以先确定变动的代码行所归属的代码版本,当变动的代码行属于目标代码版本时,可以只在各第一声明信息中查找,当变动的代码行属于参考代码版本时,可以只在各第二声明信息中查找。如此,能够大大提高目标声明的查找效率。
在一些实施例中,继续参见图6,基于至少一个第一声明信息、及至少一个第二声明信息,确定变动的代码行所属的目标声明,可以通过步骤2021a和步骤2021b实现。
步骤2021a,当变动的代码行属于目标代码版本时,针对各第一声明信息执行以下操作:将变动的代码行与当前第一声明信息的代码行进行匹配,当匹配结果表征变动的代码行属于当前第一声明信息时,将当前第一声明信息作为目标声明。
在实际实施时,当变动的代码行是目标代码版本中新增或修改的代码行时,可以直接在各第一声明信息中查找目标声明。具体查找方式为:遍历各第一声明信息,并依次与各第一声明信息中的代码行进行匹配,将包括变动的代码行的第一声明信息作为目标声明。需要说明的是,若获取的变动的代码行包含行号时,可以直接根据行号,从各第一声明信息中确定目标声明。
步骤2021b,当变动的代码行不属于目标代码版本、且属于参考代码版本时,针对各第二声明信息执行以下操作:将变动的代码行与当前第二声明信息的代码行进行匹配,当匹配结果表征变动的代码行属于当前第二声明信息时,将第二声明信息作为目标声明。
在实际实施时,当变动的代码行是参考代码版本中删除的代码行时,可以直接在各第二声明信息中查找目标声明。查找方式与在各第一声明信息中查找,目标声明的方式相似。
在一些实施例中,参见图8,图8是本申请实施例提供的基于目标类别组确定目标声明的方法流程图,结合图8示出的步骤说明目标声明的获取方式。
步骤201b,终端确定变动的代码行归属的目标类别组,目标类别组为新增行组、修改行组、删除行组中之一。
其中,新增行组,用于存储相较于参考代码版本、目标代码版本新增的代码行;修改行组,用于存储相较于参考代码版本、目标代码版本修改的代码行;删除行组,用于存储相较于参考代码版本、目标代码版本删除的代码行。
在实际实施时,可以按照变动类别对变动的代码行进行分组,变动类别可以包括新增、修改、删除,当变动的代码行的变动类别是新增时,变动的代码行归属的目标类别组为新增行组;当变动的代码行的变动类别是修改时,变动的代码行归属的目标类别组为修改行组;当变动的代码行的变动类别是删除时,变动的代码行归属的目标类别组为删除行组,如此,对变动的代码行进行归类,不仅能够更针对性的查找目标声明,还能够在进行测试分析时,提供更多样化的分析结果。
在一些实施例中,参见图9,图9是本申请实施例提供的目标类别组的确定方法流程图,结合图9示出的步骤进行说明。
步骤301a,终端确定变动的代码行与目标代码版本的第一归属关系、以及变动的代码行与参考代码版本的第二归属关系。
在实际实施时,确定变动的代码行与目标代码版本的归属关系(可称第一归属关系)、变动的代码行与参考代码版本的归属关系(可称第二归属关系)。第一归属关系可以包括属于或不属于目标代码版本,第二归属关系可以包括属于或不属于参考代码版本。
步骤302a,基于第一归属关系及第二归属关系,确定变动的代码行归属的目标类别组。
在实际实施时,可以根据第一归属关系及第二归属关系,确定变动的代码行属于新增行组、修改行组、删除行组中的哪一组。
在一些实施例中,参见图10,图10是本申请实施例提供的基于归属关系确定目标类别组的方法示意图,基于图9,步骤302a可以通过步骤3021a-3021c实现。
步骤3021a,当第一归属关系表征变动的代码行属于目标代码版本、且第二归属关系表征变动的代码行不属于参考代码版本时,确定变动的代码行属于新增行组。
在实际实施时,第一归属关系是属于目标代码版本、且第二归属关系是不属于参考代码版本时,说明变动的代码行是在目标代码版本中新增的代码行。
步骤3021b,当第一归属关系表征变动的代码行不属于目标代码版本、且第二归属关系表征变动的代码行属于参考代码版本时,确定变动的代码行属于删除行组。
在实际实施时,第一归属关系是不属于目标代码版本、且第二归属关系是属于参考代码版本时,说明变动的代码行是目标代码版本中删除的代码行。
步骤3021c,当第一归属关系表征变动的代码行属于目标代码版本、且第二归属关系表征变动的代码行属于参考代码版本时,确定变动的代码行属于修改行组。
在实际实施时,第一归属关系是属于目标代码版本、且第二归属关系是属于参考代码版本时,说明变动的代码行是目标代码版本相对于参考代码版本修改的代码行。
在一些实施例中,参见图11,图11是本申请实施例提供的基于标记符确定目标类别组的方法示意图,结合图11示出的步骤进行说明。
步骤301b,终端解析变动的代码行,得到变动的代码行对应的标记符,标记符,用于表征所述变动的代码行的归属。
在实际实施时,比较目标代码版本和参考代码版本的差异,得到的变动的代码行,可以包括相应的标记符,这里的标记符,用于表征变动的代码行的归属。
示例性地,带有减号“–”标记符的变动的代码行存在参考代码版本,而不存在于目标代码版本;带有加号“+”标记符的变动的代码行存在于目标代码版本,而不存在于参考代码版本;如果一行代码行存在不同之处,那么会用一行额外的、以问号?打头的文本来标识出不同之处。
步骤302b,当标记符指示变动的代码行属于目标代码版本、且不属于参考代码版本时,确定变动的代码行属于新增行组;
在实际实施时,可以直接根据标记符,确定变动的代码行所归属的目标类别组(新增行组、修改行组、删除行中之一)。
承接上例,标记符为“+”时,说明变动的代码行属于新增行组。
步骤303b,当标记符指示变动的代码行不属于目标代码版本、且属于参考代码版本时,确定变动的代码行属于删除行组;
承接上例,标记符为“-”时,说明变动的代码行属于删除行组。
步骤304b,当标记符指示变动的代码行属于目标代码版本、且属于参考代码版本时,确定变动的代码行属于修改行组
承接上例,标记符为“?”时,说明变动的代码行属于修改行组。
步骤202b,当目标类别组为新增行组或修改行组时,从目标代码版本的至少一个声明中,确定变动的代码行所属的目标声明。
在实际实施时,在确定变动的代码行所属的目标类别组后,可以根据目标类别组,确定包括目标声明的代码版本,并从相应的代码版本,查找到目标声明对应的信息。当目标类别组为新增行组、修改行组中之一时,可以直接从目标类别组中确定目标声明,不必再查找参考代码版本,如此,能够提高目标声明的查找效率。
步骤203b,当目标类别组为删除行组时,从参考代码版本的至少一个声明中,确定变动的代码行所属的目标声明。
在实际实施时,当目标类别组为删除行组时,可以直接从参考代码版本中确定目标声明,不必再查找目标代码版本,如此,能够提高目标声明的查找效率。
在一些实施例中,参见图12,图12是本申请实施例提供的基于声明的位置信息确定目标声明的方法示意图,结合图12示出的步骤进行说明。
步骤201c,终端获取目标代码版本中各声明的位置信息,其中,位置信息包括声明的起始行号和结束行号。
在实际实施时,获取目标代码版本中所有声明的位置信息,声明包括变量、宏、函数、结构体或者类,位置信息包括声明的起始行号及结束行号。
示例性地,参见图7,图中,函数addition对应的起始行号为22,结束行号为28,变量r对应的起始行号和结束行号均为24。
步骤202c,针对目标代码版本中各声明的位置信息,执行以下操作:
当变动的代码行的行号大于等于当前位置信息的起始行号、且小于等于当前位置信息的结束行号时,将当前位置信息所指示的声明作为变动的代码行所属的目标声明。
在实际实施时,变动的代码行所属的目标类别组为新增行组或者修改行组时,遍历目标代码版本中的所有声明,并找到位置信息的起始行号小于等于变动代码行的行号、且位置信息的结束行号大于等于变动的代码行的行号的声明时,说明该声明是目标代码版本中发送变动的声明。
需要说明的是,针对变动的代码行属于删除行组时,遍历参考代码版本中的所有声明,并找到位置信息的起始行号小于等于变动代码行的行号、且位置信息的结束行号大于等于变动的代码行的行号的声明时,说明该声明是参考代码版本中发送变动的声明。
在一些实施例中,参见图13,图13是本申请实施例提供的获取关联的引用声明的方法流程图,结合图13示出的步骤进行说明。
步骤401,终端获取目标声明所属的代码版本。
在实际实施时,目标声明关联的引用声明,包括关联的变量、宏、函数、结构体或者类。关联的声明是指引用了变动的代码行的所有变量、宏、函数、结构体或者类。需要说明的是,这里的关联不仅仅是同语言之间的关联,还包括跨语言的关联。先获取目标声明所属的代码版本,然后在从相应的代码版本中确定目标声明关联的引用声明。
步骤402,当目标声明所属的代码版本为目标代码版本时,获取目标代码版本的声明调用树,声明调用树,用于表征目标代码版本所关联的至少两个声明间的调用关系。
在实际实施时,基于前述方式,确定目标声明归属于目标代码版本时,获取相应编程语言提供的抽象语法树,进而确定目标代码版本的声明调用树,该声明调用树记录了目标代码版本关联的所有声明的调用关系,需要说明的,跨语言编程时,声明调用树的个数为至少两个。
步骤403,基于声明调用树,确定目标声明关联的引用声明。
在实际实施时,声明调用树的数量为一个时,可以直接确定目标声明关联的所有引用声明;声明调用树的数量为至少两个时,整合至少两个声明调用树,确定目标声明关联的所有引用声明。需要说明的是,至少两个声明调用数据的整合方式,可以是,依次遍历各声明调用树,以目标声明为查找起点,按照目标声明与其他引用声明之间的调用关系,在声明调用树中查找相应的分支,直至声明调用树的根节点,当目标声明关联的引用声明属于另一个声明调用树,以当前引用声明为查找起点,从另一个声明调用树中查找当前引用声明对应的分支,直至该声明调用树的根节点。如此,遍历完所有的声明调用树,即可获得变动的代码行对应的目标声明,以及目标声明关联的所有引用声明。获取引用声明的相关信息可以包括声明所在文件、声明所在文件的行数、声明中变动的代码行等。
在步骤104中,结合目标声明及引用声明,对变动的代码行所关联的至少两种功能进行测试,得到测试结果。
在实际实施时,测试人员需要对变动的代码行关联的所有功能进行测试,确保相应功能的正常运行,其中,可以根据每个目标声明及关联的引用声明确定所有对应的功能模块,然后对涉及到的功能模块进行测试,得到测试结果。
在一些实施例中,参见图14,图14是本申请实施例提供的变动的代码行关联的功能的测试方法流程图,结合图14示出的步骤进行说明。
步骤1041,终端结合目标声明及引用声明,确定变动的代码行对应的测试任务,并基于测试任务,确定与目标声明及引用声明对应的目标测试用例。
在实际实施时,应用程序源代码文件的版本迭代,一般是程序开发人员基于测试人员发布的测试任务(新的需求或缺陷),对代码进行修改后,并提交改动后的代码版本,在版本管理系统中存储相应的提交记录日志。可以理解的是,版本管理系统中源文件的历史代码版本与测试任务存在关联关系。另外,对于一个软件开发项目来说,项目的测试组在实施测试的过程中会将所开发的测试用例保存到“测试用例库”中,并对其进行维护和管理。当得到一个软件的基线(软件文档或源码的一个稳定版本,它是进一步开发的基础)版本时,用于基线版本测试的所有测试用例就形成了基线测试用例库。在需要进行回归测试的时候,就可以根据所选择的回归测试策略,从基线测试用例库中提取合适的测试用例组成回归测试包,通过运行回归测试包来实现回归测试。基于此,可以根据变动的代码行对应的测试任务,确定相应的目标测试用例。
步骤1042,通过目标测试用例,对变动的代码行所关联的至少两种功能进行测试,得到测试结果。
在实际实施时,根据得到的测试用例,对变动的代码行所关联的至少两种功能进行测试,得到测试结果。为了可以结合变动的代码行、目标声明、关联的引用声明、变动的代码行对应的提交记录日志采用目标数据结构存储,便于后续评估针对代码的每次改动所涉及的模块、以及对应的测试时间。其中,具体的数据结构可参见图15,图15是本申请实施例提供的变动的代码行的数据存储结构示意图,图中所示的数据结构中,File1表示变动的代码文件,Cursor1表示变动的声明(如变量、宏、函数、结构体或者类)的声明名称,声明所在文件的行数(line),提交记录日志(cursor_log),声明中新增/改动的代码行及其提交日志(modify_line),声明中删除的代码行及其提交日志(delete_line)。根据上述步骤得到的相关数据,生成报告。报告内容包括,变动的代码行所涉及的所有引用,便于评估测试任务对应的代码变动涉及的所有功能模块,测试跟进人,关联的测试用例,以及需要的测试时间。
应用本申请实施例,通过版本控制工具获取应用程序的两个对比代码版本,如此,能够获取任意两个代码本,提高获取代码版本的灵活性,然后,获取两个代码版本中发生变动的代码行,并基于对变动的代码行所归于的代码版本的确定,以及对变动的代码行所属目标类别组的确定,快速确定变动的代码行对应的目标声明、及目标声明关联的引用声明,如此,可以突破跨编程语言的界限,精准获得变动的代码行关联的所有功能,最后,结合目标声明及关联的引用声明,对变动的代码行所关联的所有功能进行测试,如此,既能防止代码交叉影响造成的漏测,保证测试的准确性,又能节省测试成本。
下面,将说明本申请实施例在一个实际的应用场景中的示例性应用。
在大规模软件系统,比如游戏,代码关联复杂,还可能存在跨语言调用的情况。当发生代码改动的情况下,经常会发生交叉影响,影响到的模块一旦被忽略,没有进行对应的回归测试则有可能产生缺陷;而大规模的全量回归又会浪费大量的测试人力。相关技术中,编辑器如visual studio等,可以获得代码引用树和调用关系,但是有以下不足:第一,对于多行改动,查看效率低;第二,跨语言的调用,无法查看,比如lua调用了C++的接口;第三,没有额外的工具辅助很难判断代码改动关联的函数或者类对应的功能模块以及对应的用例。
基于此,本申请实施例提供一种应用程序的功能测试方法,该方法是基于代码关联的交叉测试方案,便于每次改动后,评估需要回归的功能模块,精准测试,既防止漏测又可以节省人力。
在一些实施例中,参见图16,图16是本申请实施例提供的应用程序的功能测试方法流程图,结合图16示出的步骤进行说明。
步骤501,获取两个代码版本文件之间变动的代码行,并提取变动的代码行的提交日志。
在实际实施时,根据不同的时间跨度粒度,包括某个版本之间和某一次提交,获得两个代码版本之间的变动的代码行的行号(代码变动行号)和基于版本控制管理工具(如git、svn)获取代码变动行号的提交日志。
其中,具体实现方法可以是:通过获取代码文件对应的版本提交列表,提取版本跨度的里的文件变动列表,以及代码文件改动前的版本号、及代码文件改动后的版本号。在实际应用中,具体数据格式可以是一个字典,字典的key值是代码版本文件所在仓库的相对路径,字典的value是文件对应版本跨度内的改动前后版本号,pre_version代表选择时间跨度内文件改动前的版本号,pre_version代表选择时间跨度内文件改动后的版本号。其中,具体格式如下:
{
file1:(pre_version,now_version),
file2:(pre_version,now_version),
}
在实际应用中,遍历上述字典,并分别根据pre_version和now_version,在版本控制管理工具中检出所在版本的所有变动文件,然后对比两个版本的变动行号。以版本控制管理工具git为例,git中检出文件特定版本的方法是:比较两个文件的变动行号,会用到的Myers diff算法,这也是git的diff算法内核。difflib.Differ类用于处理多行文本,并产生便于阅读的差异信息或者变化指示,也包括各行文本特有的不同之处。常用的开源库为difflib,该开源库已经集成了Myers diff算法,对比的方法如下:difflib.Differ的默认输出类似于Unix的命令行工具diff,包括原始输入列表中的值、共有值和标记变化的标记符。其中,带有减号“-”前缀的文本行存在于第一个序列,而不存在于第二个序列;带有加号“+”前缀的文本行存在于第二个序列,而不存在于第一个序列;如果一行文本存在不同之处,那么会用一行额外的、以问号“?”打头的文本来标识出不同之处。如果文本没有变化,那该行文本会以空格作为前缀,这样就可以与那些有变化的文本行对齐。示例性地,difflib库中获取代码文件两个版本的代码片段如下:
另外,获取新增、删除、修改的代码行的行号的代码片段,如下:
/>
通过上述方法获得变动的代码行的行号(变动行号),这里的变动行号主要包括:1.now_version版本相比pre_version版本新增或者修改的行号,这里用modify_lines来保存;2.pre_version版本相比now_version被删除了的行号,用de lete_lines来保存。并且基于版本控制管理工具提供的追溯提交记录的方法(git blame或者svn blame方法,blame是一种追溯提交记录的方法,可以获得git或svn仓库里面文件的某个版本所有行号的提交记录),获得变动行号的提交日志。
示例性地,参见图17,图17是本申请实施例提供的追溯提交记录的方法。图中,以git blame为例,指令"git blame文件名-L a,b",-L参数表示后面接的是行号(Line),a,b代表查询文件的第a行到第b行之间的文件内容情况。可以获得对应行号的提交日志标识(commit id)。通过指令“git show+commit id”,可以获得提交id(commit id)的提交日志。
然后,整合该步骤得到的数据,并返回数据。这一个步骤得到数据包括:pre_version和now_version对应的提交id(commit id),变动文件,新增行或者修改行的行号(modify_line)以及其对应的提交日志,删除行的行号(delete_line)以及其对应的提交日志。用字典形式存储,字典的数据结构如下:。
/>
步骤502,计算变动行号所属的声明,声明包括宏、函数、结构体或者类。
在实际实施时,计算变动代码所属的声明(宏、函数、结构体或者类),还有所属声明关联的引用声明(引用的变量、宏、函数、结构体或者类),引用声明是指引用了变动代码的所有变量、宏、函数、结构体或者类。这里的关联不仅仅是同语言之间的关联,还包括跨语言的关联,比如在游戏工程中,一些底层接口使用C++/C语言编写,而功能逻辑使用lua等脚本开发并调用到底层C++/C语言编写的接口。具体实现如下:
首先,找出变动文件前后的变量、宏、函数、结构体或者类的声明,这里可以通过python的clang库来获得,clang库解析c、c++语言的抽象语法树,并可以获得声明所在的具体位置,这里的位置包括代码开始行号和结束行号。
其次,计算变动文件前后的变量、宏、函数、结构体或者类的声明变化。这里的变化主要涉及增加、删除、修改,增加是指pre_version版本不存在的,now_version版本改动后才增加的声明;删除是指pre_version版本存在的,now_version版本改动后被删除了的声明;修改是指声明是一样的,但是做了修改,比如某个函数修改了逻辑实现,改变了某个类的内部结构。判断方法如下:
1)对pre_version版本的文件获得文件里所有声明的起始行号和结束行号,比如图7中示出的声明addition(函数),它的起始行号是22,结束行号是28。然后遍历删除行,也就是步骤501中得到的delete_line,如果删除行的行号大于声明的首行并且小于声明的结束行号,则该声明被改动;比如文件A的第N行被改动,而文件A的声明C中,起始行号Start_Num,结束行号为End_Num,如果N大于等于Start_Num且小于等于End_Num,声明C就是文件A的改动声明之一,把变动的声明加入到列表中保存。
2)对now_version版本的文件获得文件里所有声明的起始行号和结束行号。然后遍历新增或者修改行号,也就是步骤501里得到的modify_line,如果新增或者修改行的行号大于声明的起始行号并且小于声明的结束行号,则该声明被改动,把变动的声明加入到列表中保存。通过上述1)、2)2个步骤,能够获取所有变动的声明。
最后,对声明的行数通过git blame或svn blame的方法,获得声明头的提交记录日志(cursor_log)。这里得到的数据包括:改动的文件,以及其文件中变动的声明(变量、宏、函数、结构体或者类),变动的声明所在文件的行数(line),提交日志(cursor_log),声明里面新增、修改的行及其提交日志(modify_line),声明中删除的行及其提交日志(delete_line),数据对应的存储结构如图15所示。
步骤503,获取变动的声明、及变动的声明关联的引用声明,并获取各声明对应的提交日志。
在实际实施时,获得变动的声明(变量、宏、函数、结构体或者类)、及变动的声明关联的所有引用声明,并通过git blame或svn blame的方法,获得前述各声明的提交日志。并基于clang计算获取变动的声明(宏、函数、结构体或者类)关联的所有引用声明。实现过程中,采用深度优先的递归方法,把循环嵌套的深层次引用也找出来,每一次递归取到的引用结果包括文件路径和行号,并通过文件名和行号,获得引用的提交记录日志。并生成一个树状的数据格式,变动声明对应的所有引用,还有引用下的引用。示例性地,每一级引用的数据结构如下:
步骤504,从提交日志获得需求单标识或缺陷单标识,并获得需求单标识所属功能模块,及缺陷单标识所属功能模块。
在实际实施时,从步骤502和步骤503获得的提交记录或日志里面,提取提交记录对应的需求单标识或缺陷单标识,然后根据需求单标识或缺陷单标识获得该需求单所属于的功能模块,并从系统中拿到该模块的测试跟进人、用例、以及需要的测试时间。
步骤505,生成报告,显示变动涉及的功能模块以及对应的测试用例,显示变动声明的声明调用树。
在实际实施时,根据前面步骤得到的数据,生成报告。报告内容包括,变动代码的声明调用树(即函数或类调用树),便于评估一次或一批改动所涉及的所有功能模块,测试跟进人,关联的测试用例,以及需要的测试时间。
应用本申请实施例,不仅可以突破跨编程语言的界限,精准获得变动代码关联的功能模块,既防止代码交叉影响造成的漏测又可以节省全量回归的人力。还可以方便评估每次改动批次,涉及的模块,以及对应的测试时间。另外,还可以辅助代码review,清晰的浏览代码的来龙去脉。
可以理解的是,在本申请实施例中,涉及到用户信息等相关的数据,当本申请实施例运用到具体产品或技术中时,需要获得用户许可或者同意,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
下面继续说明本申请实施例提供的应用程序的功能测试装置555的实施为软件模块的示例性结构,在一些实施例中,如图2所示,存储在存储器550的应用程序的功能测试装置555中的软件模块可以包括:
第一获取模块5551,用于获取应用程序的目标代码版本及参考代码版本,其中,所述目标代码版本的创建时间晚于所述参考代码版本的创建时间;
比较模块5552,用于比较所述目标代码版本与所述参考代码版本之间的差异,得到相较于所述参考代码版本、所述目标代码版本变动的代码行,所述变动的代码行关联至少两种功能;
第二获取模块5553,用于获取所述变动的代码行所属的目标声明、以及所述目标声明关联的引用声明;
测试模块5554,用于结合所述目标声明及所述引用声明,对所述变动的代码行所关联的至少两种功能进行测试,得到测试结果。
在一些实施例中,所述第二获取模块,还用于获取所述目标代码版本的至少一个第一声明信息、及所述参考代码版本的至少一个第二声明信息,其中,所述第一声明信息及所述第二声明信息包括声明的名称、声明的代码行;基于所述至少一个第一声明信息、及所述至少一个第二声明信息,确定所述变动的代码行所属的目标声明。
在一些实施例中,所述第二获取模块,还用于当所述变动的代码行属于所述目标代码版本时,针对各所述第一声明信息执行以下操作:将所述变动的代码行与当前所述第一声明信息的代码行进行匹配,当匹配结果表征所述变动的代码行属于当前所述第一声明信息时,将当前所述第一声明信息作为所述目标声明;当所述变动的代码行不属于所述目标代码版本、且属于所述参考代码版本时,针对各所述第二声明信息执行以下操作:将所述变动的代码行与当前所述第二声明信息的代码行进行匹配,当匹配结果表征所述变动的代码行属于当前所述第二声明信息时,将所述第二声明信息作为所述目标声明。
在一些实施例中,所述第二获取模块,还用于确定所述变动的代码行归属的目标类别组,所述目标类别组为新增行组、修改行组、删除行组中之一,所述新增行组,用于存储相较于所述参考代码版本、所述目标代码版本新增的代码行,所述修改行组,用于存储相较于所述参考代码版本、所述目标代码版本修改的代码行,所述删除行组,用于存储相较于所述参考代码版本、所述目标代码版本删除的代码行;当所述目标类别组为新增行组或修改行组时,从所述目标代码版本的至少一个声明中,确定所述变动的代码行所属的目标声明;当所述目标类别组为删除行组时,从所述参考代码版本的至少一个声明中,确定所述变动的代码行所属的目标声明。
在一些实施例中,所述第二获取模块,还用于获取所述目标代码版本中各所述声明的位置信息,所述位置信息包括所述声明的起始行号和结束行号;针对所述目标代码版本中各所述声明的位置信息,执行以下操作:当所述变动的代码行的行号大于等于当前位置信息的起始行号、且小于等于所述当前位置信息的结束行号时,将所述当前位置信息所指示的声明作为所述变动的代码行所属的目标声明。
在一些实施例中,所述第二获取模块,还用于确定所述变动的代码行与所述目标代码版本的第一归属关系、以及所述变动的代码行与所述参考代码版本的第二归属关系;基于所述第一归属关系及所述第二归属关系,确定所述变动的代码行归属的目标类别组。
在一些实施例中,所述第二获取模块,还用于当所述第一归属关系表征所述变动的代码行属于所述目标代码版本、且所述第二归属关系表征所述变动的代码行不属于所述参考代码版本时,确定所述变动的代码行属于所述新增行组;当所述第一归属关系表征所述变动的代码行不属于所述目标代码版本、且所述第二归属关系表征所述变动的代码行属于所述参考代码版本时,确定所述变动的代码行属于所述删除行组;当所述第一归属关系表征所述变动的代码行属于所述目标代码版本、且所述第二归属关系表征所述变动的代码行属于所述参考代码版本时,确定所述变动的代码行属于所述修改行组。
在一些实施例中,所述第二获取模块,还用于解析所述变动的代码行,得到所述变动的代码行对应的标记符,所述标记符,用于表征所述变动的代码行的归属;当所述标记符指示所述变动的代码行属于所述目标代码版本、且不属于所述参考代码版本时,确定所述变动的代码行属于新增行组;当所述标记符指示所述变动的代码行不属于所述目标代码版本、且属于所述参考代码版本时,确定所述变动的代码行属于删除行组;当所述标记符指示所述变动的代码行属于所述目标代码版本、且属于所述参考代码版本时,确定所述变动的代码行属于修改行组。
在一些实施例中,所述第二获取模块,还用于获取所述目标声明所属的代码版本;当所述目标声明所属的代码版本为所述目标代码版本时,获取所述目标代码版本的声明调用树,所述声明调用树,用于表征所述目标代码版本所关联的至少两个声明间的调用关系;基于所述声明调用树,确定所述目标声明关联的引用声明。
在一些实施例中,所述测试模块,还用于结合所述目标声明及所述引用声明,确定所述变动的代码行对应的测试任务,并基于所述测试任务,确定与所述目标声明及所述引用声明对应的目标测试用例;通过所述目标测试用例,对所述变动的代码行所关联的至少两种功能进行测试,得到测试结果。
在一些实施例中,所述第一获取模块,还用于获取所述应用程序的至少两个历史代码版本;基于代码版本的版本号,从所述至少两个历史代码版本中选择所述目标代码版本及所述参考代码版本。
本申请实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行本申请实施例上述的应用程序的功能测试方法。
本申请实施例提供一种存储有可执行指令的计算机可读存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本申请实施例提供的应用程序的功能测试方法,例如,如图3示出的应用程序的功能测试方法。
在一些实施例中,计算机可读存储介质可以是FRAM、ROM、PROM、EPROM、EEPROM、闪存、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(HTML,Hyper TextMarkup Language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
综上所述,通过本申请实施例,不仅可以突破跨编程语言的界限,精准获得变动代码关联的功能模块,既防止代码交叉影响造成的漏测,保证测试的准确性,又能节省测试成本,另外,还可以方便评估每次改动批次,涉及的模块,以及对应的测试时间。
以上所述,仅为本申请的实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本申请的保护范围之内。
Claims (15)
1.一种应用程序的功能测试方法,其特征在于,所述方法包括:
获取应用程序的目标代码版本及参考代码版本;
其中,所述目标代码版本的创建时间晚于所述参考代码版本的创建时间;
比较所述目标代码版本与所述参考代码版本之间的差异,得到相较于所述参考代码版本、所述目标代码版本变动的代码行,所述变动的代码行关联至少两种功能;
获取所述变动的代码行所属的目标声明、以及所述目标声明关联的引用声明;
结合所述目标声明及所述引用声明,对所述变动的代码行所关联的至少两种功能进行测试,得到测试结果。
2.如权利要求1所述的方法,其特征在于,所述获取所述变动的代码行所属的目标声明,包括:
获取所述目标代码版本的至少一个第一声明信息、及所述参考代码版本的至少一个第二声明信息,其中,所述第一声明信息及所述第二声明信息包括声明的名称、声明的代码行;
基于所述至少一个第一声明信息、及所述至少一个第二声明信息,确定所述变动的代码行所属的目标声明。
3.如权利要求2所述的方法,其特征在于,所述基于所述至少一个第一声明信息、及所述至少一个第二声明信息,确定所述变动的代码行所属的目标声明,包括:
当所述变动的代码行属于所述目标代码版本时,针对各所述第一声明信息执行以下操作:将所述变动的代码行与当前所述第一声明信息的代码行进行匹配,当匹配结果表征所述变动的代码行属于当前所述第一声明信息时,将当前所述第一声明信息作为所述目标声明;
当所述变动的代码行不属于所述目标代码版本、且属于所述参考代码版本时,针对各所述第二声明信息执行以下操作:将所述变动的代码行与当前所述第二声明信息的代码行进行匹配,当匹配结果表征所述变动的代码行属于当前所述第二声明信息时,将所述第二声明信息作为所述目标声明。
4.如权利要求1所述的方法,其特征在于,所述获取所述变动的代码行所属的目标声明,包括:
确定所述变动的代码行归属的目标类别组,所述目标类别组为新增行组、修改行组、删除行组中之一,
所述新增行组,用于存储相较于所述参考代码版本、所述目标代码版本新增的代码行,所述修改行组,用于存储相较于所述参考代码版本、所述目标代码版本修改的代码行,所述删除行组,用于存储相较于所述参考代码版本、所述目标代码版本删除的代码行;
当所述目标类别组为新增行组或修改行组时,从所述目标代码版本的至少一个声明中,确定所述变动的代码行所属的目标声明;
当所述目标类别组为删除行组时,从所述参考代码版本的至少一个声明中,确定所述变动的代码行所属的目标声明。
5.如权利要求4所述的方法,其特征在于,所述从所述目标代码版本的至少一个声明中,确定所述变动的代码行所属的目标声明,包括:
获取所述目标代码版本中各所述声明的位置信息,所述位置信息包括所述声明的起始行号和结束行号;
针对所述目标代码版本中各所述声明的位置信息,执行以下操作:
当所述变动的代码行的行号大于等于当前位置信息的起始行号、且小于等于所述当前位置信息的结束行号时,将所述当前位置信息所指示的声明作为所述变动的代码行所属的目标声明。
6.如权利要求4所述的方法,其特征在于,所述确定所述变动的代码行归属的目标类别组,包括:
确定所述变动的代码行与所述目标代码版本的第一归属关系、以及所述变动的代码行与所述参考代码版本的第二归属关系;
基于所述第一归属关系及所述第二归属关系,确定所述变动的代码行归属的目标类别组。
7.如权利要求6所述的方法,其特征在于,所述基于所述第一归属关系及所述第二归属关系,确定所述变动的代码行归属的目标类别组,包括:
当所述第一归属关系表征所述变动的代码行属于所述目标代码版本、且所述第二归属关系表征所述变动的代码行不属于所述参考代码版本时,确定所述变动的代码行属于所述新增行组;
当所述第一归属关系表征所述变动的代码行不属于所述目标代码版本、且所述第二归属关系表征所述变动的代码行属于所述参考代码版本时,确定所述变动的代码行属于所述删除行组;
当所述第一归属关系表征所述变动的代码行属于所述目标代码版本、且所述第二归属关系表征所述变动的代码行属于所述参考代码版本时,确定所述变动的代码行属于所述修改行组。
8.如权利要求4所述的方法,其特征在于,所述确定所述变动的代码行归属的目标类别组,包括:
解析所述变动的代码行,得到所述变动的代码行对应的标记符,所述标记符,用于表征所述变动的代码行的归属;
当所述标记符指示所述变动的代码行属于所述目标代码版本、且不属于所述参考代码版本时,确定所述变动的代码行属于新增行组;
当所述标记符指示所述变动的代码行不属于所述目标代码版本、且属于所述参考代码版本时,确定所述变动的代码行属于删除行组;
当所述标记符指示所述变动的代码行属于所述目标代码版本、且属于所述参考代码版本时,确定所述变动的代码行属于修改行组。
9.如权利要求1所述的方法,其特征在于,所述获取所述目标声明关联的引用声明,包括:
获取所述目标声明所属的代码版本;
当所述目标声明所属的代码版本为所述目标代码版本时,获取所述目标代码版本的声明调用树,所述声明调用树,用于表征所述目标代码版本所关联的至少两个声明间的调用关系;
基于所述声明调用树,确定所述目标声明关联的引用声明。
10.如权利要求1所述的方法,其特征在于,所述结合所述目标声明及所述引用声明,对所述变动的代码行所关联的至少两种功能进行测试,得到测试结果,包括:
结合所述目标声明及所述引用声明,确定所述变动的代码行对应的测试任务,并基于所述测试任务,确定与所述目标声明及所述引用声明对应的目标测试用例;
通过所述目标测试用例,对所述变动的代码行所关联的至少两种功能进行测试,得到测试结果。
11.如权利要求1所述的方法,其特征在于,所述获取应用程序的目标代码版本及参考代码版本,包括:
获取所述应用程序的至少两个历史代码版本;
基于代码版本的版本号,从所述至少两个历史代码版本中选择所述目标代码版本及所述参考代码版本。
12.一种应用程序的功能测试装置,其特征在于,所述装置包括:
第一获取模块,用于获取应用程序的目标代码版本及参考代码版本,其中,所述目标代码版本的创建时间晚于所述参考代码版本的创建时间;
比较模块,用于比较所述目标代码版本与所述参考代码版本之间的差异,得到相较于所述参考代码版本、所述目标代码版本变动的代码行,所述变动的代码行关联至少两种功能;
第二获取模块,用于获取所述变动的代码行所属的目标声明、以及所述目标声明关联的引用声明;
测试模块,用于结合所述目标声明及所述引用声明,对所述变动的代码行所关联的至少两种功能进行测试,得到测试结果。
13.一种电子设备,其特征在于,所述电子设备包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现权利要求1至11任一项所述的应用程序的功能测试方法。
14.一种计算机可读存储介质,存储有可执行指令,其特征在于,所述可执行指令被处理器执行时实现权利要求1至11任一项所述的应用程序的功能测试方法。
15.一种计算机程序产品,包括计算机程序或指令,其特征在于,所述计算机程序或指令被处理器执行时实现权利要求1至11任一项所述的应用程序的功能测试方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210892437.5A CN117520136A (zh) | 2022-07-27 | 2022-07-27 | 应用程序的功能测试方法、装置、设备及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210892437.5A CN117520136A (zh) | 2022-07-27 | 2022-07-27 | 应用程序的功能测试方法、装置、设备及可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117520136A true CN117520136A (zh) | 2024-02-06 |
Family
ID=89757160
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210892437.5A Pending CN117520136A (zh) | 2022-07-27 | 2022-07-27 | 应用程序的功能测试方法、装置、设备及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117520136A (zh) |
-
2022
- 2022-07-27 CN CN202210892437.5A patent/CN117520136A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11907107B2 (en) | Auto test generator | |
CN110704297B (zh) | 代码评审方法、装置、计算机设备及存储介质 | |
Zhang et al. | Analyzing and supporting adaptation of online code examples | |
US9311077B2 (en) | Identification of code changes using language syntax and changeset data | |
Sacramento et al. | Web application model generation through reverse engineering and UI pattern inferring | |
CN105389262A (zh) | 一种针对界面测试生成测试建议的方法和装置 | |
CN113377431A (zh) | 一种代码处理方法、装置、设备及介质 | |
CN115033894A (zh) | 一种基于知识图谱的软件组件供应链安全检测方法及装置 | |
CN112799718A (zh) | 一种枚举文档的生成方法、装置、电子设备及存储介质 | |
CN115543781A (zh) | 汽车软件模型自动化验证的方法及交互系统 | |
CN115292197A (zh) | 一种软件测试方法、装置、电子设备及存储介质 | |
EP2105837A2 (en) | Test script transformation analyzer with change guide engine | |
Li et al. | Generating concise patches for newly released programming assignments | |
CN114968817A (zh) | 代码改动影响范围的评估方法、装置、设备及存储介质 | |
CN109189688B (zh) | 一种测试用例脚本的生成方法、生成装置及电子设备 | |
CN113778852A (zh) | 一种基于正则表达式的代码分析方法 | |
US8930765B2 (en) | Systems and methods for feedback driven regression testing | |
CN113126998B (zh) | 一种增量源码获取方法、装置、电子设备及存储介质 | |
Amintabar et al. | ExceptionTracer: A solution recommender for exceptions in an integrated development environment | |
CN116016270A (zh) | 一种交换机测试管理方法、装置、电子设备和存储介质 | |
CN115599683A (zh) | 自动化测试方法、装置、设备及存储介质 | |
CN117520136A (zh) | 应用程序的功能测试方法、装置、设备及可读存储介质 | |
CN114691197A (zh) | 代码分析方法、装置、电子设备和存储介质 | |
CN115129598A (zh) | 一种sql语句的风险检测方法、装置、系统及介质 | |
CN114356783A (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 |