本发明涉及计算机领域,具体而言,涉及一种代码覆盖率统计方法、装置、存储介质、处理器和终端。
背景技术:
覆盖测试是衡量测试质量的一个重要指标。在对一个软件产品进行过单元测试、组装测试、集成测试以及接口测试等诸多测试之后,便需要对测试质量进行考察。如果测试过程仅覆盖到软件产品的一小部分代码,那么无论编写多少测试用例,也难以确保测试质量。相反地,如果测试过程已覆盖到软件产品的绝大部分代码,那么则可以根据测试结果来衡量软件产品的质量。
目前运用较为广泛的代码覆盖方式主要包括:语句覆盖和判断覆盖。
方式一、语句覆盖(statementcoverage),又称为行覆盖(linecoverage)、段覆盖(segmentcoverage)或者基本块覆盖(basicblockcoverage),其为一种最为常用的覆盖方式,用于度量被测试代码中的每个可执行语句是否被执行完毕。此处提到的“可执行语句”不包含诸如c++的头文件声明、代码注释、空行等,而仅统计能够执行的代码已经有多少行被执行完毕。
需要注意的是,单独一行的花括号{}也时常被统计。语句覆盖时常被视为“最弱的覆盖”,其只关注覆盖代码中的执行语句,却不考虑各种分支的组合等其他情形,由此造成测试效果较为局限,难以充分发现代码中所存在的问题。
方式二、判断覆盖(decisioncoverage),又称为分支覆盖(branchcoverage),所有边界覆盖(all-edgescoverage),基本路径覆盖(basicpathcoverage)或者判定路径覆盖(decision-decision-path),其用于度量被测试代码中每个判定的分支是否均被测试完毕。
基于上述介绍内容,相关技术中提供了一种基于本地代码的判断覆盖策略,其可以包括如下执行步骤:
步骤一、建立任务,在该步骤中需要输入任务名、责任程序、责任测试工程师(qa)、关联项目版本管理系统的特定版本号(svn_ver),以手动建立任务。测试人员在将本地代码修改提交到项目版本管理系统(svn)时,需要手动增加关联的svn_ver来更新任务信息。
步骤二、覆盖记录,在该步骤中需要设置关联svn_ver修改的文件为覆盖测试的追踪对象并记录在追踪的文件中已经执行过哪些代码。
步骤三、上传覆盖率,在该步骤中需要手动触发上传操作,以上传任务信息、本地代码文件、覆盖率结果至服务端。
步骤四、在服务端查看覆盖率,在该步骤中可以查看关于覆盖率的统计结果,显示有修改的函数,其中,未覆盖代码的字体为红色,已覆盖代码的字体为蓝色。
然而,上述代码覆盖率测试方案存在如下技术缺陷:
(1)建立更新任务、上传覆盖率等操作均需要手动触发才能够完成。如果测试终端重启,还需要手动恢复测试任务。
(2)大量的测试逻辑设置在测试终端,代码更新成本大,而且还无法实现强制更新。
(3)无法设置多个责任程序和责任qa,多个测试终端的覆盖率结果只能相互覆盖,无法合并,不利于合作。
针对上述的问题,目前尚未提出有效的解决方案。
技术实现要素:
本发明其中一实施例提供了一种代码覆盖率统计方法、装置、存储介质、处理器和终端,以至少解决相关技术中所提供的代码覆盖率测试方案任务建立和更新需要人工参与,操作过程复杂、测试效率较低的技术问题。
根据本发明其中一实施例,提供了一种代码覆盖率统计方法,包括:
触发第一服务器向第二服务器发送通知消息,其中,第一服务器用于对修改后的代码文件进行版本管理,第二服务器用于建立和更新与修改后的代码文件关联的覆盖率统计任务集合,通知消息用于通知第二服务器确定覆盖率统计任务集合;从覆盖率统计任务集合中获取待测试的覆盖率统计任务;按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器。
可选地,从覆盖率统计任务集合中获取待测试的覆盖率统计任务包括以下之一:根据接收到的任务标识从覆盖率统计任务集合中选取与任务标识对应的覆盖率统计任务;根据测试端标识将覆盖率统计任务集合中的部分或全部覆盖率统计任务均设置为待测试的覆盖率统计任务;其中,覆盖率统计任务集合中的每个覆盖率统计任务均满足以下条件:测试端本地处理的代码分支与每个覆盖率统计任务处理的代码分支相同,测试端本地处理的代码版本号大于或等于覆盖率统计任务集合中各个覆盖率统计任务的初始版本号,部分或全部覆盖率统计任务均处于测试中状态,初始版本号是指在每个覆盖率统计任务所归属的分支上与每个覆盖率统计任务建立时的版本号相邻的前一个版本号。
可选地,按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器包括:按照待测试的覆盖率统计任务对测试端上的代码或代码编译后文件的覆盖率检测过程进行实时监控;每间隔预设时长向第二服务器上报当前最新的代码覆盖率统计结果;在覆盖率检测过程执行完毕时,将代码覆盖率统计结果上传至第二服务器;其中,每次上报的代码覆盖率统计结果中携带的信息至少包括:修改后的代码文件的文件标识,待测试的覆盖率统计任务的任务标识、运行在测试端上代码的版本号,代码覆盖率统计涉及的覆盖范围。
可选地,按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器还包括:确定当前存在未发送至第一服务器的已修改代码部分;将已修改代码部分的文件标识、以及文件差异内容上报至第二服务器,其中,文件差异内容是将已修改代码部分与第一服务器上存储的对应文件进行比较后得到的。
可选地,在按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器之后,还包括:访问第二服务器,查询代码覆盖率统计结果,其中,在第二服务器上每个测试端对应的代码覆盖率统计结果相互分离,与代码覆盖率统计结果关联的代码文件被完整显示,与代码覆盖率统计关联的第一部分代码的背景显示为第一颜色,未与代码覆盖率统计关联的第二部分代码的背景显示为第二颜色,在第一部分代码中已覆盖的代码显示为第三颜色,在第一部分代码中未覆盖的代码显示为第四颜色,在第二部分代码中已覆盖的代码显示为第五颜色,在第二部分代码中未覆盖的代码显示为第六颜色。
可选地,第二服务器还用于在获取到通知消息后,从通知消息中提取任务标识,并根据任务标识从第一服务器获取与待测试的覆盖率统计任务关联的测试对象文件以及从第三服务器获取与待测试的覆盖率统计任务关联的测试人员信息和任务描述信息,并基于测试对象文件和测试人员信息建立待测试的覆盖率统计任务。
根据本发明其中一实施例,还提供了另一种代码覆盖率统计方法,包括:
接收测试端上传的代码覆盖率统计结果,其中,代码覆盖率统计结果是由测试端从第二服务器为测试端分配的任务关联的代码文件在测试端上运行过程中被记录下来的;对上传的代码覆盖率统计结果或第二服务器上存储的代码覆盖率统计结果进行调整。
可选地,对上传的代码覆盖率统计结果或第二服务器上存储的代码覆盖率统计结果进行调整包括以下之一:确定当前存在未发送至第一服务器的已修改代码部分,并根据已修改代码部分的位置信息对代码覆盖率统计结果进行调整;根据测试端上的代码文件的第一版本号与第二服务器上对应文件的第二版本号的同步结果对代码覆盖率统计结果进行调整;根据第一服务器上修改的代码文件对代码覆盖率统计结果进行调整,其中,第一服务器用于对修改后的代码文件进行版本管理。
可选地,根据测试端上的代码文件的第一版本号与第二服务器上对应文件的第二版本号的同步结果对代码覆盖率统计结果进行调整包括以下至少之一:当第一版本号与第二版本号相同时,将代码覆盖率统计结果加成至第二服务器的代码覆盖率统计结果中;当第一版本号小于第二版本号时,获取第二版本号与第一版本号之间的文件差异内容,并根据文件差异内容对代码覆盖率统计结果进行调整,再将调整后的代码覆盖率统计结果加成至第二服务器的代码覆盖率统计结果中;当第一版本号大于第二版本号时,获取第一版本号与初始版本号之间的第一文件差异内容,并根据第一文件差异内容对代码需要覆盖内容进行调整;以及获取第一版本号与第二版本号之间的第二文件差异内容,并根据第一文件差异内容和第二文件差异内容对第二服务器上的代码覆盖率统计结果进行调整,然后再将新上传代码覆盖率统计结果加成至第二服务器上调整后的代码覆盖率统计结果中,同时将第二服务器上的代码文件版本替换为第一版本号。
可选地,根据第一服务器上修改的代码文件对代码覆盖率统计结果进行调整包括:将第二服务器上的代码文件的版本号设置为第一版本号以及将第一服务器上更新的代码文件的版本号设置为第二版本号;获取第二版本号与初始版本号之间的第一文件差异内容,并根据第一文件差异内容对代码需要覆盖内容进行调整;以及获取第二版本号与第一版本号之间的第二文件差异内容,并根据第二文件差异内容对第二服务器上的代码覆盖率统计结果进行调整。
根据本发明其中一实施例,还提供了一种代码覆盖率统计装置,包括:
触发模块,用于触发第一服务器向第二服务器发送通知消息,其中,第一服务器用于对修改后的代码文件进行版本管理,第二服务器用于建立和更新与修改后的代码文件关联的覆盖率统计任务集合,通知消息用于通知第二服务器确定覆盖率统计任务集合;获取模块,用于从覆盖率统计任务集合中获取待测试的覆盖率统计任务;统计模块,用于按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器。
可选地,获取模块,用于从覆盖率统计任务集合中获取待测试的覆盖率统计任务包括以下之一:根据接收到的任务标识从覆盖率统计任务集合中选取与任务标识对应的覆盖率统计任务;根据测试端标识将覆盖率统计任务集合中的部分或全部覆盖率统计任务均设置为待测试的覆盖率统计任务;其中,覆盖率统计任务集合中的每个覆盖率统计任务均满足以下条件:测试端本地处理的代码分支与每个覆盖率统计任务处理的代码分支相同,测试端本地处理的代码版本号大于或等于覆盖率统计任务集合中各个覆盖率统计任务的初始版本号,部分或全部覆盖率统计任务均处于测试中状态,初始版本号是指在每个覆盖率统计任务所归属的分支上与每个覆盖率统计任务建立时的版本号相邻的前一个版本号。
可选地,统计模块包括:监控单元,用于按照待测试的覆盖率统计任务对测试端上的代码或代码编译后文件的覆盖率检测过程进行实时监控;第一上报单元,用于每间隔预设时长向第二服务器上报当前最新的代码覆盖率统计结果,以及在覆盖率检测过程执行完毕时,将代码覆盖率统计结果上传至第二服务器;其中,每次上报的代码覆盖率统计结果中携带的信息至少包括:修改后的代码文件的文件标识,待测试的覆盖率统计任务的任务标识、运行在测试端上代码的版本号,代码覆盖率统计涉及的覆盖范围。
可选地,统计模块还包括:确定单元,用于确定当前存在未发送至第一服务器的已修改代码部分;第二上报单元,用于将已修改代码部分的文件标识、以及文件差异内容上报至第二服务器,其中,文件差异内容是将已修改代码部分与第一服务器上存储的对应文件进行比较后得到的。
可选地,上述装置还包括:查询模块,用于访问第二服务器,查询代码覆盖率统计结果,其中,在第二服务器上每个测试端对应的代码覆盖率统计结果相互分离,与代码覆盖率统计结果关联的代码文件被完整显示,与代码覆盖率统计关联的第一部分代码的背景显示为第一颜色,未与代码覆盖率统计关联的第二部分代码的背景显示为第二颜色,在第一部分代码中已覆盖的代码显示为第三颜色,在第一部分代码中未覆盖的代码显示为第四颜色,在第二部分代码中已覆盖的代码显示为第五颜色,在第二部分代码中未覆盖的代码显示为第六颜色。
根据本发明其中一实施例,还提供了另一种代码覆盖率统计装置,包括:
接收模块,用于接收测试端上传的代码覆盖率统计结果,其中,代码覆盖率统计结果是由测试端从第二服务器为测试端分配的任务关联的代码文件在测试端上运行过程中被记录下来的;调整模块,用于对上传的代码覆盖率统计结果或第二服务器上存储的代码覆盖率统计结果进行调整。
可选地,调整模块,用于对上传的代码覆盖率统计结果或第二服务器上存储的代码覆盖率统计结果进行调整包括以下之一:确定当前存在未发送至第一服务器的已修改代码部分,并根据已修改代码部分的位置信息对代码覆盖率统计结果进行调整;根据测试端上的代码文件的第一版本号与第二服务器上对应文件的第二版本号的同步结果对代码覆盖率统计结果进行调整;根据第一服务器上修改的代码文件对代码覆盖率统计结果进行调整,其中,第一服务器用于对修改后的代码文件进行版本管理。
可选地,调整模块,用于根据测试端上的代码文件的第一版本号与第二服务器上对应文件的第二版本号的同步结果对代码覆盖率统计结果进行调整包括以下至少之一:当第一版本号与第二版本号相同时,将代码覆盖率统计结果加成至第二服务器的代码覆盖率统计结果中;当第一版本号小于第二版本号时,获取第二版本号与第一版本号之间的文件差异内容,并根据文件差异内容对代码覆盖率统计结果进行调整,再将调整后的代码覆盖率统计结果加成至第二服务器的代码覆盖率统计结果中;当第一版本号大于第二版本号时,获取第一版本号与初始版本号之间的第一文件差异内容,并根据第一文件差异内容对代码需要覆盖内容进行调整;以及获取第一版本号与第二版本号之间的第二文件差异内容,并根据第一文件差异内容和第二文件差异内容对第二服务器上的代码覆盖率统计结果进行调整,然后再将新上传代码覆盖率统计结果加成至第二服务器上调整后的代码覆盖率统计结果中,同时将第二服务器上的代码文件版本替换为第一版本号。
可选地,调整模块,用于根据第一服务器上修改的代码文件对代码覆盖率统计结果进行调整包括以下执行步骤:将第二服务器上的代码文件的版本号设置为第一版本号以及将第一服务器上更新的代码文件的版本号设置为第二版本号;获取第二版本号与初始版本号之间的第一文件差异内容,并根据第一文件差异内容对代码需要覆盖内容进行调整;以及获取第二版本号与第一版本号之间的第二文件差异内容,并根据第二文件差异内容对第二服务器上的代码覆盖率统计结果进行调整。
根据本发明其中一实施例,还提供了一种存储介质,存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行上述代码覆盖率统计方法。
根据本发明其中一实施例,还提供了一种处理器,处理器用于运行程序,其中,程序运行时执行上述代码覆盖率统计方法。
在本发明实施例中,采用触发第一服务器向第二服务器发送通知消息,其中,第一服务器用于对修改后的代码文件进行版本管理,第二服务器用于建立和更新与修改后的代码文件关联的覆盖率统计任务集合,通知消息用于通知第二服务器确定覆盖率统计任务集合的方式,通过从覆盖率统计任务集合中获取待测试的覆盖率统计任务;按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器,从而实现了降低人力成本,提高代码覆盖率测试的效率和准确率的技术效果,进而解决了相关技术中所提供的代码覆盖率测试方案任务建立和更新需要人工参与,操作过程复杂、测试效率较低的技术问题。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明其中一实施例的一种代码覆盖率统计方法的流程图;
图2是根据本发明其中一优选实施例的代码覆盖率统计方法的示意图;
图3是根据本发明其中一实施例的另一种代码覆盖率统计方法的流程图;
图4是根据本发明其中一实施例的一种代码覆盖率统计装置的结构框图;
图5是根据本发明其中一优选实施例的一种代码覆盖率统计装置的结构框图;
图6是根据本发明其中一实施例的另一种代码覆盖率统计装置的结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
根据本发明其中一实施例,提供了一种代码覆盖率统计方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
图1是根据本发明其中一实施例的一种代码覆盖率统计方法的流程图,如图1所示,该方法包括如下步骤:
步骤s12,触发第一服务器向第二服务器发送通知消息,其中,第一服务器用于对修改后的代码文件进行版本管理,第二服务器用于建立和更新与修改后的代码文件关联的覆盖率统计任务集合,通知消息用于通知第二服务器确定覆盖率统计任务集合;
步骤s14,从覆盖率统计任务集合中获取待测试的覆盖率统计任务;
步骤s16,按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器。
通过上述步骤,可以采用触发第一服务器向第二服务器发送通知消息,其中,第一服务器用于对修改后的代码文件进行版本管理,第二服务器用于建立和更新与修改后的代码文件关联的覆盖率统计任务集合,通知消息用于通知第二服务器确定覆盖率统计任务集合的方式,通过从覆盖率统计任务集合中获取待测试的覆盖率统计任务;按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器,从而实现了降低人力成本,提高代码覆盖率测试的效率和准确率的技术效果,进而解决了相关技术中所提供的代码覆盖率测试方案任务建立和更新需要人工参与,操作过程复杂、测试效率较低的技术问题。
需要说明的是,本发明至少部分实施例所采用的代码覆盖率策略主要为判断覆盖。
在优选实施过程中,上述第二服务器还用于在获取到通知消息后,从通知消息中提取任务标识,并根据任务标识从第一服务器获取与待测试的覆盖率统计任务关联的测试对象文件以及从第三服务器获取与所述待测试的覆盖率统计任务关联的测试人员信息和任务描述信息,并基于测试对象文件和测试人员信息建立待测试的覆盖率统计任务。
上述待测试的覆盖率统计任务包含三个要素:测试对象文件、测试人员信息以及任务需要覆盖的代码。在具体实施过程中,可以通过终端本地的程序员提交修改后代码文件这个动作来触发待测试的覆盖率统计任务的建立和更新。
图2是根据本发明其中一优选实施例的代码覆盖率统计方法的示意图,如图2所示,首先,在测试端本地向第一服务器(例如:版本管理服务器)提交修改后的代码文件之后,触发第一服务器向第二服务器发送通知消息,其中,该通知消息中携带的信息可以包括但不限于:修改后的代码文件的文件标识,修改后的代码文件的版本号(例如:版本1)以及日志信息。其次,第二服务器从日志信息中提取任务标识。如果任务标识为#-1表示无需覆盖提交,可以不做处理。再次,第二服务器可以根据任务标识从第一服务器获取与待测试的覆盖率统计任务关联的测试对象文件以及从第三服务器获取与所述待测试的覆盖率统计任务关联的测试人员信息和任务描述信息。如果未能获取到相关信息或者查询失败,则记录本次查询过程并发出告警。然后,如果与上述任务标识对应的待测试的覆盖率统计任务尚未建立,则需要设置版本1的前一个版本0作为初始版本,并提交修改后的代码文件加入到任务追踪列表,任务的结束版本设置为版本1,进而根据初始版本和结束版本之间的差异内容产生该修改后的代码文件需要覆盖的内容。
在具体实施过程中,可以使用python的一个库ply进行简单地词法分析,获取版本1代码文件的分词(token),以提取出if、while、for等判断分支的起始行和终止行。如果特定一行有效代码被修改,那么其所属的整个判断分支都需要被覆盖。例如:
2215ifitem_show_num_ecp[itcon]then
2216self.label_num:setvisible(true)
2217(新增)self.label_num:settext(item_show_num_ecp[itcon])
在上述修改后的代码文件中新增有第2217行,进而整个判断分支第2215-2217行都需要被覆盖。
可选地,在步骤s14中,从覆盖率统计任务集合中获取待测试的覆盖率统计任务可以包括以下方式之一:
方式一、根据接收到的任务标识从覆盖率统计任务集合中选取与任务标识对应的覆盖率统计任务;
方式二、根据测试端标识将覆盖率统计任务集合中的部分或全部覆盖率统计任务均设置为待测试的覆盖率统计任务;
其中,覆盖率统计任务集合中的每个覆盖率统计任务均满足以下条件:测试端本地处理的代码分支与每个覆盖率统计任务处理的代码分支相同,测试端本地处理的代码版本号大于或等于覆盖率统计任务集合中各个覆盖率统计任务的初始版本号,部分或全部覆盖率统计任务均处于测试中状态,初始版本号是指在每个覆盖率统计任务所归属的分支上与每个覆盖率统计任务建立时的版本号相邻的前一个版本号。
在待测试的覆盖率统计任务的执行过程中,首先需要确定测试端的归属,以此来区分不同测试人员提交的覆盖率统计结果。常见的区分方式是根据访问的互联网协议(ip)地址。对于智能手机、个人计算机等终端类型的测试端而言,每个终端独享一个ip地址,而在局域网中的ip地址也是相对稳定的,这个ip地址同时也是测试端可以无需登录访问服务端的凭证。然而,如果测试端搭建在服务器上,例如:搭建在一个虚拟机上的多个游戏服务端,那么会出现多个游戏服务端将共享同一个ip地址。在这种情况下,可以根据该游戏服务端对外开放的套接字(sokect)端口来确定归属,此时归属标识信息将由测试端上传至服务端。
在确定归属问题之后,便可以访问第二服务端以获取属于自身的覆盖率任务信息。具体地,测试端可以选择输入特定任务标识来测试对应的单个覆盖率统计任务,也可以不输入特定任务标识来测试部分或全部待测试的覆盖率统计任务。并且,每个可测试的覆盖率统计任务均满足以下条件:测试端本地处理的代码分支与每个覆盖率统计任务处理的代码分支相同,测试端本地处理的代码版本号大于或等于覆盖率统计任务集合中各个覆盖率统计任务的初始版本号,部分或全部覆盖率统计任务均处于测试中状态(覆盖率统计任务存在测试中、挂起、关闭三种状态)。最终,测试端从第二服务器获取到的信息可以包括但不限于:任务标识、提交过的分支信息、初始版本号、任务追踪列表,进而监控任务追踪列表中包含的修改后的代码文件的覆盖执行结果。
可选地,在步骤s16中,按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器可以包括以下执行步骤:
步骤s161,按照待测试的覆盖率统计任务对测试端上的代码或代码编译后文件的覆盖率检测过程进行实时监控;
步骤s162,每间隔预设时长向第二服务器上报当前最新的代码覆盖率统计结果;
步骤s163,在覆盖率检测过程执行完毕时,将代码覆盖率统计结果上传至第二服务器;
其中,每次上报的代码覆盖率统计结果中携带的信息至少包括:修改后的代码文件的文件标识,待测试的覆盖率统计任务的任务标识、运行在测试端上代码的版本号,代码覆盖率统计涉及的覆盖范围。
在实施监控覆盖率执行结果的过程中,每间隔预设时长(例如:5分钟)便需要自动上传一次覆盖率结果到第二服务器,以防止测试端异常退出导致覆盖率统计结果的丢失。另外,在正常退出测试端(服务器关机、退出测试端应用)时上传一次覆盖率统计结果。在覆盖率统计结果上传完毕之后,还可以对第二服务器上正在测试的任务进行更新,进而确定是否新增有跟踪文件或者待测试分支。如果测试任务已经被关闭或者挂起,则可以暂停追踪该任务。
需要说明的是,如果测试端的代码发生更新(例如:热更新代码、客户端升级、服务器重启)时需要执行一次覆盖率统计结果上传操作,其原因在于:后续代码可能会发生改变。为此,可以在代码更新的回调过程中加入恢复测试任务的相关程序。如果测试端允许进行数据存档,则可以根据第一次设置任务时的任务信息加以存档,并检测原有的测试任务是否满足新增代码的分支和版本要求。如果满足要求,则继续追踪该任务;如果不满足要求,则暂停追踪该任务。如果测试端不希望进行数据存档,则可以在更新过后访问第二服务器,以获取属于自身的待测试的覆盖率统计任务并自动设置追踪。
另外,在每次上报的代码覆盖率统计结果中携带的信息可以包括但不限于:修改后的代码文件的文件标识,待测试的覆盖率统计任务的任务标识、修改后的代码文件的版本号,代码覆盖率统计涉及的覆盖范围。
可选地,在步骤s16中,按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器还可以包括以下执行步骤:
步骤s164,确定当前存在未发送至第一服务器的已修改代码部分;
步骤s165,将已修改代码部分的文件标识、以及文件差异内容上报至第二服务器,其中,文件差异内容是将已修改代码部分与第一服务器上存储的对应文件进行比较后得到的。
如果测试端存在尚未上传至第一服务器的修改后的代码文件,则测试端需要将已修改代码部分的文件标识、第一服务器的标识信息以及将已修改代码部分与第一服务器上存储的对应文件进行比较后得到的文件差异内容上报至第二服务器。
可选地,在步骤s16,按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器之后,还可以包括以下执行步骤:
步骤s17,访问第二服务器,查询代码覆盖率统计结果,其中,在第二服务器上每个测试端对应的代码覆盖率统计结果相互分离,与代码覆盖率统计结果关联的代码文件被完整显示,与代码覆盖率统计关联的第一部分代码的背景显示为第一颜色,未与代码覆盖率统计关联的第二部分代码的背景显示为第二颜色,在第一部分代码中已覆盖的代码显示为第三颜色,在第一部分代码中未覆盖的代码显示为第四颜色,在第二部分代码中已覆盖的代码显示为第五颜色,在第二部分代码中未覆盖的代码显示为第六颜色。
在访问第二服务器的过程中,默认显示与访问者关联的覆盖率统计任务,点击该任务可以进入任务概览页面。然后在点击特定追踪任务之后,进入覆盖率统计结果查看页面。在显示时,以一个代码文件的最上层分支为最小展示块(函数、函数外的判断分支),只要该最小展示块发生改动,则显示整个最小展示块的内容,否则不显示最小展示块的内容。展示页面可以结合代码差异显示和覆盖率结果显示,以便于查看需要覆盖的内容是否正确。如果测试端是专有的,则支持对归属的测试端分别展示覆盖率结果。代码中可能存在其他任务修改的部分或者无法跑到容错代码,对此可以忽略置为灰色,而单纯新增或者删除注释行或空行无需进行当前分支的覆盖。另外,需要覆盖的分支背景显示为第一颜色(例如:灰色),而不需要覆盖的分支背景显示为第二颜色(例如:白色)。需要覆盖的分支中未覆盖的代码显示为第三颜色(例如:红色),需要覆盖的分支中已覆盖的代码显示为第四颜色(例如:蓝色)。无需覆盖的分支中未覆盖的代码显示为第五颜色(例如:灰色),无需覆盖的分支中已覆盖的代码显示为第六颜色(例如:浅蓝色)。
基于上述分析,如果发生第一服务器更新时访问第二服务器错误,则记录上次已经录入的原有版本信息并在第一服务器hook传递新的版本信息时,查询原有版本信息与新的版本信息之间的日志记录,确定是否遗漏未处理的版本。如果发生第二服务器向第三服务器查询错误,则记录查询失误的版本号,并每间隔一段时间后重新查询。如果在程序员提交的日志记录中忘记标明关联任务,则需要记录对应版本号并可以手动填写任务单号关联。如果程序员关联了错误单号,导致任务的起始版本设置过大或者终止版本设置过小,那么可以通过手动方式修复。如果第二服务器已记录测试端提交的每个版本对应的覆盖率统计结果,发现其中特定的覆盖率计算有误,则可以通过手动方式修复并重新计算。
通过本发明提供的上述实施例,能够达到如下技术效果:自动建立、更新以及恢复覆盖率统计任务,自动上传代码覆盖率统计结果,以减少人力成本和可能造成的遗漏;对于多人合作项目,支持覆盖率的合并和分属查看,以便能够更好地监控覆盖率统计结果;简化测试端的逻辑,尽量将功能实现设置在服务端,以减少代码更新的成本。
根据本发明其中一实施例,还提供了另一种代码覆盖率统计方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
图3是根据本发明其中一实施例的另一种代码覆盖率统计方法的流程图,如图3所示,该方法包括如下步骤:
步骤s32,接收测试端上传的代码覆盖率统计结果,其中,代码覆盖率统计结果是由测试端从第二服务器为测试端分配的任务关联的代码文件在测试端上运行过程中被记录下来的;
步骤s34,对上传的代码覆盖率统计结果或第二服务器上存储的代码覆盖率统计结果进行调整。
可选地,在步骤s34中,对上传的代码覆盖率统计结果或第二服务器上存储的代码覆盖率统计结果进行调整可以包括以下方式之一:
方式一、确定当前存在未发送至第一服务器的已修改代码部分,并根据已修改代码部分的位置信息对代码覆盖率统计结果进行调整;
方式二、根据测试端上的代码文件的第一版本号与第二服务器上对应文件的第二版本号的同步结果对代码覆盖率统计结果进行调整;
方式三、根据第一服务器上修改的代码文件对代码覆盖率统计结果进行调整,其中,第一服务器用于对修改后的代码文件进行版本管理。
在上述方式一中,在将代码覆盖率统计结果上传至第二服务器之前,需要去除本地差异内容所造成的影响。考虑到不需要对未提交到第一服务器的代码进行代码覆盖率测试,而本地差异内容通常是为了满足测试需要而增加的调试语句,为此,对覆盖率统计结果进行行数平移即可。例如:本地修改代码与第一服务器上该版本代码的差异如下所示:
1ifitem_show_num_ecp[itcon]then
2(新增)debugxxx
3self.label_num:settext(item_show_num_ecp[itcon])
原本需要上传的代码覆盖率统计结果包含三行代码(即第1行、第2行和第3行),但是,由于第2行代码“debugxxxx”为本地修改内容,因此,在舍弃本地差异内容之后,便可以得到需要上传的代码覆盖率统计结果包含两行代码(即第1行和第2行),即,舍弃第2行,原有的第3行现在变成了第2行。
可选地,对于上述方式二,根据测试端上的代码文件的第一版本号与第二服务器上对应文件的第二版本号的同步结果对代码覆盖率统计结果进行调整可以包括以下之一:
(1)当第一版本号与第二版本号相同时,将代码覆盖率统计结果加成至第二服务器的代码覆盖率统计结果中;
(2)当第一版本号小于第二版本号时,获取第二版本号与第一版本号之间的文件差异内容,并根据文件差异内容对代码覆盖率统计结果进行调整,再将调整后的代码覆盖率统计结果加成至第二服务器的代码覆盖率统计结果中;
(3)当第一版本号大于第二版本号时,获取第一版本号与初始版本号之间的第一文件差异内容,并根据第一文件差异内容对代码需要覆盖内容进行调整;以及获取第一版本号与第二版本号之间的第二文件差异内容,并根据第一文件差异内容和第二文件差异内容对第二服务器上的代码覆盖率统计结果进行调整,然后再将新上传代码覆盖率统计结果加成至第二服务器上调整后的代码覆盖率统计结果中,同时将第二服务器上的代码文件版本替换为第一版本号。
如果第一版本号与第二版本号相同,则可以直接新增本次覆盖率统计结果。
如果第一版本号小于第二版本号,则首先根据第二版本号与第一版本号之间的文件差异内容对覆盖率统计结果执行行数的平移和基于判定覆盖策略的覆盖结果舍弃。例如:
2214echoxxxx
2215ifitem_show_num_ecp[itcon]then
2216self.label_num:setvisible(true)
2217(新增)self.label_num:settext(item_show_num_ecp[itcon])
2218else
第一版本覆盖第2214,2215,2216,2217行,而经过平移处理后,覆盖第2214,2215,2216,2218行,由于判定覆盖需要重新覆盖第2215和2216行,因此,新增覆盖结果为第2214和2218行,覆盖率版本是第二版本。
如果第一版本号大于第二版本号,那么便需要重新根据任务的第一版本号和初始版本号之间的差异产生需要覆盖的内容,并根据第一文件差异内容对代码需要覆盖内容进行调整。然后,再对第二服务器记录的第二版本的覆盖率结果执行基于第一版本号与第二版本号之间差异的行数平移和覆盖结果舍弃,此时覆盖率版本是第一版本。
可选地,对于上述方式三,根据第一服务器上修改的代码文件对代码覆盖率统计结果进行调整可以包括以下执行步骤:
第一步、将第二服务器上的代码文件的版本号设置为第一版本号以及将第一服务器上更新的代码文件的版本号设置为第二版本号;
第二步、获取第二版本号与初始版本号之间的第一文件差异内容,并根据第一文件差异内容对代码需要覆盖内容进行调整;以及获取第二版本号与第一版本号之间的第二文件差异内容,并根据第二文件差异内容对第二服务器上的代码覆盖率统计结果进行调整。
根据本发明其中一实施例,还提供了一种代码覆盖率统计装置的实施例,图4是根据本发明其中一实施例的一种代码覆盖率统计装置的结构框图,如图4所示,该装置包括:触发模块10,用于触发第一服务器向第二服务器发送通知消息,其中,第一服务器用于对修改后的代码文件进行版本管理,第二服务器用于建立和更新与修改后的代码文件关联的覆盖率统计任务集合,通知消息用于通知第二服务器确定覆盖率统计任务集合;获取模块20,用于从覆盖率统计任务集合中获取待测试的覆盖率统计任务;统计模块30,用于按照待测试的覆盖率统计任务对修改后的代码或代码编译后文件进行代码覆盖率统计,并将代码覆盖率统计结果上传至第二服务器。
可选地,获取模块20,用于从覆盖率统计任务集合中获取待测试的覆盖率统计任务包括以下之一:根据接收到的任务标识从覆盖率统计任务集合中选取与任务标识对应的覆盖率统计任务;根据测试端标识将覆盖率统计任务集合中的部分或全部覆盖率统计任务均设置为待测试的覆盖率统计任务;其中,覆盖率统计任务集合中的每个覆盖率统计任务均满足以下条件:测试端本地处理的代码分支与每个覆盖率统计任务处理的代码分支相同,测试端本地处理的代码版本号大于或等于覆盖率统计任务集合中各个覆盖率统计任务的初始版本号,部分或全部覆盖率统计任务均处于测试中状态,初始版本号是指在每个覆盖率统计任务所归属的分支上与每个覆盖率统计任务建立时的版本号相邻的前一个版本号。
可选地,统计模块30包括:监控单元(图中未示出),用于按照待测试的覆盖率统计任务对测试端上的代码或代码编译后文件的覆盖率检测过程进行实时监控;第一上报单元(图中未示出),用于每间隔预设时长向第二服务器上报当前最新的代码覆盖率统计结果,以及在覆盖率检测过程执行完毕时,将代码覆盖率统计结果上传至第二服务器;其中,每次上报的代码覆盖率统计结果中携带的信息至少包括:修改后的代码文件的文件标识,待测试的覆盖率统计任务的任务标识、运行在测试端上代码的版本号,代码覆盖率统计涉及的覆盖范围。
可选地,统计模块30还包括:确定单元(图中未示出),用于确定当前存在未发送至第一服务器的已修改代码部分;第二上报单元(图中未示出),用于将已修改代码部分的文件标识、以及文件差异内容上报至第二服务器,其中,文件差异内容是将已修改代码部分与第一服务器上存储的对应文件进行比较后得到的。
可选地,图5是根据本发明其中一优选实施例的一种代码覆盖率统计装置的结构框图,如图5所示,上述装置还包括:查询模块40,用于访问第二服务器,查询代码覆盖率统计结果,其中,在第二服务器上每个测试端对应的代码覆盖率统计结果相互分离,与代码覆盖率统计结果关联的代码文件被完整显示,与代码覆盖率统计关联的第一部分代码的背景显示为第一颜色,未与代码覆盖率统计关联的第二部分代码的背景显示为第二颜色,在第一部分代码中已覆盖的代码显示为第三颜色,在第一部分代码中未覆盖的代码显示为第四颜色,在第二部分代码中已覆盖的代码显示为第五颜色,在第二部分代码中未覆盖的代码显示为第六颜色。
根据本发明其中一实施例,还提供了另一种代码覆盖率统计装置的实施例,图6是根据本发明其中一实施例的另一种代码覆盖率统计装置的结构框图,如图6所示,该装置包括:接收模块50,用于接收测试端上传的代码覆盖率统计结果,其中,代码覆盖率统计结果是由测试端从第二服务器为测试端分配的任务关联的代码文件在测试端上运行过程中被记录下来的;调整模块60,用于对上传的代码覆盖率统计结果或第二服务器上存储的代码覆盖率统计结果进行调整。
可选地,调整模块60,用于对上传的代码覆盖率统计结果或第二服务器上存储的代码覆盖率统计结果进行调整包括以下之一:确定当前存在未发送至第一服务器的已修改代码部分,并根据已修改代码部分的位置信息对代码覆盖率统计结果进行调整;根据测试端上的代码文件的第一版本号与第二服务器上对应文件的第二版本号的同步结果对代码覆盖率统计结果进行调整;根据第一服务器上修改的代码文件对代码覆盖率统计结果进行调整,其中,第一服务器用于对修改后的代码文件进行版本管理。
可选地,调整模块60,用于根据测试端上的代码文件的第一版本号与第二服务器上对应文件的第二版本号的同步结果对代码覆盖率统计结果进行调整包括以下至少之一:当第一版本号与第二版本号相同时,将代码覆盖率统计结果加成至第二服务器的代码覆盖率统计结果中;当第一版本号小于第二版本号时,获取第二版本号与第一版本号之间的文件差异内容,并根据文件差异内容对代码覆盖率统计结果进行调整,再将调整后的代码覆盖率统计结果加成至第二服务器的代码覆盖率统计结果中;当第一版本号大于第二版本号时,获取第一版本号与初始版本号之间的第一文件差异内容,并根据第一文件差异内容对代码需要覆盖内容进行调整;以及获取第一版本号与第二版本号之间的第二文件差异内容,并根据第一文件差异内容和第二文件差异内容对第二服务器上的代码覆盖率统计结果进行调整,然后再将新上传代码覆盖率统计结果加成至第二服务器上调整后的代码覆盖率统计结果中,同时将第二服务器上的代码文件版本替换为第一版本号。
可选地,调整模块60,用于根据第一服务器上修改的代码文件对代码覆盖率统计结果进行调整包括以下执行步骤:将第二服务器上的代码文件的版本号设置为第一版本号以及将第一服务器上更新的代码文件的版本号设置为第二版本号;获取第二版本号与初始版本号之间的第一文件差异内容,并根据第一文件差异内容对代码需要覆盖内容进行调整;以及获取第二版本号与第一版本号之间的第二文件差异内容,并根据第二文件差异内容对第二服务器上的代码覆盖率统计结果进行调整。
根据本发明其中一实施例,还提供了一种存储介质,存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行上述代码覆盖率统计方法。上述存储介质可以包括但不限于:u盘、只读存储器(rom)、随机存取存储器(ram)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
根据本发明其中一实施例,还提供了一种处理器,处理器用于运行程序,其中,程序运行时执行上述代码覆盖率统计方法。上述处理器可以包括但不限于:微处理器(mcu)或可编程逻辑器件(fpga)等的处理装置。
根据本发明其中一实施例,还提供了一种终端,包括:一个或多个处理器,存储器,显示装置以及一个或多个程序,其中,一个或多个程序被存储在存储器中,并且被配置为由一个或多个处理器执行,一个或多个程序用于执行上述代码覆盖率统计方法。在一些实施例中,上述终端可以是智能手机(例如:android手机、ios手机等)、平板电脑、掌上电脑以及移动互联网设备(mobileinternetdevices,简称为mid)、pad等终端设备。上述显示装置可以是触摸屏式的液晶显示器(lcd),该液晶显示器可使得用户能够与终端的用户界面进行交互。此外,上述终端还可以包括:输入/输出接口(i/o接口)、通用串行总线(usb)端口、网络接口、电源和/或相机。
根据本发明其中一实施例,还提供了一种服务端,包括:一个或多个处理器,存储器,显示装置以及一个或多个程序,其中,一个或多个程序被存储在存储器中,并且被配置为由一个或多个处理器执行,一个或多个程序用于执行上述代码覆盖率统计方法。在一些实施例中,该服务端用于经由一个网络接收或者发送数据。上述的网络具体实例可包括服务端的通信供应商提供的无线网络。在一个实例中,服务端包括一个网络适配器(networkinterfacecontroller,简称为nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,服务端可以包含一个射频(radiofrequency,简称为rf)模块,其用于通过无线方式与互联网进行通讯。测试终端可以经由数据网络连接或电子连接到服务端(例如:游戏服务器、安全服务器、资源服务器)。数据网络连接可以是局域网连接、广域网连接、因特网连接,或其他类型的数据网络连接。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。