代码覆盖率的处理方法、装置、设备及存储介质与流程

文档序号:24073418发布日期:2021-02-26 16:15阅读:125来源:国知局
代码覆盖率的处理方法、装置、设备及存储介质与流程

[0001]
本发明涉及计算机技术领域,尤其涉及一种代码覆盖率的处理方法、装置、设备及存储介质。


背景技术:

[0002]
目前,为了快速粗略估计代码的质量,需要衡量代码方法的覆盖率,以分析未覆盖的方法是否存在代码夹带。jacoco是一个针对java语言开源的覆盖率工具,现有技术中一般使用jacoco工具来得到代码覆盖率。利用jacoco工具分析覆盖率,一方面需要获取代码仓库权限,并获取源码,而仓库权限一般不会轻易获得,另一方面需要反复重启程序,重启会导致覆盖率数据丢失,因此,利用jacoco工具分析覆盖率时的处理效率低,不能实时快速地得到得到覆盖率。


技术实现要素:

[0003]
本发明的目的在于提供一种代码覆盖率的处理方法、装置、设备及存储介质,旨在快速实时地获取覆盖率,提高处理效率。
[0004]
本发明提供一种代码覆盖率的处理方法,包括:
[0005]
开启javaagent代理程序,当接收网络请求时,基于所述javaagent代理程序为所述网络请求开启对应的处理线程,在所述处理线程内设置一变量,所述变量的属性为时间;
[0006]
在运行所述网络请求对应的应用程序时,获取预定目录下所述应用程序的类文件,基于所述javaagent代理程序对所述类文件中的各个函数进行插桩;
[0007]
当所述应用程序在运行过程中调用到已插桩的函数时,基于所述javaagent代理程序录制所述已插桩的函数,并获取所述变量所记录的时间;
[0008]
在所述应用程序运行结束时,基于所记录的时间获取所录制的函数,对所录制的函数进行去重处理,得到被调用函数的数量;
[0009]
获取所述类文件中的调用关系,基于所述调用关系获取所述应用程序函数的总数;
[0010]
基于被调用函数的数量及所述总数计算覆盖率。
[0011]
本发明还提供一种代码覆盖率的处理装置,包括:
[0012]
开启模块,用于开启javaagent代理程序,当接收网络请求时,基于所述javaagent代理程序为所述网络请求开启对应的处理线程,在所述处理线程内设置一变量,所述变量的属性为时间;
[0013]
插桩模块,用于在运行所述网络请求对应的应用程序时,获取预定目录下所述应用程序的类文件,基于所述javaagent代理程序对所述类文件中的各个函数进行插桩;
[0014]
录制模块,用于当所述应用程序在运行过程中调用到已插桩的函数时,基于所述javaagent代理程序录制所述已插桩的函数,并获取所述变量所记录的时间;
[0015]
去重模块,用于在所述应用程序运行结束时,基于所记录的时间获取所录制的函
数,对所录制的函数进行去重处理,得到被调用函数的数量;
[0016]
获取模块,用于获取所述类文件中的调用关系,基于所述调用关系获取所述应用程序函数的总数;
[0017]
处理模块,用于基于被调用函数的数量及所述总数计算覆盖率。
[0018]
本发明还提供一种计算机设备,所述计算机设备包括存储器及与所述存储器连接的处理器,所述存储器中存储有可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上述的代码覆盖率的处理方法的步骤。
[0019]
本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述的代码覆盖率的处理方法的步骤。
[0020]
本发明的有益效果是:本发明首先通过javaagent代理程序对应用程序的类文件中的各个函数进行插桩,以采集各个函数的相关信息,然后,在应用程序在运行过程中,通过javaagent代理程序录制运行过程中的被调用函数的相关信息,获得被调用函数的数量及被调用的时间,最后,通过应用程序的类文件来获得函数的总数,根据被调用函数的数量及总数计算函数的覆盖率,本发明能够快速实时地获取函数覆盖率、处理效率高。
附图说明
[0021]
图1为本发明代码覆盖率的处理方法一实施例的应用环境示意图;
[0022]
图2为本发明代码覆盖率的处理方法第一实施例的流程示意图;
[0023]
图3为图2中的获取所述类文件中的调用关系,基于所述调用关系获取所述应用程序函数的总数步骤的细化流程示意图;
[0024]
图4为本发明调用关系的树形示意图;
[0025]
图5为本发明代码覆盖率的处理装置一实施例的结构示意图;
[0026]
图6为本发明计算机设备一实施例的硬件架构的示意图。
具体实施方式
[0027]
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0028]
需要说明的是,在本发明中涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本发明要求的保护范围之内。
[0029]
参阅图1所示,是本发明代码覆盖率的处理方法一实施例的应用环境示意图。该实施例包括终端1、服务端2,其中,终端1接收请求(例如http请求),将请求发送至服务器2进行处理,服务器2基于请求运行应用程序,计算覆盖率。
[0030]
本发明提供的代码覆盖率的处理方法,可应用在如图1的应用环境中。
[0031]
参阅图2所示,为本发明代码覆盖率的处理方法第一实施例的流程示意图。以代码覆盖率的处理方法应用在图1的环境中为例进行说明,包括:
[0032]
步骤s1,开启javaagent代理程序,当接收网络请求时,基于所述javaagent代理程序为所述网络请求开启对应的处理线程,在所述处理线程内设置一变量,所述变量的属性为时间;
[0033]
其中,javaagent是一个独立于应用程序的代理程序,用来协助监测、运行甚至替换的程序。javaagent代理程序可以是在主程序运行之前运行的程序,也可以是主程序运行之后运行的程序。本实施例中的javaagent为在主程序运行后运行的程序。在开启javaagent代理程后,javaagent代理程序基于websocket开启一个监听端口,用于接收命令。
[0034]
其中,网络请求例如为http请求、资源请求、文件请求、状态请求等等,在通过监听端口接收到终端发送的网络请求时,javaagent代理程序会为该网络请求开启处理线程,并在该处理线程中设置一个属性为时间的变量,该处理线程用于全程跟踪该网络请求对应的应用程序的运行,直至该应用程序结束运行。
[0035]
步骤s2,在运行所述网络请求对应的应用程序时,获取预定目录下所述应用程序的类文件,基于所述javaagent代理程序对所述类文件中的各个函数进行插桩;
[0036]
本实施例中,在接收到网络请求后,运行该网络请求对应的应用程序。已运行的应用程序的类文件部署在预定的目录中,例如在中间件容器中,会在应用服务的特定目录下存在部署的应用程序的classes类文件或jar包,该目录例如为tomcat容器的(tomcat_home/webapps/web-inf/classes/**)目录。
[0037]
本实施例通过javaagent代理程序为应用程序的类文件进行插桩处理,本实施例仅对函数进行插桩,相比于jacoco工具对每行代码进行插桩的函数,本实施例的插桩点更少,插桩的范围更小,对应用程序性能的稳定性影响小。
[0038]
进一步地,基于所述javaagent代理程序对所述类文件中的各个函数进行插桩的步骤,具体包括:基于所述javaagent代理程序获取所述处理线程内的变量,该变量用于在后续录制时实时记录时间,并调用java字节码操作与分析框架模块获取所述类文件中的各个函数名称及函数参数,从而实现对类文件中的各个函数的信息采集。
[0039]
其中,java字节码操作与分析框架模块为asm模块。插桩技术是在保证应用程序原有逻辑完整性的基础上,在应用程序的代码中插入一些桩点,通过桩点的执行抛出代码运行的特征数据(例如函数本身、函数参数值、返回值等),从而收集程序运行时的动态上下文信息。
[0040]
其中,asm模块的核心应用程序接口包括以下几个:
[0041]
1、classreader:classreader会将类文件(.class文件)读入到classreader中的字节数组中,它的accept方法接受一个classvisitor实现类,并按照顺序调用classvisitor中的方法;
[0042]
2、classvisitor:主要负责访问类的成员信息,包括标记在类上的注解、类的构造方法、类的字段、类的方法、静态代码块等;
[0043]
3、classwriter:classwriter是一个classvisitor的子类,是和classreader对应的类,classreader是将类文件读入到一个字节数组中,classwriter是将修改后的类的字
节码内容以字节数组的形式输出;
[0044]
4、methodvisitor是一个抽象类,当asm模块的classreader读取到方法method时就转入methodvisitor接口处理。
[0045]
本实施例通过调用上述的asm模块的核心应用程序接口,主要采集函数的名称及函数参数。
[0046]
步骤s3,当所述应用程序在运行过程中调用到已插桩的函数时,基于所述javaagent代理程序录制所述已插桩的函数,并获取所述变量所记录的时间;
[0047]
其中,应用程序在运行时会调用相应的函数,由于函数经过插桩后已采集到函数的相关信息,因此,当调用到相应的函数时,javaagent代理程序会录制所采集的函数的相关信息,包括函数名称及函数参数,例如,录制的函数“com.pingan.common.a.fun_1”,其中“com.pingan.common.a”为函数的全路径,“fun”为函数名称,“_1”为参数个数。同时会获取变量,该变量记录的是函数被调用的时间,该时间可以用以标识或区分被调用函数。
[0048]
步骤s4,在所述应用程序运行结束时,基于所记录的时间获取所录制的函数,对所录制的函数进行去重处理,得到被调用函数的数量;
[0049]
当应用程序运行结束时,录制完成,在录制完成后通过获取该段时间内被调用的函数的数量,即得到本次应用程序运行时覆盖的函数。例如:第一个函数的被调用时间为20200925101000,最后一个函数的被调用时间为20200925111111.那么在时间段20200925101000至20200925111111内被调用的函数的数量,即为运行时覆盖的函数的数量。
[0050]
进一步地,对所录制的函数进行去重处理,具体包括:
[0051]
获取所录制的函数的函数名称及函数参数个数;
[0052]
对于函数名称及参数个数均相同的两个或两个以上的函数进行剔除处理,保留一个函数。
[0053]
其中,对于录制的函数进行去重处理,函数名称相同、且参数个数相同的函数为重复的函数,需要进行去重处理;函数名称相同但参数个数不相同的函数为不同的函数,不需要去重处理。本实施例将函数名称相同、且参数个数相同的两个或两个以上的函数进行剔除处理,只保留一个函数。去重处理的函数在代码上例如为:df2=df1.drop_duplicates(['fun_name'],keep='first',inplace=false),其中,df1是录制得到的所有函数的列表,通过去重运算后得到df2列表。这样,去重处理后的函数为均不相同的函数。对去重处理后的函数进行统计,得到被调用函数对应的数量。
[0054]
本实施例可将被调用函数的数量存储到数据库中,以进行持久化处理。
[0055]
步骤s5,获取所述类文件中的调用关系,基于所述调用关系获取所述应用程序函数的总数;
[0056]
其中,应用程序部署在预定的目录中,例如java应用程序部署在中间件容器中,会在应用服务的特定目录下存在部署项目的classes类文件或jar包,在应用程序运行结束时,会将该项目下的classes类文件或jar包打包成zip文件并上报。由此,本实施例不需要获取应用程序的源码,而是可以直接获取到上报的zip文件,由此,不需要获取仓库权限,也不需要获取应用程序对应的源码,提高处理效率。当接收到zip文件时,解压zip文件,得到一个或多个类文件。获取类文件中的调用链路,分析class类文件中的调用链路。
[0057]
进一步地,如图3所示,获取所述类文件中的调用关系,基于所述调用关系获取所述应用程序函数的总数的步骤,具体包括:
[0058]
接收上报的所述应用程序的类文件,以访问者模式遍历所述类文件,得到所述类文件中的调用关系;
[0059]
分析所述调用关系得到所述调用链路,基于所述调用链路获取所述应用程序函数的总数。
[0060]
在应用程序运行结束时,接收上报的zip文件,获取zip文件中的类文件,以访问者visitor模式遍历类文件,得到类文件中的调用关系,该访问者visitor模式的事件驱动的处理方式使得只需要关注对于结果有意义的部分,而不必关注类文件的细节部分,例如格式等。该调用关系以图形描述时,例如为一棵树的形式,如图4所示。
[0061]
在图4中,分析上述的调用关系,得到调用链路,如图所示的调用链路包括4条:函数abd的链路一、函数abe的链路二、函数ace的链路三、函数acf的链路四。通过调用链路统计应用程序的所有函数的数量,此外,对统计的函数进行去重处理,即将函数名称相同、且参数个数相同的函数为重复的函数,进行去重处理;函数名称相同但参数个数不相同的函数为不同的函数,不进行去重处理。去重处理后得到应用程序的函数的总数。
[0062]
本实施例可将应用程序的函数的总数存储到数据库中,以进行持久化处理。通过将被调用函数的数量及应用程序的函数的总数进行持久化处理,即使遇到重启的情况也不会丢失覆盖率数据。
[0063]
步骤s6,基于被调用函数的数量及所述总数计算覆盖率。
[0064]
其中,基于被调用函数的数量及所述总数计算覆盖率r=(被调用函数的数量/总数)*100%。
[0065]
本实施例首先通过javaagent代理程序对应用程序的类文件中的各个函数进行插桩,以采集各个函数的相关信息,然后,在应用程序在运行过程中,通过javaagent代理程序录制运行过程中的被调用函数的相关信息,获得被调用函数的数量及被调用的时间,最后,通过应用程序的类文件来获得函数的总数,根据被调用函数的数量及总数计算函数的覆盖率,本实施例能够快速实时地获取函数覆盖率、处理效率高。
[0066]
进一步地,在上述实施例的基础上,还提供代码覆盖率的处理方法的另一实施例,在获取所述类文件中的调用关系的步骤之后,还包括:
[0067]
判断所述调用关系中的每个函数是否为所述被调用函数;
[0068]
若是,则对所述调用关系中的被调用函数进行突出显示处理;
[0069]
将进行突出显示处理后的所述调用关系发送至终端,以进行展示。
[0070]
其中,在遍历类文件得到类文件中的调用关系后,通过判断调用关系中的每一个函数是否为被调用函数,如果不是被调用函数,则不需要处理,如果是被调用函数,则对调用关系中的被调用函数进行突出显示处理,例如为将被调用函数的名称进行高亮处理,或者对被调用函数的名称的背景填充颜色等等,并将进行突出显示处理后的调用关系以图形的形式发送给终端,终端在界面上进行展示,通过这种方式,可以以可视化的方式详细地展示应用程序的类文件中的被调用函数及未被调用函数。
[0071]
进一步地,在上述实施例的基础上,还提供代码覆盖率的处理方法的另一实施例,在开启javaagent代理程序的步骤之后,还包括:令所述javaagent代理程序基于预定的通
信协议开启一个监听端口,所述监听端口用于监听针对所述应用程序的相关指令。
[0072]
本实施例在开启javaagent代理程后,javaagent代理程序基于websocket开启一个监听端口,用于接收命令,例如通过监听端口接收到终端发送的网络请求、通过监听端口接收应用程序运行结束时对应的结束指令。
[0073]
进一步地,在上述实施例的基础上,在所述应用程序运行结束时,还包括:通过所述监听端口接收结束指令,基于所述结束指令清除所述变量的设置,或者基于所述结束指令终止所述javaagent代理程序的录制操作。
[0074]
其中,在应用程序运行结束时,例如执行“exit”时运行结束,这时会通过上述的监听端口接收到结束指令。
[0075]
本实施例中,如果应用程序运行结束,javaagent代理程序可以结束运行,也可以继续运行。如果javaagent代理程序结束运行,那么会终止录制操作。
[0076]
本实施例在应用程序运行结束时,可清除处理线程内变量的设置,后续不会设置变量。这样,不管javaagent代理程序是否执行录制的操作,后续获取到的变量对应的时间都为空,那么javaagent代理程序录制的函数都缺失被调用的时间,视为无效的信息,则将录制的无效信息剔除掉,达到终止录制的目的,提高应用的灵活性。
[0077]
在一实施例中,本发明提供一种代码覆盖率的处理装置,该代码覆盖率的处理装置与上述实施例中方法一一对应。如图5所示,包括:
[0078]
开启模块101,用于开启javaagent代理程序,当接收网络请求时,基于所述javaagent代理程序为所述网络请求开启对应的处理线程,在所述处理线程内设置一变量,所述变量的属性为时间;
[0079]
其中,javaagent是一个独立于应用程序的代理程序,用来协助监测、运行甚至替换的程序。javaagent代理程序可以是在主程序运行之前运行的程序,也可以是主程序运行之后运行的程序。本实施例中的javaagent为在主程序运行后运行的程序。在开启javaagent代理程后,javaagent代理程序基于websocket开启一个监听端口,用于接收命令。
[0080]
其中,网络请求例如为http请求、资源请求、文件请求、状态请求等等,在通过监听端口接收到终端发送的网络请求时,javaagent代理程序会为该网络请求开启处理线程,并在该处理线程中设置一个属性为时间的变量,该处理线程用于全程跟踪该网络请求对应的应用程序的运行,直至该应用程序结束运行。
[0081]
插桩模块102,用于在运行所述网络请求对应的应用程序时,获取预定目录下所述应用程序的类文件,基于所述javaagent代理程序对所述类文件中的各个函数进行插桩;
[0082]
本实施例中,在接收到网络请求后,运行该网络请求对应的应用程序。已运行的应用程序的类文件部署在预定的目录中,例如在中间件容器中,会在应用服务的特定目录下存在部署的应用程序的classes类文件或jar包,该目录例如为tomcat容器的(tomcat_home/webapps/web-inf/classes/**)目录。
[0083]
本实施例通过javaagent代理程序为应用程序的类文件进行插桩处理,本实施例仅对函数进行插桩,相比于jacoco工具对每行代码进行插桩的函数,本实施例的插桩点更少,插桩的范围更小,对应用程序性能的稳定性影响小。
[0084]
进一步地,插桩模块102具体用于基于所述javaagent代理程序获取所述处理线程
内的变量,该变量用于在后续录制时实时记录时间,并调用java字节码操作与分析框架模块获取所述类文件中的各个函数名称及函数参数,从而实现对类文件中的各个函数的信息采集。
[0085]
其中,java字节码操作与分析框架模块为asm模块。插桩技术是在保证应用程序原有逻辑完整性的基础上,在应用程序的代码中插入一些桩点,通过桩点的执行抛出代码运行的特征数据(例如函数本身、函数参数值、返回值等),从而收集程序运行时的动态上下文信息。
[0086]
其中,asm模块的核心应用程序接口包括以下几个:
[0087]
1、classreader:classreader会将类文件(.class文件)读入到classreader中的字节数组中,它的accept方法接受一个classvisitor实现类,并按照顺序调用classvisitor中的方法;
[0088]
2、classvisitor:主要负责访问类的成员信息,包括标记在类上的注解、类的构造方法、类的字段、类的方法、静态代码块等;
[0089]
3、classwriter:classwriter是一个classvisitor的子类,是和classreader对应的类,classreader是将类文件读入到一个字节数组中,classwriter是将修改后的类的字节码内容以字节数组的形式输出;
[0090]
4、methodvisitor是一个抽象类,当asm模块的classreader读取到方法method时就转入methodvisitor接口处理。
[0091]
本实施例通过调用上述的asm模块的核心应用程序接口,主要采集函数的名称及函数参数。
[0092]
录制模块103,用于当所述应用程序在运行过程中调用到已插桩的函数时,基于所述javaagent代理程序录制所述已插桩的函数,并获取所述变量所记录的时间;
[0093]
其中,应用程序在运行时会调用相应的函数,由于函数经过插桩后已采集到函数的相关信息,因此,当调用到相应的函数时,javaagent代理程序会录制所采集的函数的相关信息,包括函数名称及函数参数,例如,录制的函数“com.pingan.common.a.fun_1”,其中“com.pingan.common.a”为函数的全路径,“fun”为函数名称,“_1”为参数个数。同时会获取变量,该变量记录的是函数被调用的时间,该时间可以用以标识或区分被调用函数。
[0094]
去重模块104,用于在所述应用程序运行结束时,基于所记录的时间获取所录制的函数,对所录制的函数进行去重处理,得到被调用函数的数量;
[0095]
当应用程序运行结束时,录制完成,在录制完成后通过获取该段时间内被调用的函数的数量,即得到本次应用程序运行时覆盖的函数。例如:第一个函数的被调用时间为20200925101000,最后一个函数的被调用时间为20200925111111.那么在时间段20200925101000至20200925111111内被调用的函数的数量,即为运行时覆盖的函数的数量。
[0096]
进一步地,去重模块104具体用于,获取所录制的函数的函数名称及函数参数个数;对于函数名称及参数个数均相同的两个或两个以上的函数进行剔除处理,保留一个函数。
[0097]
其中,对于录制的函数进行去重处理,函数名称相同、且参数个数相同的函数为重复的函数,需要进行去重处理;函数名称相同但参数个数不相同的函数为不同的函数,不需
要去重处理。本实施例将函数名称相同、且参数个数相同的两个或两个以上的函数进行剔除处理,只保留一个函数。去重处理的函数在代码上例如为:df2=df1.drop_duplicates(['fun_name'],keep='first',inplace=false),其中,df1是录制得到的所有函数的列表,通过去重运算后得到df2列表。这样,去重处理后的函数为均不相同的函数。对去重处理后的函数进行统计,得到被调用函数对应的数量。
[0098]
本实施例可将被调用函数的数量存储到数据库中,以进行持久化处理。
[0099]
获取模块105,用于获取所述类文件中的调用关系,基于所述调用关系获取所述应用程序函数的总数;
[0100]
其中,应用程序部署在预定的目录中,例如java应用程序部署在中间件容器中,会在应用服务的特定目录下存在部署项目的classes类文件或jar包,在应用程序运行结束时,会将该项目下的classes类文件或jar包打包成zip文件并上报。由此,本实施例不需要获取应用程序的源码,而是可以直接获取到上报的zip文件,由此,不需要获取仓库权限,也不需要获取应用程序对应的源码,提高处理效率。当接收到zip文件时,解压zip文件,得到一个或多个类文件。获取类文件中的调用链路,分析class类文件中的调用链路。
[0101]
进一步地,获取模块105具体用于,接收上报的所述应用程序的类文件,以访问者模式遍历所述类文件,得到所述类文件中的调用关系;分析所述调用关系得到所述调用链路,基于所述调用链路获取所述应用程序函数的总数。
[0102]
在应用程序运行结束时,接收上报的zip文件,获取zip文件中的类文件,以访问者visitor模式遍历类文件,得到类文件中的调用关系,该访问者visitor模式的事件驱动的处理方式使得只需要关注对于结果有意义的部分,而不必关注类文件的细节部分,例如格式等。该调用关系以图形描述时,例如为一棵树的形式。
[0103]
如图4所示,分析上述的调用关系,得到调用链路,如图所示的调用链路包括4条:函数abd的链路一、函数abe的链路二、函数ace的链路三、函数acf的链路四。通过调用链路统计应用程序的所有函数的数量,此外,对统计的函数进行去重处理,即将函数名称相同、且参数个数相同的函数为重复的函数,进行去重处理;函数名称相同但参数个数不相同的函数为不同的函数,不进行去重处理。去重处理后得到应用程序的函数的总数。
[0104]
本实施例可将应用程序的函数的总数存储到数据库中,以进行持久化处理。通过将被调用函数的数量及应用程序的函数的总数进行持久化处理,即使遇到重启的情况也不会丢失覆盖率数据。
[0105]
处理模块106,用于基于被调用函数的数量及所述总数计算覆盖率。
[0106]
其中,基于被调用函数的数量及所述总数计算覆盖率r=(被调用函数的数量/总数)*100%。
[0107]
在一个实施例中,提供了一种计算机设备,该计算机设备是一种能够按照事先设定或者存储的指令,自动进行数值计算和/或信息处理的设备。所述计算机设备可以是pc(personal computer,个人电脑),或者是智能手机、平板电脑、计算机、也可以是单个网络服务器、多个网络服务器组成的服务器组或者基于云计算的由大量主机或者网络服务器构成的云,其中云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。
[0108]
如图6所示,所述计算机设备可包括,但不仅限于,可通过系统总线相互通信连接
的存储器11、处理器12、网络接口13,存储器11存储有可在处理器12上运行的计算机程序。需要指出的是,图6仅示出了具有组件11-13的计算机设备,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。
[0109]
其中,存储器11可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。本实施例中,存储器11的可读存储介质通常用于存储安装于计算机设备的操作系统和各类应用软件,例如存储本发明一实施例中的计算机程序的程序代码等。此外,存储器11还可以用于暂时地存储已经输出或者将要输出的各类数据。
[0110]
所述处理器12在一些实施例中可以是中央处理器(central processing unit,cpu)、控制器、微控制器、微处理器、或其他数据处理芯片,用于运行所述存储器11中存储的程序代码或者处理数据,例如运行计算机程序等。
[0111]
所述网络接口13可包括标准的无线网络接口、有线网络接口,该网络接口13通常用于在所述计算机设备与其他电子设备之间建立通信连接。
[0112]
所述计算机程序存储在存储器11中,包括至少一个存储在存储器11中的计算机可读指令,该至少一个计算机可读指令可被处理器12执行,以实现本申请各实施例的方法,包括:
[0113]
开启javaagent代理程序,当接收网络请求时,基于所述javaagent代理程序为所述网络请求开启对应的处理线程,在所述处理线程内设置一变量,所述变量的属性为时间;
[0114]
在运行所述网络请求对应的应用程序时,获取预定目录下所述应用程序的类文件,基于所述javaagent代理程序对所述类文件中的各个函数进行插桩;
[0115]
当所述应用程序在运行过程中调用到已插桩的函数时,基于所述javaagent代理程序录制所述已插桩的函数,并获取所述变量所记录的时间;
[0116]
在所述应用程序运行结束时,基于所记录的时间获取所录制的函数,对所录制的函数进行去重处理,得到被调用函数的数量;
[0117]
获取所述类文件中的调用关系,基于所述调用关系获取所述应用程序函数的总数;
[0118]
基于被调用函数的数量及所述总数计算覆盖率。
[0119]
在一个实施例中,本发明提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述实施例中代码覆盖率的处理方法的步骤,例如图2所示的步骤s1至步骤s6。或者,计算机程序被处理器执行时实现上述实施例中代码覆盖率的处理装置的各模块/单元的功能,例如图5所示模块101至模块106的功能。为避免重复,这里不再赘述。
[0120]
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,
本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。
[0121]
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0122]
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、装置、物品或者方法不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、装置、物品或者方法所固有的要素。
[0123]
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1