CN114416546A - 一种代码覆盖率确定方法及装置 - Google Patents
一种代码覆盖率确定方法及装置 Download PDFInfo
- Publication number
- CN114416546A CN114416546A CN202210014181.8A CN202210014181A CN114416546A CN 114416546 A CN114416546 A CN 114416546A CN 202210014181 A CN202210014181 A CN 202210014181A CN 114416546 A CN114416546 A CN 114416546A
- Authority
- CN
- China
- Prior art keywords
- code
- coverage
- coverage rate
- file
- function
- 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
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/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/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供了一种代码覆盖率确定方法及装置,其中,该方法包括:根据被测软件的需求查询关联的多个代码版本;确定该需求涉及代码的代码影响范围;对该多个代码版本的覆盖率进行累加,得到该需求的累计覆盖率;根据该代码影响范围与该累计覆盖率确定该被测代码的覆盖率,可以解决相关技术中在软件测试领域中,现有的覆盖率计算存在局限性且测试价值低的问题,支持需要进行多轮、中途更换版本的测试场景,且提高了代码覆盖率的测试价值。
Description
技术领域
本发明涉及数据处理领域,具体而言,涉及一种代码覆盖率确定方法及装置。
背景技术
随着软件技术的快速发展,软件测试工作也在不断自我进化,行业测试标准逐步形成,新的测试工具手段纷纷落地,测试作为软件提质增效和防控风险的基础保障作用日益显现。面对国家信创战略的新要求以及开放银行等新型商业模式的新需求,银行软件测试工作要把握趋势,加强能力建设,不断延伸领域、创新方法、形成标准,成为金融科技创新的支持者、守护者和引领者,在银行数字化转型过程中体现出更大的自身价值。
软件测试的代码覆盖率,指的是测试时,代码被执行到的比例或程度,通过代码覆盖率,可以一定程度上度量代码的质量。
现有技术方案或开源方案,对于测试覆盖率的支持,仅止于全量代码的覆盖率或增量覆盖率,应用场景较为简单。
在软件测试领域中,现有的覆盖率计算技术存在以下缺点:
测试局限性,现有的覆盖率技术仅支持对同一个版本的软件覆盖率指标进行度量。而无法支持需要进行多轮、中途更换版本的测试场景,如***测试。
测试低价值,现有覆盖率技术的度量结果,与软件的功能、需求无关,只是简单、无差别的对所有代码进行覆盖率计算,测试人员无从知晓目标功能的真实覆盖情况。
针对相关技术中在软件测试领域中,现有的覆盖率计算存在局限性且测试价值低的问题,尚未提出解决方案。
发明内容
本发明实施例提供了一种代码覆盖率确定方法及装置,以至少解决相关技术中在软件测试领域中,现有的覆盖率计算存在局限性且测试价值低的问题。
根据本发明的一个实施例,提供了一种代码覆盖率确定方法,包括:
根据被测软件的需求查询关联的多个代码版本;
确定所述需求涉及代码的代码影响范围;
对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率;
根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率。
可选地,在根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率之后,所述方法还包括:
根据所述需求的代码影响范围,对所述被测软件覆盖到的代码进行染色。
可选地,确定所述需求涉及代码的代码影响范围包括:
利用版本比对工具对需求关联的所述多个代码版本中的起始版本、当前版本的java代码进行对比,得到代码的变更行号集合DL[line],将之保存到存储介质中;
利用抽象语法树AST对所述当前版本的java代码进行解析,识别出函数集合F[function];
根据所述变更行号集合DL[line],对所述函数集合F[function]进行筛选,得到所述需求的变更函数集合DF[function],其中,所述代码影响范围为所述变更函数集合DF[function]。
可选地,根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率包括:
利用所变更函数集合DF[function]对所述累计覆盖率进行筛选,得到所述需求覆盖率。
可选地,对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率包括:
利用代码覆盖率工具jacoco,对所述被测软件的单个应用程序进行插桩,定频采集所述多个代码版本的覆盖率信息,以xml文件格式保存于存储介质中;
从存储介质中获取多个XML文件;
按照时间先后顺序对所述多个XML文件进行排序,得到File 1、File 2、File3、...、File n;
将最新的所述Filen作为基准,依次将File 1、File 2、File 3、...、File n-1合并到所述File n中,得到合并结果;
根据所述合并结果确定所述累计覆盖率。
可选地,将最新的所述File n作为基准,依次将File 1、File 2、File 3、...、Filen-1合并到所述File n中,得到合并结果包括:
对所述File 1、File 2、File 3、...、File n-1中的每一个执行以下步骤,直到完成将File 1、File 2、File 3、...、File n-1合并到所述File n中,得到所述合并结果,其中,正在执行的称为当前File:
将所述当前File,得到函数的唯一性签名KEYa的覆盖明细COVa;
解析所述Filen中,得到函数的唯一性签名KEYan的覆盖明细COVan;
如果所述当前File对应的KEYa等于所述KEYan,将所述当前File对应的覆盖明细COVa和所述Filen对应的覆盖明细COVan进行合并;
如果所述当前File对应的KEYa不等于所述KEYan,舍弃所述当前File对应的覆盖明细COVa,只保留所述Filen对应的覆盖明细COVan。
根据本发明的另一个实施例,还提供了一种代码覆盖率确定装置,包括:
查询模块,用于根据被测软件的需求查询关联的多个代码版本;
第一确定模块,用于确定所述需求涉及代码的代码影响范围;
累加模块,用于对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率;
第二确定模块,用于根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率。
可选地,所述装置还包括:
染色模块,用于根据所述需求的代码影响范围,对所述被测软件覆盖到的代码进行染色。
可选地,所述第一确定模块包括:
对比子模块,用于利用版本比对工具对需求关联的所述多个代码版本中的起始版本、当前版本的java代码进行对比,得到代码的变更行号集合DL[line],将之保存到存储介质中;
解析子模块,用于利用抽象语法树AST对所述当前版本的java代码进行解析,识别出函数集合F[function];
筛选子模块,用于根据所述变更行号集合DL[line],对所述函数集合F[function]进行筛选,得到所述需求的变更函数集合DF[function],其中,所述代码影响范围为所述变更函数集合DF[function]。
可选地,所述第二确定模块,还用于:
利用所变更函数集合DF[function]对所述累计覆盖率进行筛选,得到所述需求覆盖率。
可选地,所述累加模块包括:
插桩子模块,用于利用代码覆盖率工具jacoco,对所述被测软件的单个应用程序进行插桩,定频采集所述多个代码版本的覆盖率信息,以xml文件格式保存于存储介质中;
获取子模块,用于从存储介质中获取多个XML文件;
排序子模块,用于按照时间先后顺序对所述多个XML文件进行排序,得到File 1、File 2、File 3、...、File n;
合并子模块,用于将最新的所述File n作为基准,依次将File 1、File 2、File3、...、File n-1合并到所述File n中,得到合并结果;
根据所述合并结果确定所述累计覆盖率。
可选地,所述合并子模块,还用于:
对所述File 1、File 2、File 3、...、File n-1中的每一个执行以下步骤,直到完成将File 1、File 2、File 3、...、File n-1合并到所述File n中,得到所述合并结果,其中,正在执行的称为当前File:
将所述当前File,得到函数的唯一性签名KEYa的覆盖明细COVa;
解析所述File n中,得到函数的唯一性签名KEYan的覆盖明细COVan;
如果所述当前File对应的KEYa等于所述KEYan,将所述当前File对应的覆盖明细COVa和所述File n对应的覆盖明细COVa n进行合并;
如果所述当前File对应的KEYa不等于所述KEYan,舍弃所述当前File对应的覆盖明细COVa,只保留所述File n对应的覆盖明细COVan。
根据本发明的又一个实施例,还提供了一种计算机可读的存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
根据本发明的又一个实施例,还提供了一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上述任一项方法实施例中的步骤。
通过本发明,根据被测软件的需求查询关联的多个代码版本;确定所述需求涉及代码的代码影响范围;对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率;根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率,可以解决相关技术中在软件测试领域中,现有的覆盖率计算存在局限性且测试价值低的问题,支持需要进行多轮、中途更换版本的测试场景,且提高了代码覆盖率的测试价值。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是本发明实施例的代码覆盖率确定方法的移动终端的硬件结构框图;
图2是根据本发明实施例的代码覆盖率确定方法的流程图;
图3是根据本发明实施例的提测代码分析的流程图;
图4是根据本发明实施例的覆盖率采集与合并的流程图;
图5是根据本发明实施例的覆盖明细COVa1和COVan的合并过程的示意图;
图6是根据本发明实施例的需求覆盖率查询的流程图;
图7是根据本发明实施例的代码覆盖率确定装置的框图。
具体实施方式
下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
本申请实施例一所提供的方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。以运行在移动终端上为例,图1是本发明实施例的代码覆盖率确定方法的移动终端的硬件结构框图,如图1所示,移动终端可以包括一个或多个(图1中仅示出一个)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)和用于存储数据的存储器104,可选地,上述移动终端还可以包括用于通信功能的传输设备106以及输入输出设备108。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述移动终端的结构造成限定。例如,移动终端还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本发明实施例中的代码覆盖率确定方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至移动终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括移动终端的通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络适配器(Network Interface Controller,简称为NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(Radio Frequency,简称为RF)模块,其用于通过无线方式与互联网进行通讯。
在本实施例中提供了一种运行于上述移动终端或网络架构的代码覆盖率确定方法,图2是根据本发明实施例的代码覆盖率确定方法的流程图,如图2所示,该流程包括如下步骤:
步骤S202,根据被测软件的需求查询关联的多个代码版本;
步骤S204,确定所述需求涉及代码的代码影响范围;
步骤S206,对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率;
步骤S208,根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率。
通过上述步骤S202至S208,根据被测软件的需求查询关联的多个代码版本;确定所述需求涉及代码的代码影响范围;对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率;根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率,可以解决相关技术中在软件测试领域中,现有的覆盖率计算存在局限性且测试价值低的问题,支持需要进行多轮、中途更换版本的测试场景,且提高了代码覆盖率的测试价值。
在一可选的实施例中,在上述步骤S208之后,根据所述需求的代码影响范围,对所述被测软件覆盖到的代码进行染色,便于用户清晰的看到被测软件覆盖到的代码,提高了用户体验。
本发明实施例中,上述步骤S204具体可以包括:利用版本比对工具对需求关联的所述多个代码版本中的起始版本、当前版本的java代码进行对比,得到代码的变更行号集合DL[line],将之保存到存储介质中;利用抽象语法树AST对所述当前版本的java代码进行解析,识别出函数集合F[function];根据所述变更行号集合DL[line],对所述函数集合F[function]进行筛选,得到所述需求的变更函数集合DF[function],其中,所述代码影响范围为所述变更函数集合DF[function]。
对应的,上述步骤S206具体可以包括:利用所变更函数集合DF[function]对所述累计覆盖率进行筛选,得到所述需求覆盖率。
本发明实施例中,上述步骤S206具体可以包括:利用代码覆盖率工具jacoco,对所述被测软件的单个应用程序进行插桩,定频采集所述多个代码版本的覆盖率信息,以xml文件格式保存于存储介质中;从存储介质中获取多个XML文件;按照时间先后顺序对所述多个XML文件进行排序,得到File 1、File 2、File 3、...、File n;将最新的所述File n作为基准,依次将File 1、File 2、File 3、...、File n-1合并到所述File n中,得到合并结果;根据所述合并结果确定所述累计覆盖率。
进一步地,将最新的所述File n作为基准,依次将File 1、File 2、File 3、...、File n-1合并到所述File n中,得到合并结果具体可以包括:对所述File 1、File 2、File3、...、File n-1中的每一个执行以下步骤,直到完成将File 1、File 2、File 3、...、Filen-1合并到所述Filen中,得到所述合并结果,其中,正在执行的称为当前File:将所述当前File,得到函数的唯一性签名KEYa的覆盖明细COVa;解析所述File n中,得到函数的唯一性签名KEYan的覆盖明细COVan;如果所述当前File对应的KEYa等于所述KEYan,将所述当前File对应的覆盖明细COVa和所述Filen对应的覆盖明细COVan进行合并;如果所述当前File对应的KEYa不等于所述KEYan,舍弃所述当前File对应的覆盖明细COVa,只保留所述Filen对应的覆盖明细COVa n。
本发明实施例根据软件需求查询关联的代码版本,计算需求涉及的代码具体影响范围(函数、行号);在被测软件多次发版、提测的情况下,实现不同版本间的覆盖率累加。根据需求的代码影响范围,计算需求覆盖率;根据需求的代码影响范围,对测试覆盖到的代码进行染色,。下面对各个步骤进行详细说明
1,根据软件需求查询关联的代码版本。
需求在代码开发、发版、测试的过程中,被描述为一项标识,即(EapsId)。
被测软件应用的开发人员,在开发过程中,会使用版本管理工具(如git)不断提交新代码,在每次提交代码时,需遵守强制规约,即关联指定的需求编号。这样,代码被推送送到远程仓库的开发分支(如develop分支)后,版本管理平台(如gitlab、gitee),可以通过需求编号,建立起提交(commit)与需求的映射关系。
当被测软件的运维人员在自动化流水线(CI/CD)上提测新版本时,可以指定一个或多个需求编号,自动化流水线会只从代码仓库的开发分支(如develop分支)上摘取(cherry-pick)与选中需求相关联的提交(commit),然后合并到测试分支(如baseline分支),继而生成新的版本编号。
随后,运维人员即可在自动化流水线(CI/CD)上发起该版本的部署,完成对被测软件的编译、打包、部署工作。
而本发明实例通过与自动化流水线(CI/CD)进行集成,每当被测软件的一个新的代码版本被提测/部署时,本发明实例会接收到相应的通知,并将被测软件的应用标识、需求编号、版本编号、提测时间、部署时间,记录到存储介质中,以建立需求与提测版本的映射关系。
2,计算需求涉及的代码具体影响范围(函数、行号)。
利用版本比对工具对需求的起始版本、当前版本的java代码进行对比,得到代码的变更行号集合DL[line],将之保存到存储介质中。
然后利用抽象语法树(AST)对当前版本的java代码进行解析,识别出函数集合F[function]。
再根据变更行号集合DL[line],对函数集合函数集合F[function]进行筛选,得到该需求的变更函数集合DF[function]。
3,在被测软件多次发版、提测的情况下,实现不同版本间的覆盖率累加。
利用代码覆盖率工具jacoco,对被测软件的单个应用程序进行插桩,定频采集目标应用的覆盖率信息,以xml文件格式,保存于存储介质中。
通过对jacoco进行改造,在覆盖率采集过程中,会对运行在java虚拟机中的每个函数进行唯一性签名,每个函数都会生成一个唯一性签名(function key),和一个覆盖率明细(function coverage),并体现在保存的xml文件中。
一般地,1个小时的覆盖率信息会被保存为一个单独的xml。如,9:00~10:00的覆盖率信息,被保存为cover_2021091409_1.xml。
特定地,当发生版本变更时,该小时内的xml会被拆分为多份进行保存。如,10:00~11:00的覆盖率信息,由于中途更换了1次版本(10:25分),将被分割为cover_2021091410_1.xml、cover_2021091410_2.xml。
然后,将多个xml文件,按时间从旧到新进行排序File1、File2、File3...Filen,以最新的xml文件Filen作为基准,依次将File1、File2、File3...Filen-1合并到Filen中。
现有函数a,以File1、Filen合并为例,两两合并的具体过程如下:
解析File1中,得到函数的唯一性签名KEYa1覆盖明细COVa1
解析Filen中,得到函数的唯一性签名KEYan覆盖明细COVan
如果KEYa1等于KEYan,则说明该方法未曾修改过代码,可以直接将覆盖明细COVa1和COVan进行合并;反之,则说明方法被修改过,需要舍弃掉COVa1,只需保留COVan的覆盖明细。
更进一步的,对于覆盖明细COVa1和COVan的详细合并过程,本质上是对两者覆盖到的代码行取并集。累加覆盖率是计算需求覆盖率过程中的中间产物。
4,根据需求的代码影响范围,计算需求覆盖率。
本发明实例会设置一个开关,当一个需求被首次部署后,会触发开关,对测试期间的覆盖率进行累积;当此需求的状态被上游***置为已投产状态,会关闭开关,停止累积。由此累积得到的覆盖率,作为该需求测试期间的累计覆盖率COV[accumulate]。
而需求覆盖率的计算过程,即是利用该需求对应变更函数集合DF[function]对累计覆盖率COV[accumulate]含函数进行筛选的过程。
由此可知,需求覆盖率会在两种情况下增减:
在此需求下,开发人员提交了新的代码,使得函数发生变动(新增或修改),导致该函数的覆盖率被清空,这种影响会使需求覆盖率降低。
有新的测试覆盖到了需求所涉及的变更函数代码,这种影响会使需求覆盖率提高。
图3是根据本发明实施例的提测代码分析的流程图,如图3所示,提测代码分析流程包括:
步骤S301,接收并处理自动化流水线(CI/CD平台)发来的提测通知。
当接口装置接收到自动化流水线(CI/CD平台)发来的代码版本提测通知后,会将代码版本的提测记录写入数据存储装置,包括被测软件应用标识、提测版本编号、提测需求编号、版本提测时间。
然后接口装置向代码分析装置发送版本更新指令,指令包括被测软件应用标识、提测版本编号、提测需求编号、测试分支、远程代码仓库地址。
步骤S302,更新本地代码仓库。
代码分析装置接收到版本更新指令后,代码更新模块会从远程代码仓库的测试分支上拉取最新代码,下载更新到本地代码仓库中。
更新完成后,代码更新模块会调用代码比对模块,参数包括被测软件应用标识、提测版本编号、提测需求编号、测试分支。
步骤S303,提测版本代码比对。
调用代码比对模块接收到调用请求后,执行后续处理,又分为两个子步骤。
其一,计算提测版本(Vn)与前一个版本(Vn-1)的差异。
首先,利用版本比对工具(如jgitdiff),对本地仓库的提测版本(Vn)与前一个版本(Vn-1)进行比对,求得差异的行号集合DL[line]。然后,利用抽象语法树(AST)对提测版本(Vn)的java代码进行解析,识别出函数集合F[function]。再根据变更行号集合DL[line],对函数集合函数集合F[function]进行筛选,求得变更函数集合DF[function]。
其二,将所得差异与需求代码变更表中的历史记录进行合并。
使用被测软件应用标识、需求编号作为条件,从需求代码变更表中,查询历史已***过的变更记录,得到该需求的历史变更行号集合HDL[line]和历史变更函数集合HDF[function],如果该需求是首次提测,则HDL[line]和HDF[function]皆为空集合。
逐一遍历DL[line]集合中的元素,如果元素在HDL[line]集合中已存在则不做处理,如果不存在,则将元素添加到HDL[line]集合中。
同理,逐一遍历DF[function]集合中的元素,如果元素在HDF[function]集合中已存在则不做处理,如果不存在,则将元素添加到HDF[function]集合中。
之后将历史变更行号集合HDL[line]和历史变更函数集合HDF[function]集合更新到需求代码变更表。
图4是根据本发明实施例的覆盖率采集与合并的流程图,如图4所示,覆盖率采集、合并流程包括:
步骤S401,接收并处理自动化流水线(CI/CD平台)发来的部署通知。
当接口装置接收到自动化流水线(CI/CD平台)发来的代码版本部署通知后,会将代码版本的部署记录写入数据存储装置,包括被测软件应用标识、提测版本编号、提测需求编号、被测应用ip、部署包路径、版本部署时间。
然后接口装置根据被测应用ip向代理装置发送部署包拉取指令,指令包括被测软件应用标识、部署版本编号、部署需求编号、测试分支、部署包路径。
步骤S402,拉取被测软件的最新部署包。
代理装置接收到部署包拉取指令后,由于代理装置与被测软件处于同一服务器,可以根据部署包路径找到被测软件的最新部署包(包含编译后的javaclass),然后将部署包上传至本发明实例的文件存储装置,上传所使用的通讯方式包括且不限于FTP、SFTP、SCP等形式。
当部署包拉取完成后,如果该需求是首次部署,会激活该需求的状态为生效,写入数据存储装置。
特别说明的是,该需求的代码投产时,需求管理方会将该需求的状态置为失效,意味着该需求的测试周期结束。
步骤S403,从被测软件上定频采集覆盖率信息。
定时任务装置会以一定的频率(如每小时1次),与从被测软件的插桩装置进行TCP通讯,拉取覆盖率信息(jacoco dump原生指令),生成exec文件。然后利用前一步骤得到的部署包文件(包含编译后的java class),对exec文件进行转换(jacoco report原生指令),转换后得到xml文件。文件保存形式例如:
/{被测软件应用标识}/coverage/cover-yyyymmddHH_{下标}.xml
一般地,1个小时的覆盖率信息会被保存为一个单独的xml。如,9:00~10:00的覆盖率信息,被保存为cover_2021091409_1.xml。
特定地,当发生版本变更时,该小时内的xml会被拆分为多份进行保存。如,10:00~11:00的覆盖率信息,由于中途更换了1次版本(10:25分),将被分割为cover_2021091410_1.xml、cover_2021091410_2.xml。
步骤S404,为每个需求统计累计覆盖率,生成xml。
由于每个需求测试周期的开始、结束时间不同,需要对每个需求的累积覆盖率进行单独累积。定时任务装置的合并模块对被测软件所有生效的需求,进行如下处理:
将此前采集模块每小时收集到的xml文件,每天按时间从旧到新进行排序File1、File2、File3...Filen,以最新的xml文件Filen作为基准,依次将File1、File2、File3...Filen-1合并到Filen中。
以函数a为例,File1、Filen的合并具体过程如下:
解析File1中,得到函数的唯一性签名KEYa1覆盖明细COVa1
解析Filen中,得到函数的唯一性签名KEYan覆盖明细COVan
如果KEYa1等于KEYan,则说明该方法未曾修改过代码,可以直接将覆盖明细COVa1和COVan进行合并;反之,则说明方法被修改过,需要舍弃掉COVa1,只需保留COVan的覆盖明细。
更进一步的,对于覆盖明细COVa1和COVan的详细合并过程,图5是根据本发明实施例的覆盖明细COVa1和COVan的合并过程的示意图,如图5所示,本质上是对两者覆盖到的代码行取并集。
最后,将累积合并的结果,写入需求对应的累积覆盖率文件中。
文件保存形式例如:
/{被测软件应用标识}/requiment/cov_{需求编号}.xml
图6是根据本发明实施例的需求覆盖率查询的流程图,如图6所示,需求覆盖率查询流程包括:
步骤S601,用户从前端页面发起需求覆盖率查询。
测试人员在页面上选择被测软件的需求编号进行查询。前端页面会向覆盖率装置发起查询请求,请求参数包括被测软件标识、需求编号。
步骤S602,后端计算需求覆盖率并返回结果。
覆盖率装置接收到查询请求后,读取需求对应的累积覆盖率文件,得到该需求的累积覆盖率明细COV[accumulate]。
然后从数据存储装置中,查询该需求对应的变更函数集合DF[function]。
原理中已经说明,需求覆盖率的计算过程,即利用该需求对应变更函数集合DF[function]对累计覆盖率COV[accumulate]含函数进行筛选的过程。如果函数存在于DF[function]中,则保留;反之则剔除该函数的覆盖率。
筛选完成后,将各个函数的覆盖信息按公式Σ(变更函数被测试覆盖到的行数)/Σ(变更函数总行数)汇总,求的需求覆盖率。
计算完成后,将需求覆盖率Cov(requiment)(包含每行详细覆盖信息和汇总值)转换为json返回给前端。
步骤S603,用户查看代码染色情况。
测试人员在页面上选择单个java源码文件进行查询。前端页面会向代码分析装置发起代码查看请求,请求参数包括需求编号、被测代码分支、代码版本、代码全路径。
步骤S604,后端下载指定代码。
代码分析装置接收到查询请求后,代码下载模块会根据被测代码分支、代码版本、代码全路径下载单个源码文件的代码,并将源码内容返回给前端页面。
步骤S605,前端页面对源代码进行染色。
前端页面接收到源码内容后,根据要染色的代码文件名,从需求覆盖率的json中找出对应的行覆盖信息,按照行号逐行对源码进行渲染,覆盖到的行可以被渲染为绿色,未覆盖的内容被渲染为红色,最后将染色后的源码内容展示到界面上(图中未示出)。
本发明实施例具备强大的覆盖率跨版本合并能力。使得测试人员每一轮测试的成果可以累积,而非直接清零。甚至结合该特性,当测试人员对软件完成多轮测试后,可以选定任意一个时段,查询该时段内多个版本的累计测试覆盖率之和。使得测试人员可以在有限的时间里,关注真正未测试到的代码,从而提高测试的整体效率。
本发明实施例还提供了需求覆盖率的查询功能,使得测试人员由查看一堆无差异的覆盖率统计结果,改为聚集到特定的需求变更代码上。使得测试人员可以在有限的时间里,关注更需要重点测试的代码,提高了测试效率。
根据本发明的另一个实施例,还提供了一种代码覆盖率确定装置,图7是根据本发明实施例的代码覆盖率确定装置的框图,如图7所示,包括:
查询模块72,用于根据被测软件的需求查询关联的多个代码版本;
第一确定模块74,用于确定所述需求涉及代码的代码影响范围;
累加模块76,用于对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率;
第二确定模块78,用于根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率。
可选地,所述装置还包括:
染色模块,用于根据所述需求的代码影响范围,对所述被测软件覆盖到的代码进行染色。
可选地,所述第一确定模块74包括:
对比子模块,用于利用版本比对工具对需求关联的所述多个代码版本中的起始版本、当前版本的java代码进行对比,得到代码的变更行号集合DL[line],将之保存到存储介质中;
解析子模块,用于利用抽象语法树AST对所述当前版本的java代码进行解析,识别出函数集合F[function];
筛选子模块,用于根据所述变更行号集合DL[line],对所述函数集合F[function]进行筛选,得到所述需求的变更函数集合DF[function],其中,所述代码影响范围为所述变更函数集合DF[function]。
可选地,所述第二确定模块78,还用于:
利用所变更函数集合DF[function]对所述累计覆盖率进行筛选,得到所述需求覆盖率。
可选地,所述累加模块包括:
插桩子模块,用于利用代码覆盖率工具jacoco,对所述被测软件的单个应用程序进行插桩,定频采集所述多个代码版本的覆盖率信息,以xml文件格式保存于存储介质中;
获取子模块,用于从存储介质中获取多个XML文件;
排序子模块,用于按照时间先后顺序对所述多个XML文件进行排序,得到File 1、File 2、File 3、...、File n;
合并子模块,用于将最新的所述Filen作为基准,依次将File1、File 2、File3、...、File n-1合并到所述File n中,得到合并结果;
根据所述合并结果确定所述累计覆盖率。
可选地,所述合并子模块,还用于:
对所述File 1、File 2、File 3、...、File n-1中的每一个执行以下步骤,直到完成将File 1、File 2、File 3、...、File n-1合并到所述File n中,得到所述合并结果,其中,正在执行的称为当前File:
将所述当前File,得到函数的唯一性签名KEYa的覆盖明细COVa;
解析所述Filen中,得到函数的唯一性签名KEYan的覆盖明细COVan;
如果所述当前File对应的KEYa等于所述KEYan,将所述当前File对应的覆盖明细COVa和所述Filen对应的覆盖明细COVa n进行合并;
如果所述当前File对应的KEYa不等于所述KEYan,舍弃所述当前File对应的覆盖明细COVa,只保留所述File n对应的覆盖明细COVa n。
需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。
本发明的实施例还提供了一种计算机可读的存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:
S1,根据被测软件的需求查询关联的多个代码版本;
S2,确定所述需求涉及代码的代码影响范围;
S3,对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率;
S4,根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率。
可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(Read-Only Memory,简称为ROM)、随机存取存储器(Random Access Memory,简称为RAM)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。
本发明的实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:
S1,根据被测软件的需求查询关联的多个代码版本;
S2,确定所述需求涉及代码的代码影响范围;
S3,对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率;
S4,根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率。
可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种代码覆盖率确定方法,其特征在于,包括:
根据被测软件的需求查询关联的多个代码版本;
确定所述需求涉及代码的代码影响范围;
对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率;
根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率。
2.根据权利要求1所述的方法,其特征在于,在根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率之后,所述方法还包括:
根据所述需求的代码影响范围,对所述被测软件覆盖到的代码进行染色。
3.根据权利要求1所述的方法,其特征在于,确定所述需求涉及代码的代码影响范围包括:
利用版本比对工具对需求关联的所述多个代码版本中的起始版本、当前版本的java代码进行对比,得到代码的变更行号集合DL[line],将之保存到存储介质中;
利用抽象语法树AST对所述当前版本的java代码进行解析,识别出函数集合F[function];
根据所述变更行号集合DL[line],对所述函数集合F[function]进行筛选,得到所述需求的变更函数集合DF[function],其中,所述代码影响范围为所述变更函数集合DF[function]。
4.根据权利要求3所述的方法,其特征在于,根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率包括:
利用所变更函数集合DF[function]对所述累计覆盖率进行筛选,得到所述需求覆盖率。
5.根据权利要求1至4中任一项所述的方法,其特征在于,对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率包括:
利用代码覆盖率工具jacoco,对所述被测软件的单个应用程序进行插桩,定频采集所述多个代码版本的覆盖率信息,以xml文件格式保存于存储介质中;
从存储介质中获取多个XML文件;
按照时间先后顺序对所述多个XML文件进行排序,得到File 1、File 2、File 3、...、File n;
将最新的所述File n作为基准,依次将File 1、File 2、File 3、...、File n-1合并到所述File n中,得到合并结果;
根据所述合并结果确定所述累计覆盖率。
6.根据权利要求5所述的方法,其特征在于,将最新的所述File n作为基准,依次将File 1、File 2、File 3、...、File n-1合并到所述File n中,得到合并结果包括:
对所述File 1、File 2、File 3、...、File n-1中的每一个执行以下步骤,直到完成将File 1、File 2、File 3、...、File n-1合并到所述File n中,得到所述合并结果,其中,正在执行的称为当前File:
将所述当前Fi le,得到函数的唯一性签名KEYa的覆盖明细COVa;
解析所述File n中,得到函数的唯一性签名KEYan的覆盖明细COVa n;
如果所述当前File对应的KEYa等于所述KEYan,将所述当前File对应的覆盖明细COVa和所述File n对应的覆盖明细COVa n进行合并;
如果所述当前File对应的KEYa不等于所述KEYan,舍弃所述当前File对应的覆盖明细COVa,只保留所述Filen对应的覆盖明细COVa n。
7.一种代码覆盖率确定装置,其特征在于,包括:
查询模块,用于根据被测软件的需求查询关联的多个代码版本;
第一确定模块,用于确定所述需求涉及代码的代码影响范围;
累加模块,用于对所述多个代码版本的覆盖率进行累加,得到所述需求的累计覆盖率;
第二确定模块,用于根据所述代码影响范围与所述累计覆盖率确定所述被测代码的覆盖率。
8.根据权利要求7所述的装置,其特征在于,所述装置还包括:
染色模块,用于根据所述需求的代码影响范围,对所述被测软件覆盖到的代码进行染色。
9.一种计算机可读的存储介质,其特征在于,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行所述权利要求1至6任一项中所述的方法。
10.一种电子装置,包括存储器和处理器,其特征在于,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行所述权利要求1至6中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210014181.8A CN114416546A (zh) | 2022-01-06 | 2022-01-06 | 一种代码覆盖率确定方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210014181.8A CN114416546A (zh) | 2022-01-06 | 2022-01-06 | 一种代码覆盖率确定方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114416546A true CN114416546A (zh) | 2022-04-29 |
Family
ID=81272065
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210014181.8A Pending CN114416546A (zh) | 2022-01-06 | 2022-01-06 | 一种代码覆盖率确定方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114416546A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116303106A (zh) * | 2023-05-26 | 2023-06-23 | 江苏博云科技股份有限公司 | 一种适用金融行业的基于GitFlow软件版本快速回滚方法及*** |
-
2022
- 2022-01-06 CN CN202210014181.8A patent/CN114416546A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116303106A (zh) * | 2023-05-26 | 2023-06-23 | 江苏博云科技股份有限公司 | 一种适用金融行业的基于GitFlow软件版本快速回滚方法及*** |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107908541B (zh) | 接口测试方法、装置、计算机设备及存储介质 | |
KR100990777B1 (ko) | 디버그 정보 수집 방법 및 디버그 정보 수집 시스템 | |
CN107515826A (zh) | 测试用例精准推荐方法、装置、***、设备及存储介质 | |
CN110380939A (zh) | 一种用电信息采集***中本地通信协议的一致性测试方法及*** | |
CN107832207A (zh) | 接口性能测试方法、装置、存储介质和计算机设备 | |
US11385898B2 (en) | Task orchestration method for data processing, orchestrator, device and readable storage medium | |
WO2011060655A1 (zh) | 软件业务功能覆盖率的统计方法及*** | |
CN111158741B (zh) | 监控业务模块对第三方类库依赖关系变化的方法及装置 | |
CN112559348B (zh) | 基于jacoco的测试分析方法、***、设备以及介质 | |
CN111782524B (zh) | 应用测试方法和装置、存储介质和电子装置 | |
CN113448854A (zh) | 一种回归测试方法和装置 | |
CN110018963A (zh) | 一种测试方法、***及电子设备和存储介质 | |
CN106649073A (zh) | 一种基于动态脚本模板的测试方法及装置 | |
CN114416546A (zh) | 一种代码覆盖率确定方法及装置 | |
CN110134583A (zh) | 软件测试及数据处理方法及装置 | |
CN112181784A (zh) | 基于字节码注入的代码故障分析方法及*** | |
CN113220561A (zh) | 一种测试用例管理方法、装置、设备及介质 | |
KR101039874B1 (ko) | 정보통신 통합플랫폼 테스트 시스템 | |
CN109542496A (zh) | 增量代码确定方法、装置及*** | |
CN115391223A (zh) | 一种基于流量录制回放的无侵入式策略重建方法及装置 | |
CN112346994B (zh) | 一种测试信息关联方法、装置、计算机设备及存储介质 | |
CN114637688A (zh) | 基于版本分支的覆盖率统计方法及装置 | |
CN112650815A (zh) | 环境数据的同步方法及装置、存储介质及电子装置 | |
CN111813662A (zh) | 用户行为驱动的可持续集成的测试方法、装置和设备 | |
CN114978937B (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 |