CN106874187B - 代码覆盖率收集方法和装置 - Google Patents
代码覆盖率收集方法和装置 Download PDFInfo
- Publication number
- CN106874187B CN106874187B CN201611248183.4A CN201611248183A CN106874187B CN 106874187 B CN106874187 B CN 106874187B CN 201611248183 A CN201611248183 A CN 201611248183A CN 106874187 B CN106874187 B CN 106874187B
- Authority
- CN
- China
- Prior art keywords
- coverage
- code
- coverage rate
- source file
- source
- 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.)
- Active
Links
Images
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/3676—Test management for coverage analysis
-
- 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/3692—Test management for test results analysis
Abstract
一种代码覆盖率收集方法及装置,一个实施例的方法包括:接收终端发送的业务请求,业务请求包括应用标识;根据业务请求获取与应用标识对应的源文件、源文件标识以及源文件的语法树信息;将源文件的源代码加载到内存;执行加载到内存的源代码,并在源代码的执行过程中,基于语法树信息记录执行源代码的代码行的覆盖率数据;向覆盖率收集中心服务器发送覆盖率上报信息,覆盖率上报信息包括所述源文件标识、所述覆盖率数据,由覆盖率收集中心服务器根据各覆盖率收集终端服务器上传的覆盖率上报信息确定所述源文件的代码覆盖率。本实施例的方案不仅实现了对服务器的代码覆盖率的收集,而且无需对源代码进行修改,不影响开发人员对源代码的再次编辑。
Description
技术领域
本发明涉及测试技术领域,特别是涉及一种代码覆盖率收集方法以及一种代码覆盖率收集装置。
背景技术
代码覆盖率(code coverage)是软件测试中的一种重要的度量参数,用以描述描述程序中源代码被测试的比例和程度。而随着JavaScript等解释性语言的逐渐普及,基于JavaScript等解释性语言实现的平台的应用的日益广泛,对基于就采用JavaScript等解释性语言实现的平台的相关应用的代码覆盖率进行测试也成为测试领域中的一项重要内容。
以JavaScript平台为例,目前对于浏览器端运行的JavaScript应用,已经有jscoverage等工具来实现浏览器端的代码覆盖率的收集。然而,类似于jscoverage这样的工具,主要应用场景为浏览器端运行。其对Javascript代码进行适合浏览器端运行的代码插桩,插桩后的代码,其代码覆盖率收集过程是基于浏览器的代码执行,无法直接应用于服务器端执行的平台的应用。
发明内容
基于此,本发明实施例的目的在于提供一种代码覆盖率收集方法以及一种代码覆盖率收集装置。
为达到上述目的,本发明实施例采用以下技术方案:
一种代码覆盖率收集方法,应用在覆盖率收集终端服务器,包括步骤:
接收终端发送的业务请求,所述业务请求包括应用标识;
根据所述业务请求获取与所述应用标识对应的源文件、源文件标识以及所述源文件的语法树信息;
将所述源文件的源代码加载到内存;
执行加载到内存的所述源代码,并在所述源代码的执行过程中,基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据;
向覆盖率收集中心服务器发送覆盖率上报信息,所述覆盖率上报信息包括所述源文件标识、所述覆盖率数据,由所述覆盖率收集中心服务器根据各覆盖率收集终端服务器上传的覆盖率上报信息确定所述源文件的代码覆盖率。
一种代码覆盖率收集方法,应用在覆盖率收集中心服务器,包括步骤:
接收各覆盖率收集终端服务器发送的覆盖率上报信息,所述覆盖率上报信息包括源文件标识以及对应的覆盖率数据,所述覆盖率数据为所述覆盖率收集终端服务器在接收到终端发送的包含应用标识的业务请求时,获取与所述应用标识对应的源文件、源文件标识以及所述源文件的语法树信息,并将所述源文件的源代码加载到内存后,在加载到内存的所述源代码的执行过程中基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据;
根据各覆盖率收集终端服务器发送的所述覆盖率上报信息,确定所述源文件标识对应的源文件的代码覆盖率。
一种代码覆盖率收集装置,设置在覆盖率收集终端服务器,包括:
请求接收模块,用于接收终端发送的业务请求,所述业务请求包括应用标识;
文件及信息获取模块,用于根据所述业务请求获取与所述应用标识对应的源文件、源文件标识以及所述源文件的语法树信息;
代码加载模块,用于将所述源文件的源代码加载到内存;
数据记录模块,用于在加载到内存的所述源代码的执行过程中,基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据;
信息上报模块,用于向覆盖率收集中心服务器发送覆盖率上报信息,所述覆盖率上报信息包括所述源文件标识、所述覆盖率数据,由所述覆盖率收集中心服务器根据各覆盖率收集终端服务器上传的覆盖率上报信息确定所述源文件的代码覆盖率。
一种代码覆盖率收集装置,设置在覆盖率收集中心服务器,包括:
上报信息接收模块,用于接收各覆盖率收集终端服务器发送的覆盖率上报信息,所述覆盖率上报信息包括源文件标识以及对应的覆盖率数据,所述覆盖率数据为所述覆盖率收集终端服务器在接收到终端发送的包含应用标识的业务请求时,获取与所述应用标识对应的源文件、源文件标识以及所述源文件的语法树信息,并将所述源文件的源代码加载到内存后,在加载到内存的所述源代码的执行过程中基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据,
代码覆盖率确定模块,用于根据各覆盖率收集终端服务器发送的所述覆盖率上报信息,确定所述源文件标识对应的源文件的代码覆盖率。
基于如上所述的实施例中的方案,覆盖率收集终端服务器在接收到终端的业务请求后,无需将源代码发送给终端进行执行,而是将获取的对应的源文件的源代码加载到内存来执行,并基于该源文件的语法树信息记录执行内存中的源代码的覆盖率数据,并将该覆盖率数据汇总到覆盖率收集收集中心服务器后,由覆盖率收集中心服务器基于各覆盖率收集终端服务器上传的覆盖率数据确定出该源文件的代码覆盖率,其不仅实现了对服务器的代码覆盖率的收集,而且在代码覆盖率的收集过程中,是记录执行内存中的源代码的覆盖率数据,因而无需对源代码进行修改,不仅可以无感知的进行代码覆盖率的收集,不影响开发人员对源代码的再次编辑。
附图说明
图1是一个实施例的应用环境的示意图;
图2是一个实施例中的服务器的组成结构示意图;
图3是一个实施例的代码覆盖率收集方法的流程示意图;
图4是另一个实施例的代码覆盖率收集方法的流程示意图;
图5是一个具体示例中的收集代码覆盖率的流程示意图;
图6是一个具体示例中得到的代码覆盖率的示意图;
图7是一个实施例的代码覆盖率收集装置的结构示意图;
图8是另一个实施例的代码覆盖率收集装置的结构示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步的详细说明。应当理解,此处所描述的具体实施方式仅仅用以解释本发明,并不限定本发明的保护范围。
图1示出了本发明一个实施例中的工作环境示意图,如图1所示,其工作环境涉及覆盖率收集中心服务器100以及覆盖率收集终端服务器101、102,由图1可见,覆盖率收集终端服务器101、102可以包括有多个,覆盖率收集中心服务器100与覆盖率收集终端服务器101、102可以通过网络1进行通信,覆盖率收集中心服务器100与各覆盖率收集终端服务器101、102共同构成服务器集群,以为用户终端提供业务服务。图1所示中,覆盖率收集中心服务器100、各覆盖率收集终端服务器101、102上运行业务平台,通常为用解释性语言(例如JavaScript等)实现的平台,以为用户使用的终端提供业务服务。如图1所示,覆盖率收集终端服务器102可以通过网络2为用户终端1021、1022、1023提供业务服务。可以理解的是,图1所示中的网络1、网络2仅仅是为了对覆盖率收集中心服务器100与各覆盖率收集终端服务器101、102共同构成的服务器集群和覆盖率收集终端服务器102为用户终端提供业务服务进行区分,并不用以限定网络1、网络2必须是不同的网络类型。在实际技术应用中,网络1、网络2可以是相同的网络(例如WEB网络),也可以是不同的网络,例如专用网络。
覆盖率收集终端服务器102在为用户终端1021、1022、1023提供业务服务的过程中,对提供业务服务过程中执行的源文件的源代码进行覆盖率数据的收集,并将收集的覆盖率数据上报给覆盖率收集中心服务器100,由覆盖率收集中心服务器100基于各覆盖率收集终端服务器101、102上报的覆盖率数据,确定出对应源文件的代码覆盖率。其中,覆盖率收集中心服务器100可以是仅对各覆盖率收集终端服务器101、102上报的覆盖率数据、并据此确定代码覆盖率的服务器,也可以是同时为用户终端提供业务服务的服务器。本实施例涉及的是覆盖率收集终端服务器101、102收集覆盖率数据和覆盖率收集中心服务器100确定代码覆盖率的方案。
覆盖率收集中心服务器100、覆盖率收集终端服务器101、102在一个实施例中的结构示意图如图2所示。其包括通过系统总线连接的处理器、供电模块、存储介质、内存和通信接口。其中,服务器的存储介质存储有操作系统、数据库和一种代码覆盖率收集装置,该装置用于实现一种代码覆盖率收集方法。服务器的通信接口用于进行网络连接和通信,以覆盖率收集终端服务器102为例,其通信接口可以与覆盖率收集中心服务器100和用户终端1021、1022、1023连接和通信。
本领域技术人员可以理解,图2中示出的结构,仅仅是与发明方案相关的部分结构的框图,并不构成对发明方案所应用于其上的服务器的限定,具体的服务器可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
图3示出了一个实施例中的代码覆盖率收集方法的流程示意图,该实施例中是以覆盖率收集终端服务器102的处理过程为例进行说明。
如图3所示,该实施例中的代码覆盖率收集方法包括:
步骤S301:接收终端发送的业务请求,所述业务请求包括应用标识;
步骤S302:根据所述业务请求获取与所述应用标识对应的源文件、源文件标识以及所述源文件的语法树信息;
步骤S303:将所述源文件的源代码加载到内存;
步骤S304:执行加载到内存的所述源代码,并在所述源代码的执行过程中,基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据;
步骤S305:向覆盖率收集中心服务器发送覆盖率上报信息,所述覆盖率上报信息包括所述源文件标识、所述覆盖率数据,由所述覆盖率收集中心服务器根据各覆盖率收集终端服务器上传的覆盖率上报信息确定所述源文件的代码覆盖率。
基于如上所述的实施例中的方案,覆盖率收集终端服务器在接收到终端的业务请求后,无需将源代码发送给终端进行执行,而是将获取的对应的源文件的源代码加载到内存来执行,并基于该源文件的语法树信息记录执行内存中的源代码的覆盖率数据,并将该覆盖率数据汇总到覆盖率收集收集中心服务器后,由覆盖率收集中心服务器基于各覆盖率收集终端服务器上传的覆盖率数据确定出该源文件的代码覆盖率,其不仅实现了对服务器的代码覆盖率的收集,而且在代码覆盖率的收集过程中,是记录执行内存中的源代码的覆盖率数据,因而无需对源代码进行修改,不仅可以无感知的进行代码覆盖率的收集,不影响开发人员对源代码的再次编辑。
在如上所述的实施例的方案中,是在将源文件的源代码加载到内存后,在执行加载到内存的源代码的执行过程中,基于语法树信息记录执行所述源代码的代码行的覆盖率数据。在一个具体示例中,还可以是在将所述源文件的源代码加载到内存时,基于所述语法树信息对加载到内存的源代码进行插桩。从而在执行加载到内存的源代码的执行过程中,也可以实现对执行所述源代码的代码行的覆盖率数据的记录,而且也无需对源代码进行修改。其中,记录的执行所述源代码的代码行的覆盖率数据,可以是代码行的执行次数。
上述语法树信息,可以基于源文件的源代码的结构进行确定,例如可以包括函数定义语句、分支语句以及除了函数定义语句和分支语句的代码行中的至少一种,此时,上述确定的代码覆盖率包括函数覆盖率、分支语句覆盖率以及代码行覆盖率中的至少一种。
图4中示出了另一个实施例中的代码覆盖率收集方法的流程示意图,该实施例中是以覆盖率收集中心服务器100的处理过程为例进行说明。
如图4所示,该实施例中的代码覆盖率收集方法包括:
步骤S401:接收各覆盖率收集终端服务器发送的覆盖率上报信息,所述覆盖率上报信息包括源文件标识以及对应的覆盖率数据,所述覆盖率数据为所述覆盖率收集终端服务器在接收到终端发送的包含应用标识的业务请求时,获取与所述应用标识对应的源文件、源文件标识以及所述源文件的语法树信息,并将所述源文件的源代码加载到内存后,在加载到内存的所述源代码的执行过程中基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据,
步骤S402:根据各覆盖率收集终端服务器发送的所述覆盖率上报信息,确定所述源文件标识对应的源文件的代码覆盖率。
基于如上所述的实施例中的方案,覆盖率收集终端服务器在接收到终端的业务请求后,无需将源代码发送给终端进行执行,而是将获取的对应的源文件的源代码加载到内存来执行,并基于该源文件的语法树信息记录执行内存中的源代码的覆盖率数据,并将该覆盖率数据汇总到覆盖率收集收集中心服务器后,由覆盖率收集中心服务器基于各覆盖率收集终端服务器上传的覆盖率数据确定出该源文件的代码覆盖率,其不仅实现了对服务器的代码覆盖率的收集,而且在代码覆盖率的收集过程中,是记录执行内存中的源代码的覆盖率数据,因而无需对源代码进行修改,不仅可以无感知的进行代码覆盖率的收集,不影响开发人员对源代码的再次编辑。
其中,上述步骤S402在确定代码覆盖率时,可以是通过将各所述覆盖率收集终端服务器上传的所述源文件标识对应的覆盖率数据与所述源文件标识对应的源代码进行比较,根据比较结果确定所述源文件标识对应的源文件的代码覆盖率。具体的比较确定方式,可以采用目前已有的任何可能的方式进行。
上述语法树信息,可以基于源文件的源代码的结构进行确定,例如可以包括函数定义语句、分支语句以及除了函数定义语句和分支语句的代码行中的至少一种,此时,上述确定的代码覆盖率包括函数覆盖率、分支语句覆盖率以及代码行覆盖率中的至少一种。
如图4所示,在该实施例中,本实施例中的方法还包括:
步骤S403:根据各所述覆盖率收集终端服务器发送的所述覆盖率上报信息,对所述源文件标识对应的源代码中、各所述覆盖率收集终端服务器均未执行的代码行进行标记;
步骤S404:根据标记的代码行、所述代码覆盖率生成可视化代码覆盖率报告。
从而可以使用户查看可视化的代码覆盖率,并可以据此对源文件的源代码进行更新和改进。
为便于理解,图5中示出了一个具体示例中的收集代码覆盖率的流程示意图;该具体示例中是结合覆盖率收集终端服务器与覆盖率收集中心服务器之间的交互过程为例进行说明。
在该具体示例的实现方案中,覆盖率收集中心服务器以及各覆盖率收集终端服务器运行用解释性语言实现的平台,以采用解释性语言JavaScript为例,覆盖率收集中心服务器以及各覆盖率收集终端服务器运行JavaScript运行平台。node.js作为一种JavaScript运行平台,使用事件驱动,非阻塞I/O模型而得以轻量和高效,通常用于搭建响应速度快、易于扩展的网络应用,例如在分布式设备上运行数据密集型的实时应用。在下述示例中,以覆盖率收集中心服务器以及各覆盖率收集终端服务器运行node.js平台为例进行说明,即node.js运行在覆盖率收集中心服务器以及各覆盖率收集终端服务器。
假设将被测试的javascript文件(源文件)记为A,为了收集源文件A的代码覆盖率,先对源文件A进行分析,形成源文件A的语法树,查找出有意义的实际代码,去除注释以及不需要统计覆盖率信息的公共函数等,得到源文件A的语法树信息。
可以理解,在确定源代码A的语法树时,可以结合代码的组成结构进行。例如,一个具体示例中,可以从中分析确定出源代码中的函数定义语句(例如function定义语句)、分支语句(例如if else、switch case语句)以及除了函数定义语句和分支语句的代码行,形成语法树信息。
本实施例方案在具体应用时,可以结合前端发布系统使用。前端发布系统主要用来将javascript文件从svn拉取并发布到测试环境,发布之后测试人员进行特性测试,本实施例的方案自动记录并收集代码覆盖率。
如图5所示,在该具体应用示例中,对于一个覆盖率收集终端服务器(如图5中所示的覆盖率收集终端服务器1、覆盖率收集终端服务器K)而言,在一个具体应用中,其接收终端发送的业务请求,该业务请求包括应用标识L,该应用标识L通常可以是具体的应用程序的产品标识,例如该应用程序的名称等,然后基于该应用标识L确定对应的源文件标识M,并基于该源文件标识M获取与源文件标识M对应的源文件以及源文件的语法树信息。
在一个具体示例中,以JavaScript运行平台node.js为例,基于node.js的运行机制,可以通过node.js的require和vm.createScript机制,基于hook机制获取对应的源文件并进行源文件的源代码的加载。
并且可以针对node.js的require和vm.createScript进行监测,在监测到node.js的require和vm.createScript时,获取与源文件标识M的源文件的语法树信息。
随后,将获得的源文件M的源代码加载到当前覆盖率收集终端服务器本地的内存进行执行。
在一个具体示例中,可以是将在将源文件M的源代码加载到内存时,基于源文件M的上述语法树信息对加载到内存的源代码进行插桩,具体的插桩方式可以采用目前已有的任何方式进行。从而当前覆盖率收集终端服务器本地的源文件的源代码无需改变,仅对内存中的源代码进行插桩,从而不仅可以无感知的进行代码覆盖率的收集,而且不影响开发人员对源代码的再次编辑。
插桩,是指在不破坏被测程序原有逻辑完整性的情况下,在被测程序的相应位置插入用于插桩的代码(也称之为探针),这些探针本质上是进行信息采集的代码段,通过探针的执行并输出程序的运行特征数据,从而基于这些特征数据的分析,揭示程序的内部行为和特性。在常规的测试方式中,在测试完毕后,需要将这些插入的探针去除,以保留被测程序的完整性。在本实施例方案中,是在将源文件M的源代码加载到内存时,基于源文件M的上述语法树信息对加载到内存的源代码进行插桩,从而当前覆盖率收集终端服务器本地的源文件的源代码无需改变,仅对内存中的源代码进行插桩,不需要进行移桩操作就可以保证源代码的完整性,不影响开发人员对源代码的再次编辑。
以上述语法树信息包括函数定义语句、分支语句以及代码行为例,在进行插桩时,可以采用以下方式进行插桩。
针对函数定义语句,例如“function test(req,res){”,可以在该语句后面加上“coverage.f['1']++”,从而当“function test(req,res){”被执行的时候,“coverage.f['1']++”也被执行,自动为该函数执行数加1。
针对分支语句,例如if else、switch case等,可以采用类似于函数定义语句的方式,在分支语句之后加上统计语句,针对各个分支,可以单独记录,例如针对if(2>1){}else{}语句,插桩后的结果是
if(2>1){
coverage.b['1'][0]++;}
else{coverage.b['1'][1]++;}
除了函数和分支语句之外的其他代码行,则可以只是简单的进行覆盖率信息的累加,例如“coverage.s['1']++”。
当然,可以理解的是,基于实际技术应用需要,也可以不对内存中的源代码进行插桩,直接在内存中的源代码的执行过程中,基于上述语法树信息对源代码的执行情况进行监测,进行覆盖率信息的收集。具体的收集覆盖率信息的方式,可以采用目前已有以及以后可能出现的任何方式进行,例如针对加载到内存中的源代码,利用一些测试框架和代码覆盖率信息收集工具实现代码覆盖率信息的收集。
结合上述示例,在内存中的源代码的执行过程中,覆盖率信息被存储于coverage数组,从而得到源文件M在当前覆盖率收集终端服务器的覆盖率数据。
随后,当前覆盖率收集终端服务器基于收集的覆盖率数据,向覆盖率收集中心服务器发送覆盖率上报信息,该覆盖率上报信息包括上述源文件标识L以及上述收集的覆盖率信息。
由于覆盖率收集终端服务器上可能有多个不同的源文件,因此,其实际上可能会收集多个不同的源文件的覆盖率信息,据此,覆盖率收集终端服务器在向覆盖率收集中心服务器发送覆盖率上报信息时,可以在任意一个源文件在内存中执行完毕时上报一次。另一方面,由于源文件的数目可能较多,而且源文件的执行时间可能较长,因此,覆盖率收集终端服务器也可以是每隔一个预定时间段(例如1分钟)向覆盖率收集中心服务器上报一次覆盖率上报信息。
覆盖率收集中心服务器在接收到各个覆盖率收集终端服务器上报的覆盖率上报信息后,根据各覆盖率收集终端服务器发送的覆盖率上报信息,确定源文件标识L对应的源文件的代码覆盖率,并基于确定的代码覆盖率生成覆盖率报告。
在一个具体示例中,覆盖率收集中心服务器在接收到各个覆盖率收集终端服务器上报的覆盖率上报信息后,可以将各覆盖率上报信息与上述源文件标识M对应的源代码进行比较,并根据比较结果计算出代码覆盖率,包括函数覆盖率、分支覆盖率、行覆盖率等,一个具体技术应用示例中得到的代码覆盖率的示意图如图6所示。具体的将各覆盖率上报信息与上述源文件标识M对应的源代码进行比较计算出代码覆盖率的方式,可以采用目前已有的任何可能的方式进行。
另一方面,在上述将各覆盖率上报信息与上述源文件标识M对应的源代码进行比较计算出代码覆盖率的过程中,还可以对源代码中、各覆盖率收集终端服务器均未执行的代码行进行标记,然后基于标记的代码行和上述代码覆盖率生成可视化代码覆盖率报告。从而可以使用户查看可视化的代码覆盖率,并可以据此对源文件的源代码进行更新和改进。
覆盖率收集中心服务器得到的可视化代码覆盖率报告可以返回给测试人员所在的终端,供测试人员查看。
基于如上所述的具体示例可见,本实施例可以弥补功能测试应用场景下的基于解释性语言的服务器端无法收集代码覆盖率的缺憾,可以帮助测试人员更好的进行覆盖率分析,而且可以与已有的发布平台高度整合,无感知的进行覆盖率的收集。而且,其在收集代码覆盖率的过程中,不会实际改变源文件的源代码,不会影响开发人员对源代码的再次编辑。
基于与上述方法相同的思想,本实施例还提供一种代码覆盖率收集装置。
图7示出了一个实施例中的代码覆盖率收集装置的结构示意图,该实施例中是以设置在覆盖率收集终端服务器101为例进行说明。
如图7所示,该实施例中代码覆盖率收集装置包括:
请求接收模块701,用于接收终端发送的业务请求,所述业务请求包括应用标识;
文件及信息获取模块702,用于根据所述业务请求获取与所述应用标识对应的源文件、所述源文件标识以及所述源文件的语法树信息;
代码加载模块703,用于将所述源文件的源代码加载到内存;
数据记录模块704,用于在加载到内存的所述源代码的执行过程中,基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据;
信息上报模块705,用于向覆盖率收集中心服务器发送覆盖率上报信息,所述覆盖率上报信息包括所述源文件标识、所述覆盖率数据,由所述覆盖率收集中心服务器根据各覆盖率收集终端服务器上传的覆盖率上报信息确定所述源文件的代码覆盖率。
如上所述的实施例中的方案,覆盖率收集终端服务器在接收到终端的业务请求后,无需将源代码发送给终端进行执行,而是将获取的对应的源文件的源代码加载到内存来执行,并基于该源文件的语法树信息记录执行内存中的源代码的覆盖率数据,并将该覆盖率数据汇总到覆盖率收集收集中心服务器后,由覆盖率收集中心服务器基于各覆盖率收集终端服务器上传的覆盖率数据确定出该源文件的代码覆盖率,其不仅实现了对服务器的代码覆盖率的收集,而且在代码覆盖率的收集过程中,是记录执行内存中的源代码的覆盖率数据,因而无需对源代码进行修改,不仅可以无感知的进行代码覆盖率的收集,不影响开发人员对源代码的再次编辑。
在如上所述的实施例的方案中,是在将源文件的源代码加载到内存后,在执行加载到内存的源代码的执行过程中,基于语法树信息记录执行所述源代码的代码行的覆盖率数据。
如图7所示,在一个具体示例中,本实施例的装置还可以包括:
插桩模块7034,用于在将所述源文件的源代码加载到内存时,基于所述语法树信息对加载到内存的源代码进行插桩。
从而在执行加载到内存的源代码的执行过程中,也可以实现对执行所述源代码的代码行的覆盖率数据的记录,而且也无需对源代码进行修改。其中,记录的执行所述源代码的代码行的覆盖率数据,可以是代码行的执行次数。
上述语法树信息,可以基于源文件的源代码的结构进行确定,例如可以包括函数定义语句、分支语句以及除了函数定义语句和分支语句的代码行中的至少一种,此时,上述确定的代码覆盖率包括函数覆盖率、分支语句覆盖率以及代码行覆盖率中的至少一种。
图8示出了另一个实施例中的代码覆盖率收集装置的结构示意图,该实施例是以设置在覆盖率收集中心服务器100为例进行说明。
如图8所示,该实施例中的代码覆盖率收集装置包括:
上报信息接收模块801,用于接收各覆盖率收集终端服务器发送的覆盖率上报信息,所述覆盖率上报信息包括源文件标识以及对应的覆盖率数据,所述覆盖率数据为所述覆盖率收集终端服务器在接收到终端发送的包含应用标识的业务请求时,获取与所述应用标识对应的源文件、所述源文件标识以及所述源文件的语法树信息,并将所述源文件的源代码加载到内存后,在加载到内存的所述源代码的执行过程中基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据;
代码覆盖率确定模块802,用于根据各覆盖率收集终端服务器发送的所述覆盖率上报信息,确定所述源文件标识对应的源文件的代码覆盖率。
如上所述的实施例中的方案,覆盖率收集终端服务器在接收到终端的业务请求后,无需将源代码发送给终端进行执行,而是将获取的对应的源文件的源代码加载到内存来执行,并基于该源文件的语法树信息记录执行内存中的源代码的覆盖率数据,并将该覆盖率数据汇总到覆盖率收集收集中心服务器后,由覆盖率收集中心服务器基于各覆盖率收集终端服务器上传的覆盖率数据确定出该源文件的代码覆盖率,其不仅实现了对服务器的代码覆盖率的收集,而且在代码覆盖率的收集过程中,是记录执行内存中的源代码的覆盖率数据,因而无需对源代码进行修改,不仅可以无感知的进行代码覆盖率的收集,不影响开发人员对源代码的再次编辑。
其中,上述代码覆盖率确定模块802,可以是通过将各所述覆盖率收集终端服务器上传的所述源文件标识对应的覆盖率数据与所述源文件标识对应的源代码进行比较,根据比较结果确定所述源文件标识对应的源文件的代码覆盖率。具体的比较确定方式,可以采用目前已有的任何可能的方式进行。
上述语法树信息,可以基于源文件的源代码的结构进行确定,例如可以包括函数定义语句、分支语句以及除了函数定义语句和分支语句的代码行中的至少一种,此时,上述确定的代码覆盖率包括函数覆盖率、分支语句覆盖率以及代码行覆盖率中的至少一种。
在一个具体示例中,如图8所示,本实施例的装置还可以包括:
标记模块803,用于根据各所述覆盖率收集终端服务器发送的所述覆盖率上报信息,对所述源文件标识对应的源代码中、各所述覆盖率收集终端服务器均未执行的代码行进行标记;
可视化报告生成模块804,用于根据所述标记模块标记的代码行、所述代码覆盖率生成可视化代码覆盖率报告。
从而可以使用户查看可视化的代码覆盖率,并可以据此对源文件的源代码进行更新和改进。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性的计算机可读取存储介质中,如本发明实施例中,该程序可存储于计算机系统的存储介质中,并被该计算机系统中的至少一个处理器执行,以实现包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
Claims (12)
1.一种代码覆盖率收集方法,应用在覆盖率收集终端服务器,其特征在于,所述覆盖率收集终端服务器上运行业务平台,为用户使用的终端提供业务服务,所述覆盖率收集终端服务器在为终端提供业务服务的过程中,对提供业务服务过程中执行的源文件的源代码进行覆盖率数据的收集,所述方法包括步骤:
接收终端发送的业务请求,所述业务请求包括应用标识;
根据所述业务请求获取与所述应用标识对应的源文件、源文件标识以及所述源文件的语法树信息;
将所述源文件的源代码加载到内存;
执行加载到内存的所述源代码,并在所述源代码的执行过程中,基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据;
向覆盖率收集中心服务器发送覆盖率上报信息,所述覆盖率上报信息包括所述源文件标识、所述覆盖率数据,由所述覆盖率收集中心服务器根据各覆盖率收集终端服务器上传的覆盖率上报信息确定所述源文件的代码覆盖率。
2.根据权利要求1所述的代码覆盖率收集方法,其特征在于,还包括步骤:
在将所述源文件的源代码加载到内存时,基于所述语法树信息对加载到内存的源代码进行插桩。
3.根据权利要求1或2所述的代码覆盖率收集方法,其特征在于,所述语法树信息包括函数定义语句、分支语句以及代码行中的至少一种,所述代码覆盖率包括函数覆盖率、分支语句覆盖率以及代码行覆盖率中的至少一种。
4.一种代码覆盖率收集方法,应用在覆盖率收集中心服务器,其特征在于,包括步骤:
接收各覆盖率收集终端服务器发送的覆盖率上报信息,所述覆盖率上报信息包括源文件标识以及对应的覆盖率数据,所述覆盖率数据为所述覆盖率收集终端服务器在接收到终端发送的包含应用标识的业务请求时,获取与所述应用标识对应的源文件、所述源文件标识以及所述源文件的语法树信息,并将所述源文件的源代码加载到内存后,在加载到内存的所述源代码的执行过程中基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据;所述覆盖率收集终端服务器上运行业务平台,为用户使用的终端提供业务服务,所述覆盖率收集终端服务器在为终端提供业务服务的过程中,对提供业务服务过程中执行的源文件的源代码进行覆盖率数据的收集;
根据各覆盖率收集终端服务器发送的所述覆盖率上报信息,确定所述源文件标识对应的源文件的代码覆盖率。
5.根据权利要求4所述的代码覆盖率收集方法,其特征在于,包括下述三项中的至少一项:
通过将各所述覆盖率收集终端服务器上传的所述源文件标识对应的覆盖率数据与所述源文件标识对应的源代码进行比较,根据比较结果确定所述源文件标识对应的源文件的代码覆盖率;
还包括步骤:根据各所述覆盖率收集终端服务器发送的所述覆盖率上报信息,对所述源文件标识对应的源代码中、各所述覆盖率收集终端服务器均未执行的代码行进行标记;根据标记的代码行、所述代码覆盖率生成可视化代码覆盖率报告;
所述语法树信息包括函数定义语句、分支语句以及代码行中的至少一种,所述代码覆盖率包括函数覆盖率、分支语句覆盖率以及代码行覆盖率中的至少一种。
6.一种代码覆盖率收集装置,设置在覆盖率收集终端服务器,其特征在于,所述覆盖率收集终端服务器上运行业务平台,为用户使用的终端提供业务服务,所述覆盖率收集终端服务器在为终端提供业务服务的过程中,对提供业务服务过程中执行的源文件的源代码进行覆盖率数据的收集,所述装置包括:
请求接收模块,用于接收终端发送的业务请求,所述业务请求包括应用标识;
文件及信息获取模块,用于根据所述业务请求获取与所述应用标识对应的源文件、源文件标识以及所述源文件的语法树信息;
代码加载模块,用于将所述源文件的源代码加载到内存;
数据记录模块,用于在加载到内存的所述源代码的执行过程中,基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据;
信息上报模块,用于向覆盖率收集中心服务器发送覆盖率上报信息,所述覆盖率上报信息包括所述源文件标识、所述覆盖率数据,由所述覆盖率收集中心服务器根据各覆盖率收集终端服务器上传的覆盖率上报信息确定所述源文件的代码覆盖率。
7.根据权利要求6所述的代码覆盖率收集装置,其特征在于,还包括:
插桩模块,用于在将所述源文件的源代码加载到内存时,基于所述语法树信息对加载到内存的源代码进行插桩。
8.根据权利要求6或7所述的代码覆盖率收集装置,其特征在于,所述语法树信息包括函数定义语句、分支语句以及代码行中的至少一种,所述代码覆盖率包括函数覆盖率、分支语句覆盖率以及代码行覆盖率中的至少一种。
9.一种代码覆盖率收集装置,设置在覆盖率收集中心服务器,其特征在于,包括:
上报信息接收模块,用于接收各覆盖率收集终端服务器发送的覆盖率上报信息,所述覆盖率上报信息包括源文件标识以及对应的覆盖率数据,所述覆盖率数据为所述覆盖率收集终端服务器在接收到终端发送的包含应用标识的业务请求时,获取与所述应用标识对应的源文件、源文件标识以及所述源文件的语法树信息,并将所述源文件的源代码加载到内存后,在加载到内存的所述源代码的执行过程中基于所述语法树信息记录执行所述源代码的代码行的覆盖率数据;所述覆盖率收集终端服务器上运行业务平台,为用户使用的终端提供业务服务,所述覆盖率收集终端服务器在为终端提供业务服务的过程中,对提供业务服务过程中执行的源文件的源代码进行覆盖率数据的收集;
代码覆盖率确定模块,用于根据各覆盖率收集终端服务器发送的所述覆盖率上报信息,确定所述源文件标识对应的源文件的代码覆盖率。
10.根据权利要求9所述的代码覆盖率收集装置,其特征在于,包括下述三项中的至少一项:
所述代码覆盖率确定模块通过将各所述覆盖率收集终端服务器上传的所述源文件标识对应的覆盖率数据与所述源文件标识对应的源代码进行比较,根据比较结果确定所述源文件标识对应的源文件的代码覆盖率;
还包括标记模块和可视化报告生成模块,所述标记模块用于根据各所述覆盖率收集终端服务器发送的所述覆盖率上报信息,对所述源文件标识对应的源代码中、各所述覆盖率收集终端服务器均未执行的代码行进行标记;所述可视化报告生成模块,用于根据所述标记模块标记的代码行、所述代码覆盖率生成可视化代码覆盖率报告;
所述语法树信息包括函数定义语句、分支语句以及代码行中的至少一种,所述代码覆盖率包括函数覆盖率、分支语句覆盖率以及代码行覆盖率中的至少一种。
11.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至5中任一项所述方法的步骤。
12.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至5中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611248183.4A CN106874187B (zh) | 2016-12-29 | 2016-12-29 | 代码覆盖率收集方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611248183.4A CN106874187B (zh) | 2016-12-29 | 2016-12-29 | 代码覆盖率收集方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106874187A CN106874187A (zh) | 2017-06-20 |
CN106874187B true CN106874187B (zh) | 2020-09-11 |
Family
ID=59164388
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611248183.4A Active CN106874187B (zh) | 2016-12-29 | 2016-12-29 | 代码覆盖率收集方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106874187B (zh) |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107797923B (zh) * | 2017-10-10 | 2019-04-26 | 平安科技(深圳)有限公司 | 代码覆盖率分析方法及应用服务器 |
CN109976995B (zh) * | 2017-12-28 | 2022-06-28 | 百度在线网络技术(北京)有限公司 | 用于测试的方法和装置 |
CN108197036B (zh) * | 2018-02-06 | 2021-05-25 | 百度在线网络技术(北京)有限公司 | 用于确定增量代码的覆盖率信息的方法和装置 |
CN109542789B (zh) * | 2018-11-26 | 2022-03-25 | 泰康保险集团股份有限公司 | 一种代码覆盖率统计方法及装置 |
CN110209582A (zh) * | 2019-05-31 | 2019-09-06 | 口碑(上海)信息技术有限公司 | 代码覆盖率的统计方法及装置、电子设备、存储介质 |
CN111090583B (zh) * | 2019-11-25 | 2023-04-07 | 广州品唯软件有限公司 | 代码覆盖率报告的生成方法、装置和计算机设备 |
CN110888817B (zh) * | 2019-12-18 | 2023-10-24 | 广州品唯软件有限公司 | 代码覆盖率报告的生成方法、装置和可读存储介质 |
CN111104332B (zh) * | 2019-12-20 | 2024-01-30 | 广州品唯软件有限公司 | 覆盖率测试方法,测试装置,服务设备及可读存储介质 |
CN111651346B (zh) * | 2020-04-27 | 2022-11-18 | 深圳平安医疗健康科技服务有限公司 | 前端组件的测试方法、装置、存储介质及计算机设备 |
CN111930619B (zh) * | 2020-08-06 | 2024-04-16 | 杭州有赞科技有限公司 | 一种实时覆盖率统计方法、计算机设备及可读存储介质 |
CN111930627B (zh) * | 2020-08-12 | 2023-09-26 | 中国工商银行股份有限公司 | Egl编程语言的代码覆盖率确定方法及装置 |
CN112202647B (zh) * | 2020-12-09 | 2021-03-16 | 腾讯科技(深圳)有限公司 | 区块链网络中的测试方法、装置及测试设备 |
CN113485908A (zh) * | 2021-05-25 | 2021-10-08 | 中国人民财产保险股份有限公司 | 一种覆盖率的获取方法、装置及电子设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101833500A (zh) * | 2010-04-07 | 2010-09-15 | 南京航空航天大学 | 一种基于Agent的嵌入式软件智能测试方法 |
CN101968766A (zh) * | 2010-10-21 | 2011-02-09 | 上海交通大学 | 计算机程序实际运行时触发软件漏洞的检测系统 |
CN102419728A (zh) * | 2011-11-01 | 2012-04-18 | 北京邮电大学 | 基于覆盖率量化指标确定软件测试过程充分性的方法 |
CN103095518A (zh) * | 2011-11-08 | 2013-05-08 | 阿里巴巴集团控股有限公司 | 覆盖率测试处理方法、装置、覆盖率测试服务器及系统 |
CN103838666A (zh) * | 2012-11-27 | 2014-06-04 | 百度在线网络技术(北京)有限公司 | 一种确定代码执行覆盖率的方法和装置 |
US9164878B2 (en) * | 2010-12-24 | 2015-10-20 | International Business Machines Corporation | Evaluating coverage of a software test |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102222041A (zh) * | 2011-06-15 | 2011-10-19 | 深圳市运通信息技术有限公司 | 一种基于嵌入式软件的测试分析系统及方法 |
CN103645986B (zh) * | 2013-11-29 | 2016-08-17 | 北京广利核系统工程有限公司 | 一种编译器的可视化语法树的生成方法和重构方法 |
CN104834595B (zh) * | 2015-02-15 | 2017-09-12 | 网易(杭州)网络有限公司 | 一种可视化自动测试方法及系统 |
CN105701016B (zh) * | 2016-03-03 | 2018-06-29 | 南京大学 | 一种针对异常处理代码的测试方法 |
-
2016
- 2016-12-29 CN CN201611248183.4A patent/CN106874187B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101833500A (zh) * | 2010-04-07 | 2010-09-15 | 南京航空航天大学 | 一种基于Agent的嵌入式软件智能测试方法 |
CN101968766A (zh) * | 2010-10-21 | 2011-02-09 | 上海交通大学 | 计算机程序实际运行时触发软件漏洞的检测系统 |
US9164878B2 (en) * | 2010-12-24 | 2015-10-20 | International Business Machines Corporation | Evaluating coverage of a software test |
CN102419728A (zh) * | 2011-11-01 | 2012-04-18 | 北京邮电大学 | 基于覆盖率量化指标确定软件测试过程充分性的方法 |
CN103095518A (zh) * | 2011-11-08 | 2013-05-08 | 阿里巴巴集团控股有限公司 | 覆盖率测试处理方法、装置、覆盖率测试服务器及系统 |
CN103838666A (zh) * | 2012-11-27 | 2014-06-04 | 百度在线网络技术(北京)有限公司 | 一种确定代码执行覆盖率的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN106874187A (zh) | 2017-06-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106874187B (zh) | 代码覆盖率收集方法和装置 | |
CN107562620B (zh) | 一种埋点自动设置方法和装置 | |
US9251046B2 (en) | Method and system for generating and processing black box test cases | |
JP5978401B2 (ja) | 分散システムにおいてユーザリクエストの実行を監視するための方法及びシステム | |
CN108959059B (zh) | 一种测试方法以及测试平台 | |
CN102143008A (zh) | 用于数据中心的诊断故障事件的方法及装置 | |
JPH10510385A (ja) | ソフトウエア品質のアーキテクチャに基づく分析のための方法およびシステム | |
CN109522228B (zh) | 接口自动化测试数据构造方法、装置、平台及存储介质 | |
KR20070080313A (ko) | 클라이언트 단말로 제공되는 서비스 성능 분석 방법 및시스템 | |
CN111124789B (zh) | 一种芯片仿真调试系统及调试方法 | |
CN108319550A (zh) | 一种测试系统及测试方法 | |
CN113448854A (zh) | 一种回归测试方法和装置 | |
CN105637488A (zh) | 追踪源代码用于末端用户监控 | |
CN112597018A (zh) | 接口测试用例生成方法、装置、设备及存储介质 | |
CN112241360A (zh) | 一种测试用例生成方法、装置、设备及存储介质 | |
CN110196801B (zh) | 一种基于代码覆盖率的测试方法及装置 | |
CN105677569B (zh) | 基于事件处理器的Android自动化测试工具及测试方法 | |
CN111124894B (zh) | 代码覆盖率的处理方法、装置和计算机设备 | |
CN110490132B (zh) | 数据处理方法和装置 | |
CN106557419B (zh) | 程序的测试方法及装置 | |
CN116405412A (zh) | 服务端集群的有效性验证方法和系统 | |
CN107342917B (zh) | 用于检测网络设备性能的方法和装置 | |
CN115576831A (zh) | 一种测试案例推荐方法、装置、设备及存储介质 | |
CN113282496B (zh) | 接口自动测试方法、装置、设备及存储介质 | |
CN109592525A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |