覆盖率检测的启动方法、装置和启动设备与流程

文档序号:12464159阅读:610来源:国知局
覆盖率检测的启动方法、装置和启动设备与流程

本发明涉及计算机技术领域,尤其涉及一种覆盖率检测的启动方法、装置和启动设备。



背景技术:

代码覆盖率测试,是软件测试过程中最重要的测试方法和测试效果衡量标准之一,覆盖率指的是源代码执行过程中被测试所覆盖到代码的比例和程度,通常用百分比表示。

对不同的编程语言来说,都有相应的检测代码覆盖率的方法。在针对游戏服务器的python代码覆盖率检测的过程中,通常使用的技术方案是利用python自带的sys.settrace函数进行数据收集和处理,在停止采集之后,一次性地导出覆盖率数据报告。由于代码覆盖率检测的实时性要求,随着游戏规模的增大和项目的发展,需要测试的代码量越来越高,如何更好地维护和存储覆盖率测试中获取的覆盖率数据成为了必须解决的问题。一般来说,覆盖率数据,包括了文件覆盖率数据和目录覆盖率数据,每个文件的已执行过的代码行号集合,该文件总的可执行代码行号集合等等,而每当有新的覆盖率数据到来,比如某个文件的一些代码被执行,那么就需要重新计算当前文件、当前文件所在的目录甚至于总体的覆盖率数据。目前一种具体的获取覆盖率数据的方式是利用python的sys模块中提供settrace函数,跟踪代码的执行情况,将覆盖率数据存储到Collector中的Stack中。每当开始采集时,Collector不断执行入栈操作,停止采集时,通过出栈操作即可获取已采集的覆盖率数据。

然而,每次启动覆盖率检测,都需要读取所有代码的目录结构,并且需要解析每个文件的可执行代码行总数,因此当项目规模和代码量较大时,启动这一步骤会带来极大的性能和时间消耗,而代码又在不断地迭代开发中,启动操作十分频繁。



技术实现要素:

本发明实施例提供一种覆盖率检测的启动方法、装置和启动设备,用于解决每次启动覆盖率检测,都需要读取所有代码的目录结构,并且需要解析每个文件的可执行代码行总数,因此当项目规模和代码量较大时,启动这一步骤会带来极大的性能和时间消耗的问题。

本发明第一方面提供一种覆盖率检测的启动方法,包括:

当获取到覆盖率检测启动指令时,根据所述覆盖率检测启动指令中的待检测文件和所述待检测文件的待检测版本号码,检测本地存储的文件目录数据中是否存在所述待检测文件的所述待检测版本号码对应的数据;

若不存在,则根据差异获取函数将所述文件目录数据中所述待检测文件的当前目录数据更新为所述待检测版本号码对应的新的目录数据,得到新的文件目录数据;

将所述新的文件目录数据发送至覆盖率服务器。

可选的,所述方法还包括:

若存在,则将所述文件目录数据发送至所述覆盖率服务器。

可选的,所述方法还包括:

所述文件目录数据用于由覆盖率服务器计算得到所述待检测文件的代码覆盖率。

可选的,所述根据所述覆盖率检测启动指令中的待检测文件和所述待检测文件的待检测版本号码,检测本地存储的文件目录数据中是否存在所述待检测文件的所述待检测版本号码对应的数据之前,所述方法包括:

当本地不存在文件目录数据时,根据每个文件的文件名称和目录信息生成树形存储结构的所述文件目录数据;其中,所述树形存储结构的根节点下包括至少一层以目录信息以及文件名称逐层建立的子节点;每个节点的目录数据包括其下层子节点的目录数据的集合。

可选的,所述根据差异获取函数将所述文件目录数据中所述待检测文件的当前目录数据更新为所述待检测版本号码对应的新的目录数据,得到新的文件目录数据,包括:

获取所述待检测文件的最新一次更新的版本号码对应的目录数据;

根据所述待检测版本号码和所述文件目录数据中所述待检测文件的最新一次更新的版本号码,采用所述差异获取函数,获取所述待检测文件发生的变化;

若所述变化为修改和或添加,对所述发生变化的代码进行代码解析,得到所述新的目录数据;

若所述变化为删除,则直接删除所述待检测文件当前目录数据中被删除的部分,得到所述新的目录数据。

本发明第二方面提供一种覆盖率检测的启动装置,包括:

获取模块,用于获取到覆盖率检测启动指令;

处理模块,用于当所述获取模块获取到覆盖率检测启动指令时,根据所述覆盖率检测启动指令中的待检测文件和所述待检测文件的待检测版本号码,检测本地存储的文件目录数据中是否存在所述待检测文件的所述待检测版本号码对应的数据;

若不存在,则所述处理模块还用于根据差异获取函数将所述文件目录数据中所述待检测文件的当前目录数据更新为所述待检测版本号码对应的新的目录数据,得到新的文件目录数据;

发送模块,用于将所述新的文件目录数据发送至覆盖率服务器。

可选的,所述发送模块还用于在文件目录数据中存在所述待检测文件的所述待检测版本号码对应的数据时,将所述文件目录数据发送至所述覆盖率服务器。

可选的,所述处理模块获取的所述文件目录数据用于由覆盖率服务器计算得到所述待检测文件的代码覆盖率。

可选的,所述处理模块还用于:

当本地不存在文件目录数据时,根据每个文件的文件名称和目录信息生成树形存储结构的所述文件目录数据;其中,所述树形存储结构的根节点下包括至少一层以目录信息以及文件名称逐层建立的子节点;每个节点的目录数据包括其下层子节点的目录数据的集合。

可选的,所述处理模块具体用于:

获取所述待检测文件的最新一次更新的版本号码对应的目录数据;

根据所述待检测版本号码和所述文件目录数据中所述待检测文件的最新一次更新的版本号码,采用所述差异获取函数,获取所述待检测文件发生的变化;

若所述变化为修改和或添加,对所述发生变化的代码进行代码解析,得到所述新的目录数据;

若所述变化为删除,则直接删除所述待检测文件当前目录数据中被删除的部分,得到所述新的目录数据。

本发明第三方面提供一种启动设备,包括:存储有程序指令的存储器、用于控制程序指令执行的处理器以及发送器;

所述处理器用于:

当获取到覆盖率检测启动指令时,根据所述覆盖率检测启动指令中的待检测文件和所述待检测文件的待检测版本号码,检测本地存储的文件目录数据中是否存在所述待检测文件的所述待检测版本号码对应的数据;

若不存在,则根据差异获取函数将所述文件目录数据中所述待检测文件的当前目录数据更新为所述待检测版本号码对应的新的目录数据,得到新的文件目录数据;

所述发送器用于将所述新的文件目录数据发送至覆盖率服务器。

本发明实施例提供的覆盖率检测的启动方法、装置和启动设备,当获取到覆盖率检测启动指令时,运行端的服务器根据覆盖率检测启动指令中的待检测文件和待检测文件的待检测版本号码,检测本地存储的文件目录数据中是否存在待检测文件的待检测版本号码对应的数据,若不存在,则根据差异获取函数将文件目录数据中待检测文件的当前目录数据更新为待检测版本号码对应的新的目录数据,得到新的文件目录数据,将新的文件目录数据发送至覆盖率服务器采用该方法,可避免在代码量较大的时候每次进行覆盖率检测都需要重新读取完整的目录并生成对应数据结构,有效缩短启动时间,降低性能消耗。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。

图1为本发明实施例提供的覆盖率检测的启动方法实施例一的流程图;

图2为本发明实施例提供的覆盖率检测的启动方法实施例二的流程图;

图3为本发明实施例提供的覆盖率检测的启动方法一实例的流程图;

图4为本发明提供的树形存储结构的示意图;

图5为本发明实施例提供的覆盖率检测的启动装置实施例一的结构示意图;

图6为本发明实施例提供的启动设备实施例一的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

为了解决现有技术中,每次启动覆盖率检测,都需要读取所有代码的目录结构,并且需要解析每个文件的可执行代码行总数,因此当项目规模和代码量较大时,启动这一步骤会带来极大的性能和时间消耗的问题。本方案提出一种覆盖率检测过程的快速启动方法,在运行服务器侧,启动时检测本地是否存在已有的文件目录数据。若没有文件目录数据,则进行第一次目录生成并存储为文件目录数据;若已有文件目录数据,则读取检测到的文件目录数据,搜索是否有当前同一路径的代码目录数据。若不存在当前代码目录数据,则针对当前代码目录数据进行第一次生成;若存在当前代码目录数据,则根据当前代码的版本号在数据中进行搜索,查看是否存在当前代码的当前版本号的目录数据,如果也存在当前版本号的数据,则直接将该文件目录数据发送至覆盖率服务器。若不存在当前版本号的数据,则在已有数据中搜索,取已有版本号的最大值所对应的数据作为基准,重新申请当前版本的代码的目录数据,将新的文件目录数据存储并发送至覆盖率服务器。下面通过几个具体的实施方式对该快速启动方法进行说明。

图1为本发明实施例提供的覆盖率检测的启动方法实施例一的流程图,如图1所示,该方案的执行主体为启动设备,即执行程序代码的运行侧设备,运行侧的服务器,例如:游戏服务器,该覆盖率检测的启动方法的具体实现步骤为:

步骤S101,当获取到覆盖率检测启动指令时,根据所述覆盖率检测启动指令中的待检测文件和所述待检测文件的待检测版本号码,检测本地存储的文件目录数据中是否存在所述待检测文件的所述待检测版本号码对应的数据。

在本实施例中,在进行覆盖率检测的过程中,首先要启动在运行代码的服务器侧的检测进程,本方案中不需要对每个文件重新进行目录数据生成,而是在获取到检测启动指令后,检查本地的文件目录数据中是否存在该待检测文件的当前版本对应的目录数据,在存在和不存在时分别使用不同的处理方式。

在本方案中,所述文件目录数据用于由覆盖率服务器计算得到所述待检测文件的代码覆盖率。

可选的,如果是首次启动,则需要先生成一次文件目录数据,即服务器根据本地的可运行代码文件,进行第一次目录生成得到文件目录数据,并存储在本地,以便后续再次启动过程中进行查询。

步骤S102,若不存在,则根据差异获取函数将所述文件目录数据中所述待检测文件的当前目录数据更新为所述待检测版本号码对应的新的目录数据,得到新的文件目录数据。

在本步骤中,如果本地存储的文件目录数据中没有该待检测文件的当前版本号对应的目录数据,或者文件目录数据中不存在该待检测文件相关的目录数据,则时候需要对该待检测文件对应的目录数据进行更新,或者生成该待检测文件的目录数据,其他文件对应的目录数据不变,得到新的文件目录数据。

步骤S103,将所述新的文件目录数据发送至覆盖率服务器。

本方案中,将得到的新的文件目录数据发送给覆盖率服务器,在该方案中,不需要对所有的文件的目录数据全部进行生成,只对发生变化的待检测文件的目录数据进行更新。

步骤S104,若存在,则将所述文件目录数据发送至所述覆盖率服务器。

在本步骤中,与上述步骤102、103并列的,若检测本地存储的文件目录数据中存在该待检测文件的目录数据,且存待检测版本号码的数据,则该启动过程中不需要进行目录数据的生成,可以直接将本地的存储文件目录数据发送给覆盖率服务器即可。

本实施例提供的覆盖率检测的启动方法,可避免在代码量较大的时候每次进行覆盖率检测都需要重新读取完整的目录并生成对应数据结构,有效缩短启动时间,降低性能消耗。

在上述实施例中,如果是第一次启动覆盖率检测,即本地不存在文件目录数据,则服务器根据每个文件的文件名称和目录信息生成树形存储结构的所述文件目录数据;其中,所述树形存储结构的根节点下包括至少一层以目录信息以及文件名称逐层建立的子节点;每个节点的目录数据包括其下层子节点的目录数据的集合。使用该树形存储结构更方便对某个文件的数据进行检测,提高处理效率。

图2为本发明实施例提供的覆盖率检测的启动方法实施例二的流程图,如图2所示,在上述实施例的基础上,步骤S102中“根据差异获取函数将所述文件目录数据中所述待检测文件的当前目录数据更新为所述待检测版本号码对应的新的目录数据,得到新的文件目录数据”的具体实现方式为:

步骤S201,获取所述待检测文件的最新一次更新的版本号码对应的目录数据。

在本步骤中,需要根据该待检测文件的名称或者其他的标识信息,从存储的文件目录数据中查询获取该待检测文件上次更新的目录数据,即得到最接近本次版本号码的版本号对应的目录数据。

步骤S202,根据所述待检测版本号码和所述文件目录数据中所述待检测文件的最新一次更新的版本号码,采用所述差异获取函数,获取所述待检测文件发生的变化。

在该方案中,在得到上一次更新目录数据中的该待检测文件的版本号之后,采用差异获取函数,输入本次的待检测版本号码以及上一次的版本号码,获取待检测文件本身发生的变化,例如:程序代码增加、修改或者删除等。

步骤S203,若所述变化为修改和或添加,对所述发生变化的代码进行代码解析,得到所述新的目录数据。

在本步骤中,若该待检测文件的程序代码被修改或者其中增加了新的代码片段,则需要对修改的代码或者新增的代码进行解析,更新该待检测文件的目录数据。

步骤S204,若所述变化为删除,则直接删除所述待检测文件当前目录数据中被删除的部分,得到所述新的目录数据。

若该待检测文件的程序代码中存在代码被删除,即与原来的代码的变化是删除,则可以将当前的目录数据中程序代码被删除的部分对应的数据删除,得到新的目录数据。

通过上述过程可以得到新的文件目录数据,然后按照实施例一的方式将得到的新的文件目录数据发送至覆盖率服务器。

本实施例提供的覆盖率检测的启动方法,当获取到覆盖率检测启动指令时,运行端的服务器根据覆盖率检测启动指令中的待检测文件和待检测文件的待检测版本号码,检测本地存储的文件目录数据中是否存在待检测文件的待检测版本号码对应的数据,若不存在,则根据差异获取函数将文件目录数据中待检测文件的当前目录数据更新为待检测版本号码对应的新的目录数据,得到新的文件目录数据,将新的文件目录数据发送至覆盖率服务器采用该方法,可避免在代码量较大的时候每次进行覆盖率检测都需要重新读取完整的目录并生成对应数据结构,有效缩短启动时间,降低性能消耗。

图3为本发明实施例提供的覆盖率检测的启动方法一实例的流程图,如图3所示,以游戏服务器和覆盖率服务器为例对该方案进行说明。

该覆盖率检测的启动方法主要分为文件目录数据完全生成、目录数据增量生成、持久化存储三个功能。

首先,进行初始化。初始化过程分为启动覆盖率数据处理服务端(即覆盖率服务器)和嵌入覆盖率采集客户端到游戏服务器脚本中两个部分。

覆盖率服务器端基于Tornado构建,主要功能是通过websocket接收来自通过一定规则标识的客户端的数据,并定时将同一游戏服务器的数据合并和处理。在游戏服务器启动测试之前,首先启动覆盖率服务端,等待客户端连接和收集数据。

对于客户端,在游戏服务器中启动不同进程的脚本中,添加使用线程启动websocket连接的代码,具体如下:

ws=websocket.WebSocket("ws://websocket_address/")

thread_ws=threading.Thread(target=ws.run)

thread_ws.start()

该线程用于在每个游戏服务器进程启动websocket并连接到覆盖率服务器后,进行定时的数据发送。

其次,目录数据完全生成

如上图3所示,当没有本地数据或者有本地数据,但是没有当前代码路径对应的本地数据时,说明待检测代码从未进行过覆盖率检测,故需要进行第一次目录数据的完整生成操作:

首先从根目录开始,依次迭代生成整个目录结构(即文件目录数据),具体如下:

图4为本发明提供的树形存储结构的示意图,如图4所示,根节点表示根目录,其下通过逐层节点保存着所有的文件目录数据,在该根节点处可包含的数据有总代码行数(由所有子节点的数据相加得来,初始时候为0),总已执行代码行数(由所有子节点的数据相加得来,初始时候为0),以及总的覆盖率数据(由总的已执行代码行数除以总代码行数得到,初始时候为0)。

其他节点主要分为两类,一类是文件节点,代表某个文件(例如Python的py文件)的覆盖率数据,包括该文件已经执行过的代码行数(初始时候为0),和该文件源码中的可执行代码总行数,以及该文件的覆盖率数值(初始时候为0)。

另一类是目录节点,包含的是该目录下,所有文件和目录覆盖率数据的对应项之和(初始时候为0),即该目录下所有文件和目录的总的已执行代码行数(初始时候为0),和总的可执行代码行数,以及由这两项数据计算出来的覆盖率数值(初始时候为0)。

即根据文件目录,生成对应的树形结构,每个节点除了文件名之外,还需要存储对应的覆盖率初始数据(当前代码可执行行总数等)。

该树形存储架构、根节点以及每一层的子节点,以及每个节点处存储的数据共同构成了初始的文件目录数据。

最后,根据文件的变化进行目录结构增量生成。若当前本地的文件目录数据文件中,有当前代码路径对应的数据,但是只包含有当前路径的旧版本号(通过svn获取)对应的文件目录数据,则说明该代码已经执行过覆盖率检测,但是当前版本是第一次检测,那么执行如下步骤。

首先假设读取的旧数据中最大版本号为r1,当前代码版本号为r2,使用命令svn diff-r r1:r2–summarize,获取两个版本之间的文件变化,也就是哪些文件发生了修改/删除/添加操作。

对发生修改和添加的文件,重新进行可执行代码解析(即去除空行、注释等),记录可执行代码行总数。对发生删除的文件,直接从已有的目录数据中删除对应节点即可。即可得到增量生成的代码目录数据。从而得到新的总体的文件目录数据。

最后,需要将得到的文件目录数据进行持久化存储。

本方案采取pickle进行持久化存储,即获取到目录数据后,以当前代码路径,版本号,文件目录数据作为一条数据进行存储,持久化为本地文件,在启动的时候首先尝试读取。

通过上述方案,可有效解决代码量较大时,每次进行覆盖率检测都需要重新读取完整的目录并生成对应的数据,导致系统启动时间较长,消耗较大的问题,有效缩短启动时间,降低性能消耗。

图5为本发明实施例提供的覆盖率检测的启动装置实施例一的结构示意图,如图5所示,本实施例提供的覆盖率检测的启动装置10包括:

获取模块11,用于获取到覆盖率检测启动指令;

处理模块12,用于当所述获取模块获取到覆盖率检测启动指令时,根据所述覆盖率检测启动指令中的待检测文件和所述待检测文件的待检测版本号码,检测本地存储的文件目录数据中是否存在所述待检测文件的所述待检测版本号码对应的数据;

若不存在,则所述处理模块12还用于根据差异获取函数将所述文件目录数据中所述待检测文件的当前目录数据更新为所述待检测版本号码对应的新的目录数据,得到新的文件目录数据;

发送模块13,用于将所述新的文件目录数据发送至覆盖率服务器。

本实施例提供的覆盖率检测的启动装置,用于执行前述任一实施例提供的方法的技术方案,其实现原理和技术效果类似,在此不再赘述。

在本发明覆盖率检测的启动装置的实施例二中,在上述实施例一的基础上,所述发送模块13还用于在文件目录数据中存在所述待检测文件的所述待检测版本号码对应的数据时,将所述文件目录数据发送至所述覆盖率服务器。

可选的,所述处理模块12获取的所述文件目录数据用于由覆盖率服务器计算得到所述待检测文件的代码覆盖率。

可选的,所述处理模块12还用于:

当本地不存在文件目录数据时,根据每个文件的文件名称和目录信息生成树形存储结构的所述文件目录数据;其中,所述树形存储结构的根节点下包括至少一层以目录信息以及文件名称逐层建立的子节点;每个节点的目录数据包括其下层子节点的目录数据的集合。

可选的,所述处理模块12具体用于:

获取所述待检测文件的最新一次更新的版本号码对应的目录数据;

根据所述待检测版本号码和所述文件目录数据中所述待检测文件的最新一次更新的版本号码,采用所述差异获取函数,获取所述待检测文件发生的变化;

若所述变化为修改和或添加,对所述发生变化的代码进行代码解析,得到所述新的目录数据;

若所述变化为删除,则直接删除所述待检测文件当前目录数据中被删除的部分,得到所述新的目录数据。

本实施例提供的覆盖率检测的启动装置,用来执行前述任一实施例提供的方法的技术方案,其实现原理和技术效果类似,在此不再赘述。

图6为本发明实施例提供的启动设备实施例一的结构示意图,如图6所示,该启动设备可以被具体实现为:存储有程序指令的存储器21、用于控制程序指令执行的处理器22以及发送器23;

所述处理器22用于:

当获取到覆盖率检测启动指令时,根据所述覆盖率检测启动指令中的待检测文件和所述待检测文件的待检测版本号码,检测本地存储的文件目录数据中是否存在所述待检测文件的所述待检测版本号码对应的数据;

若不存在,则根据差异获取函数将所述文件目录数据中所述待检测文件的当前目录数据更新为所述待检测版本号码对应的新的目录数据,得到新的文件目录数据;

所述发送器23用于将所述新的文件目录数据发送至覆盖率服务器。

可选的,所述发送器23还用于在文件目录数据中存在所述待检测文件的所述待检测版本号码对应的数据时,将所述文件目录数据发送至所述覆盖率服务器。

可选的,所述处理器22获取的所述文件目录数据用于由覆盖率服务器计算得到所述待检测文件的代码覆盖率。

可选的,所述处理器22还用于:

当本地不存在文件目录数据时,根据每个文件的文件名称和目录信息生成树形存储结构的所述文件目录数据;其中,所述树形存储结构的根节点下包括至少一层以目录信息以及文件名称逐层建立的子节点;每个节点的目录数据包括其下层子节点的目录数据的集合。

可选的,所述处理器22具体用于:

获取所述待检测文件的最新一次更新的版本号码对应的目录数据;

根据所述待检测版本号码和所述文件目录数据中所述待检测文件的最新一次更新的版本号码,采用所述差异获取函数,获取所述待检测文件发生的变化;

若所述变化为修改和或添加,对所述发生变化的代码进行代码解析,得到所述新的目录数据;

若所述变化为删除,则直接删除所述待检测文件当前目录数据中被删除的部分,得到所述新的目录数据。

本实施例提供的启动设备用于执行前述任一实施例提供的方法的技术方案,其实现原理和技术效果类似,在此不再赘述。

在上述任一启动设备的实施例中,应理解,处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application Specific Integrated Circuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。

本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:只读存储器(英文:read-only memory,缩写:ROM)、RAM、快闪存储器、硬盘、固态硬盘、磁带(英文:magnetic tape)、软盘(英文:floppy disk)、光盘(英文:optical disc)及其任意组合。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

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