CN111290943A - 代码覆盖率处理方法、装置、服务器及存储介质 - Google Patents
代码覆盖率处理方法、装置、服务器及存储介质 Download PDFInfo
- Publication number
- CN111290943A CN111290943A CN202010031116.7A CN202010031116A CN111290943A CN 111290943 A CN111290943 A CN 111290943A CN 202010031116 A CN202010031116 A CN 202010031116A CN 111290943 A CN111290943 A CN 111290943A
- Authority
- CN
- China
- Prior art keywords
- probe array
- code
- function
- file
- coverage
- 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.)
- Withdrawn
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/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请提供了一种代码覆盖率处理方法、装置、服务器及存储介质,属于计算机技术领域。该方法包括:基于待处理项目的第一版本对应的字节码文件,获取函数标识和第一探针数组;从第一探针数组中确定函数标识对应的第一元素;获取已存储的第二探针数组,从第二探针数组中确定函数标识对应的第二元素,第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的;对第一元素和第二元素进行合并得到第三探针数组;根据第三探针数组确定待处理项目的代码覆盖率。第二探针数组是由历史的第二版本对应的探针数组合并得到的,只需要将第一探针数组和第二探针数组进行一次合并,即可得到待处理项目总体的代码覆盖率,提高了合并效率。
Description
技术领域
本申请涉及计算机技术领域,特别涉及一种代码覆盖率处理方法、装置、服务器及存储介质。
背景技术
在软件测试的过程中,通常用代码覆盖率来衡量测试任务的完成情况。代码覆盖率用于表示源代码被测试的比例和程度。可以由被测试的源代码编译得到字节码文件,源代码中的每个类对应一个字节码文件。通过在字节码文件中插入探针来记录源代码是否被执行,根据源代码被执行的情况,得到代码覆盖率。
发明内容
本申请实施例提供了一种代码覆盖率处理方法、装置、服务器及存储介质,能够提高合并不同版本的代码覆盖率的效率。所述技术方案如下:
根据本申请实施例的一方面,提供了一种代码覆盖率处理方法,所述方法包括:
基于待处理项目的第一版本对应的字节码文件,获取所述字节码文件对应的函数标识和第一探针数组;
从所述第一探针数组中确定所述函数标识对应的第一元素;
获取已存储的第二探针数组,从所述第二探针数组中确定所述函数标识对应的第二元素,所述第二探针数组是由所述待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的;
对所述第一元素和所述第二元素进行合并,得到第三探针数组;
根据所述第三探针数组,确定所述待处理项目的代码覆盖率。
在一种可能的实现方式中,所述对所述第一元素和所述第二元素进行合并,得到第三探针数组,包括:
确定所述第一元素对应于所述函数标识对应的函数中的第一代码段,以及所述第二元素对应于所述函数标识对应的函数中的第二代码段;
如果所述第一代码段和所述第二代码段是同一代码段,对所述第一元素对应的布尔类型的第一数值和所述第二元素对应的布尔类型的第二数值进行逻辑或运算,得到第三探针数组。
在另一种可能的实现方式中,所述从所述第一探针数组中确定所述函数标识对应的第一元素,包括:
确定所述函数标识在所述第一探针数组中对应的下标范围;
从所述第一探针数组中确定下标在所述下标范围内的第一元素,所述下标为区分所述第一探针数组中每个元素的数字编号。
在另一种可能的实现方式中,所述对所述第一元素和所述第二元素进行合并,得到第三探针数组之后,所述方法还包括:
将已存储的所述第二探针数组更新为所述第三探针数组。
在另一种可能的实现方式中,所述获取所述字节码文件对应的函数标识和第一探针数组,包括:
获取所述第一版本对应的第一覆盖率文件;
根据所述字节码文件和所述第一版本的第一覆盖率文件,提取所述字节码文件对应的函数标识和第一探针数组。
在另一种可能的实现方式中,所述根据所述字节码文件和所述第一版本的第一覆盖率文件,提取所述字节码文件对应的函数标识和第一探针数组,包括:
从所述字节码文件中确定函数对应的字节码片段;
对所述字节码片段进行预设编码运算,得到所述函数的函数标识;
解析所述第一覆盖率文件,得到所述字节码文件对应的第一探针数组。
在另一种可能的实现方式中,所述根据所述第三探针数组,确定所述待处理项目的代码覆盖率,包括:
根据所述第三探针数组和所述第三探针数组对应的字节码文件的字节码标识,生成第二覆盖率文件;
根据所述第二覆盖率文件,确定所述第二覆盖率文件对应的源码文件的代码覆盖程度;
根据所述源码文件的代码覆盖程度,对所述源码文件中的代码段进行标记,生成所述待处理项目对应的第二覆盖率报告,所述第二覆盖率报告用于展示所述待处理项目的代码覆盖率。
在另一种可能的实现方式中,所述方法还包括:
如果所述第一版本为所述待处理项目的初始版本,存储所述第一探针数组。
根据本申请实施例的另一方面,提供了一种代码覆盖率处理装置,所述装置包括:
获取模块,被配置为基于待处理项目的第一版本对应的字节码文件,获取所述字节码文件对应的函数标识和第一探针数组;
确定模块,被配置为从所述第一探针数组中确定所述函数标识对应的第一元素;
所述确定模块,还被配置为获取已存储的第二探针数组,从所述第二探针数组中确定所述函数标识对应的第二元素,所述第二探针数组是由所述待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的;
合并模块,被配置为对所述第一元素和所述第二元素进行合并,得到第三探针数组;
所述确定模块,还被配置为根据所述第三探针数组,确定所述待处理项目的代码覆盖率。
在一种可能的实现方式中,所述合并模块,还被配置为确定所述第一元素对应于所述函数标识对应的函数中的第一代码段,以及所述第二元素对应于所述函数标识对应的函数中的第二代码段;如果所述第一代码段和所述第二代码段是同一代码段,对所述第一元素对应的布尔类型的第一数值和所述第二元素对应的布尔类型的第二数值进行逻辑或运算,得到第三探针数组。
在另一种可能的实现方式中,所述确定模块,还被配置为确定所述函数标识在所述第一探针数组中对应的下标范围;从所述第一探针数组中确定下标在所述下标范围内的第一元素,所述下标为区分所述第一探针数组中每个元素的数字编号。
在另一种可能的实现方式中,所述装置还包括:
更新模块,被配置为将已存储的所述第二探针数组更新为所述第三探针数组。
在另一种可能的实现方式中,所述获取模块,还被配置为获取所述第一版本对应的第一覆盖率文件;根据所述字节码文件和所述第一版本的第一覆盖率文件,提取所述字节码文件对应的函数标识和第一探针数组。
在另一种可能的实现方式中,所述获取模块,还被配置为从所述字节码文件中确定函数对应的字节码片段;对所述字节码片段进行预设编码运算,得到所述函数的函数标识;解析所述第一覆盖率文件,得到所述字节码文件对应的第一探针数组。
在另一种可能的实现方式中,所述确定模块,还被配置为根据所述第三探针数组和所述第三探针数组对应的字节码文件的字节码标识,生成第二覆盖率文件;根据所述第二覆盖率文件,确定所述第二覆盖率文件对应的源码文件的代码覆盖程度;根据所述源码文件的代码覆盖程度,对所述源码文件中的代码段进行标记,生成所述待处理项目对应的第二覆盖率报告,所述第二覆盖率报告用于展示所述待处理项目的代码覆盖率。
在另一种可能的实现方式中,所述装置还包括:
存储模块,被配置为如果所述第一版本为所述待处理项目的初始版本,存储所述第一探针数组。
根据本申请实施例的另一方面,提供了一种服务器,所述服务器包括处理器和存储器,所述存储器中存储有至少一条指令,所述至少一条指令由所述处理器加载并执行,以实现上述任一可能实现方式所述的代码覆盖率处理方法。
根据本申请实施例的另一方面,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一条指令,所述至少一条指令由处理器加载并执行,以实现上述任一可能实现方式所述的代码覆盖率处理方法。
在本申请实施例中,基于待处理项目的第一版本对应的字节码文件,获取字节码文件对应的函数标识和第一探针数组;从第一探针数组中确定函数标识对应的第一元素;获取已存储的第二探针数组,从第二探针数组中确定函数标识对应的第二元素,第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的;对第一元素和第二元素进行合并,得到第三探针数组;根据第三探针数组,确定待处理项目的代码覆盖率。由于第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的,因此,只需要将第一版本对应的第一探针数组和第二探针数组进行一次合并,即可得到待处理项目总体的代码覆盖率,在实现不同版本的代码覆盖率合并的基础上,大大减少了合并的时间,提高了合并待处理项目不同版本的代码覆盖率的效率。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种实施环境的示意图;
图2是本申请实施例提供的一种代码覆盖率处理方法的流程图;
图3是本申请实施例提供的一种代码覆盖率处理方法的流程图;
图4是本申请实施例提供的一种生成代码覆盖率报告的流程图;
图5是本申请实施例提供的一种代码覆盖率处理装置的框图;
图6是本申请实施例提供的一种服务器的框图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
本申请的说明书和权利要求书及附图中的术语“第一”、“第二”、“第三”和“第四”等是用于区别不同对象,而不是用于描述特定顺序。此外,术语“包括”和“具有”以及它们的任意变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其他步骤或单元。
在软件研发过程中,需要对软件进行测试,以保证软件研发的高质量和高效率。代码覆盖率是对测试完全程度的评价指标,代码覆盖率越高,说明被测试的代码的比例越高,测试更加全面,更能保证软件研发的质量和效率。
代码覆盖率包括行覆盖率、类覆盖率、分支覆盖率、函数覆盖率、指令覆盖率和圈复杂度中的一个或多个,行覆盖率用于衡量被测试的每行代码是否被执行;类覆盖率用于衡量类文件是否被执行;分支覆盖率用于衡量判断语句对应的每个分支的执行情况;函数覆盖率用于衡量被测试的函数的执行情况;指令覆盖率用于衡量代码对应的二进制指令是否被执行;圈复杂度用于衡量单元测试是否完全覆盖所有场景。
代码覆盖率可以通过代码覆盖率工具得到,例如,常用的代码覆盖率工具有Jacoco(Java code coverage,分析代码测试覆盖率的工具)、Emma(用于检测和报告Java代码覆盖率的工具)和Gcov(GCC coverage,测试代码覆盖率的工具)等。
图1是本申请实施例提供的一种实施环境的示意图。参见图1,该实施环境中包括终端101和服务器102。终端101可以为电脑、手机、平板电脑或者其他电子设备。服务器102可以是一台服务器,或者由若干台服务器组成的服务器集群,或者是一个云计算服务中心。
终端101和服务器102之间通过无线或者有线网络连接。并且,终端101上可以安装有服务器102提供服务的客户端,终端101对应的用户可以通过该客户端实现例如数据传输、消息交互等功能。
一个软件开发项目生成新版本时,服务器可以将该新版本的代码覆盖情况和历史版本的代码覆盖情况的总和进行合并,得到合并的代码覆盖率报告。该软件开发项目的工作人员可以通过终端101查看代码覆盖率报告。代码覆盖率报告可以直观的展示代码覆盖率。例如,借助代码覆盖率工具Jacoco得到的代码覆盖率报告可以展示出行覆盖率、类覆盖率、分支覆盖率、函数覆盖率、指令覆盖率和圈复杂度等多种指标,并且,该代码覆盖率报告还可以提供被测试代码的覆盖情况视图。该覆盖情况视图包括被测代码和覆盖情况标记,例如,对于被测代码的每一行来说,如果某行代码的背景被标记为红色,表示该行代码没有指令被覆盖;如果某行代码的背景被标记为黄色,表示该行代码只有部分指令被覆盖;如果某行代码的背景被标记为绿色,表示该行代码中的所有指令都被覆盖。再如,对于被测代码的分支来说,如果某行代码被红色菱形标记,表示该行中没有分支被覆盖;如果某行代码被黄色菱形标记,表示该行的分支中只有部分被覆盖;如果某行代码被绿色菱形标记,表示该行的所有分支都被覆盖。
图2是本申请实施例提供的一种代码覆盖率处理方法的流程图。参见图2,该实施例包括:
201、基于待处理项目的第一版本对应的字节码文件,获取字节码文件对应的函数标识和第一探针数组。
202、从第一探针数组中确定函数标识对应的第一元素。
203、获取已存储的第二探针数组,从第二探针数组中确定函数标识对应的第二元素,第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的。
204、对第一元素和第二元素进行合并,得到第三探针数组。
205、根据第三探针数组,确定待处理项目的代码覆盖率。
在本申请实施例中,由于第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的,因此,只需要将第一版本对应的第一探针数组和第二探针数组进行一次合并,即可得到待处理项目总体的代码覆盖率,在实现不同版本的代码覆盖率合并的基础上,大大减少了合并的时间,提高了合并待处理项目不同版本的代码覆盖率的效率。
在一种可能的实现方式中,对第一元素和第二元素进行合并,得到第三探针数组,包括:
确定第一元素对应于函数标识对应的函数中的第一代码段,以及第二元素对应于函数标识对应的函数中的第二代码段;
如果第一代码段和第二代码段是同一代码段,对第一元素对应的布尔类型的第一数值和第二元素对应的布尔类型的第二数值进行逻辑或运算,得到第三探针数组。
在另一种可能的实现方式中,从第一探针数组中确定函数标识对应的第一元素,包括:
确定函数标识在第一探针数组中对应的下标范围;
从第一探针数组中确定下标在下标范围内的第一元素,下标为区分第一探针数组中每个元素的数字编号。
在另一种可能的实现方式中,对第一元素和第二元素进行合并,得到第三探针数组之后,方法还包括:
将已存储的第二探针数组更新为第三探针数组。
在另一种可能的实现方式中,获取字节码文件对应的函数标识和第一探针数组,包括:
获取第一版本对应的第一覆盖率文件;
根据字节码文件和第一版本的第一覆盖率文件,提取字节码文件对应的函数标识和第一探针数组。
在另一种可能的实现方式中,根据字节码文件和第一版本的第一覆盖率文件,提取字节码文件对应的函数标识和第一探针数组,包括:
从字节码文件中确定函数对应的字节码片段;
对字节码片段进行预设编码运算,得到函数的函数标识;
解析第一覆盖率文件,得到字节码文件对应的第一探针数组。
在另一种可能的实现方式中,根据第三探针数组,确定待处理项目的代码覆盖率,包括:
根据第三探针数组和第三探针数组对应的字节码文件的字节码标识,生成第二覆盖率文件;
根据第二覆盖率文件,确定第二覆盖率文件对应的源码文件的代码覆盖程度;
根据源码文件的代码覆盖程度,对源码文件中的代码段进行标记,生成待处理项目对应的第二覆盖率报告,第二覆盖率报告用于展示待处理项目的代码覆盖率。
在另一种可能的实现方式中,该方法还包括:
如果第一版本为待处理项目的初始版本,存储第一探针数组。
图3是本申请实施例提供的一种代码覆盖率处理方法的流程图,参见图3,该实施例包括:
301、服务器基于待处理项目的第一版本对应的字节码文件,获取字节码文件对应的函数标识和第一探针数组。
待处理项目为需要生成代码覆盖率的项目。对待处理项目进行测试,得到衡量测试的完全程度的代码覆盖率。对待处理项目的测试可以为软件开发过程中任一测试阶段的测试。对待处理项目的测试可以为单元测试,待处理项目为软件中的某一功能模块。对待处理项目的测试还可以为集成测试、系统测试或者验收测试等,在本申请实施例中,不做限定。
通过对待处理项目的测试可能会发现待处理项目的问题或缺陷,开发人员在解决问题或缺陷时,待处理项目中的代码会发生变化,从而产生新的版本的待处理项目。解决问题或缺陷前的待处理项目为一个版本的待处理项目,解决问题或缺陷后的待处理项目为另一个版本的待处理项目。在本申请实施例中,通过第一版本和第二版本来区分不同版本的待处理项目,第一版本可以为当前的最新版本,第二版本可以为第一版本之前的任一版本。第二版本还可以为第一版本的前一个上线版本和第一版本之间的任一版本。
待处理项目对应有源码文件和字节码文件。源码文件为软件开发人员用特定语言编写的原始代码。字节码文件为一种二进制文件,该字节码文件也可以称为class(类)文件,该字节码文件可以运行在任何支持Java虚拟机的硬件平台和操作系统上。
待处理项目的源码文件包括至少一个类,待处理项目的每个类对应有一个字节码文件,待处理项目对应有至少一个字节码文件。每个类中包括至少一个函数,函数标识为函数的唯一标识,不同的函数对应有不同的函数标识。
第一探针数组用于表示待处理项目中每个类对应的代码覆盖情况,第一探针数组可以为布尔数组,第一探针数组中的元素的值可以为布尔类型的值,即第一探针数组的元素的值为true(真)或false(假)。true表示已被覆盖,false表示未被覆盖。以下为描述简便,用1来表示true,用0来表示false。
在一种可能的实现方式中,服务器可以根据字节码文件中每个函数对应的字节码片段,生成每个函数的函数标识,以及根据字节码文件的字节码标识,确定第一探针数组。相应的,服务器根据字节码文件和第一版本的第一覆盖率文件,提取字节码文件对应的函数标识和第一探针数组的步骤可以为:服务器从字节码文件中确定函数对应的字节码片段,对字节码片段进行预设编码运算,得到函数的函数标识;服务器解析第一覆盖率文件,确定字节码文件对应的第一探针数组。
函数标识为函数的唯一标识,每个函数标识对应一个函数,通过函数标识可以确定唯一函数。不同版本的相同函数对应的函数标识是相同的,例如,第一版本相较于第一版本的上一版本,函数A未发生变化,则函数A在第一版本中的函数标识与函数A在第一版本的上一版本中的函数标识是相同的。
服务器可以通过MD5(Message-Digest Algorithm 5,第五版信息摘要算法)算法对字节码片段进行预设编码运算,得到固定长度的字符串;将该字符串确定为函数标识。
第一覆盖率文件对应有待处理项目的每个类对应的第一探针数组,可以通过解析第一覆盖率文件,得到每个类对应的第一探针数组。相应的,服务器解析第一覆盖率文件,得到字节码文件对应的第一探针数组的步骤可以为:服务器解析第一覆盖率文件,得到关联的字节码标识和第一探针数组;根据字节码文件的字节码标识,从关联的字节码标识和第一探针数组中确定与字节码标识关联的第一探针数组。其中,字节码标识可以为通过MD5算法对字节码文件进行处理得到的唯一字符串。
例如,解析第一覆盖率文件得到“{${classId}:[0,1,1,0,1,0]}”结构的数据,其中,“classId”表示字节码标识,“[0,1,1,0,1,0]”为第一探针数组,根据该数据,可以确定字节码标识对应的第一探针数组。
在另一种可能的实现方式中,服务器还可以从字节码文件对应的第一覆盖率信息中获取字节码文件对应的函数标识和第一探针数组。第一覆盖率信息包括函数所属的类的类名、该类名对应的类中函数的函数信息和字节码文件对应的探针信息。服务器可以从函数信息中获取字节码文件对应的至少一个函数标识,从探针信息中获取字节码文件对应的第一探针数组。
需要说明的一点是,待处理项目可能对应有多个字节码文件,每个字节码文件对应一个覆盖率信息。服务器可能会生成多个字节码文件对应的多个覆盖率信息,因此,服务器从字节码文件对应的覆盖率信息中获取字节码文件对应的至少一个函数标识和第一探针数组之前,还可以根据类的类名,从服务器生成的多个覆盖率信息中获取该类名对应的覆盖率信息。
需要说明的另一点是,服务器从字节码文件对应的第一覆盖率信息中获取字节码文件对应的函数标识和第一探针数组之前,还生成字节码文件对应的第一覆盖率信息。相应的,服务器生成字节码文件对应的第一覆盖率信息可以通过以下步骤(1)至(2)实现:
(1)服务器根据字节码文件和第一版本的第一覆盖率文件,提取字节码文件对应的至少一个函数标识和字节码文件对应的第一探针数组。
第一覆盖率文件包括待处理项目对应的代码覆盖率情况,第一覆盖率文件是生成代码覆盖率报告的重要依据。第一覆盖率文件可以为“.exec”类型的文件,第一覆盖率文件也可以称为ec文件。
服务器可以在生成代码覆盖率报告的过程中,提取至少一个函数标识、第一探针数组、函数名、类名以及函数标识与第一探针数组中的元素的对应关系。相应的,服务器根据字节码文件和第一版本的第一覆盖率文件,提取字节码文件对应的函数标识和第一探针数组的步骤可以为:服务器在根据待处理项目的第一版本的字节码文件、第一版本的第一覆盖率文件和第一版本的源码文件,通过Jacoco生成第一版本的代码覆盖率报告时,从源码文件中提取函数的函数名;根据源码文件和字节码文件的映射关系,从字节码文件中确定该函数的字节码片段和函数所属的类的类名;根据每个字节码片段,生成该函数的函数标识;根据字节码文件的字节码标识,从第一覆盖率文件中确定字节码标识对应的第一探针数组;根据源码文件、字节码文件和第一覆盖率文件三者之间的映射关系,确定函数标识与第一探针数组中元素的对应关系,关联函数标识和该函数标识对应的第一探针数组中的元素。
图4是本申请实施例提供的一种生成代码覆盖率报告的流程图,参见图4,服务器根据待处理项目的第一版本的字节码文件、第一版本的第一覆盖率文件和第一版本的源码文件,通过Jacoco生成第一版本的代码覆盖率报告,也即根据class文件、ec文件和源码文件,生成本次覆盖率报告,也可以说,根据字节码文件、第一覆盖率文件和源码文件,生成本次覆盖率报告。
需要说明的一点是,服务器根据字节码文件和第一版本的第一覆盖率文件,提取字节码文件对应的函数标识和第一探针数组之前,还生成第一覆盖率文件。相应的,服务器生成第一覆盖率文件的步骤可以为:获取待处理项目的第一版本的字节码文件,在字节码文件中插入探针,探针的初始值为0;运行待处理项目;如果探针对应的字节码片段被执行,将探针的值变为1;如果探针对应的字节码片段未被执行,探针的值仍为0;由字节码文件中每个字节码片段对应的探针组成第一探针数组;关联第一探针数组和字节码文件的字节码标识,得到待处理项目的第一版本的第一覆盖率文件。
(2)服务器根据至少一个函数标识和第一探针数组,生成字节码文件第一覆盖率信息。
本申请实施例提供的代码覆盖率处理方法可以封装在一个类中,该类的名称可以为“ExecFunction”。该类中声明的变量有funName(函数名)、className(类名)、beginProb(开始探针)、endProb(结束探针)、probes(探针数组)和funId(函数标识),参见表1。
表1
其中,funName表示函数的函数名;className表示待处理项目中类的类名;beginProb表示函数标识在探针数组中对应的元素的起始下标;endProb表示函数标识在探针数组中对应的元素的结束下标;probes表示字节码文件对应的探针数组;funId表示函数标识,也即函数Id(Identity document,身份标识号)。String用于表示变量为字符串变量;int用于表示变量为整型变量,即表示变量为整数类型的数据;boolean[]表示变量为布尔类型的数组,即数组中的值为true或false。
服务器可以根据至少一个函数标识、第一探针数组、函数名、类名以及函数标识与第一探针数组中的元素的对应关系,生成第一覆盖率信息。相应的,服务器根据至少一个函数标识和第一探针数组,生成字节码文件对应的第一覆盖率信息的步骤还可以为:服务器根据类名,确定该类名对应的类中函数的函数名;关联函数的函数名和函数标识,得到该函数的函数信息;根据函数标识和该函数标识对应的第一探针数组中的元素的关联关系,确定该函数标识对应的第一探针数组的下标范围,该下标范围包括该函数标识对应的起始下标和结束下标;关联函数标识和下标范围,将第一探针数组和每个函数标识对应的下标范围确定为字节码文件对应的探针信息;关联类名、函数信息和探针信息,生成第一覆盖率信息,该第一覆盖率信息包括类名、该类名对应的类中函数的函数信息和字节码文件对应的探针信息。
继续参见图4,可以用List<ExecFunction>来表示字节码文件对应的第一覆盖率信息。待处理项目的第一版本的字节码文件对应的第一覆盖率信息可以用List<ExecFunction>a来表示。
302、服务器从第一探针数组中确定函数标识对应的第一元素。
第一探针数组用于表示待处理项目中每个类对应的代码覆盖情况,第一探针数组中的元素分别表示类中的不同函数的代码覆盖情况。例如,待处理项目中的一个类对应的第一探针数组的名称为probes1,第一探针数组包括probes1[0]、probes1[1]、probes1[2]、probes1[3]、probes1[4]和probes1[5]等6个元素;该类包括第一函数、第二函数和第三函数3个不同的函数,probes1[0]和probes1[1]代表第一函数的代码覆盖情况,probes1[2]、probes1[3]和probes1[4]代表第二函数的代码覆盖情况,probes1[5]代表第三函数的代码覆盖情况。
在一种可能的实现方式中,服务器可以根据函数标识和第一探针数组中第一元素的关联关系,从第一探针数组中确定每个函数标识对应的至少一个第一元素。例如,第一探针数组为probes1[0,1,0,0,1,0],其中,probes1[0]为0,probes1[1]为1,probes1[2]为0,probes1[3]为0,probes1[4]为1,probes1[5]为0;第一函数的函数标识与第一探针数组中的probes1[0]和probes1[1]两个元素存在关联关系,第二函数的函数标识与第一探针数组中的probes1[2]、probes1[3]和probes1[4]三个元素存在关联关系,第三函数的函数标识与第一探针数组中的probes1[5]元素存在关联关系;则第一函数的函数标识对应的至少一个第一元素为probes1[0]=0和probes1[1]=1;第二函数的函数标识对应的至少一个第一元素为probes1[2]=0、probes1[3]=0和probes1[4]=1;第三函数的函数标识对应的至少一个第一元素为probes1[5]=0。
在另一种可能的实现方式中,服务器可以确定函数标识在第一探针数组中对应的下标范围,将下标在下标范围内的元素确定为函数标识对应的至少一个第一元素。相应的,服务器从第一探针数组中确定函数标识对应的第一元素的步骤可以为:服务器确定函数标识在第一探针数组中对应的下标范围;从第一探针数组中确定下标在下标范围内的至少一个第一元素,下标为区分第一探针数组中每个元素的数字编号。
每个函数对应至少一个第一元素,下标范围可以包括函数标识对应的至少一个第一元素的起始下标和结束下标,下标在起始下标和结束下标两个数值之间的元素即为函数标识对应的第一元素。例如,第二函数的函数标识对应的起始下标为2,结束下标为4,则下标范围为2至4,即下标在2和4之间的元素即为第二函数的函数标识对应的第一元素,即probes1[2]、probes1[3]和probes1[4]三个元素为第二函数的函数标识对应的第一元素。
下标范围还可以包括函数标识对应的至少一个第一元素的至少一个下标,例如,第二函数的函数表示对应的下标范围为2、3和4,即probes1[2]、probes1[3]和probes1[4]三个元素为第二函数的函数标识对应的至少一个第一元素。
需要说明的一点是,服务器可以从字节码文件对应的第一覆盖率信息的探针信息中确定函数标识在第一探针数组中对应的下标范围。
303、服务器获取已存储的第二探针数组,从第二探针数组中确定函数标识对应的第二元素。
第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的。
例如,待处理项目对应有版本1、版本2、版本3和版本4等4个版本,版本4为待处理项目的第一版本,版本1、版本2和版本3为待处理项目历史的第二版本。版本1的探针数组为a1,当待处理项目产生版本2,得到版本2的探针数组a2时,将版本1的探针数组和版本2的探针数组合并,得到探针数组b,此时b表示a1+a2。当待处理项目产生版本3,得到版本3的探针数组a3时,将版本3的探针数组和探针数组b合并,更新探针数组b,此时b表示a1+a2+a3。当待处理项目产生版本4,得到版本4的探针数组a4时,将版本4的探针数组和探针数组b合并,更新探针数组b,此时b表示a1+a2+a3+a4。探针数组b即为第二探针数组。
服务器获取已存储的第二探针数组,从第二探针数组中确定函数标识对应的第二元素的步骤可以通过以下步骤(1)至(2)实现:
(1)服务器获取已存储的第二探针数组。
在一种可能的实现方式中,服务器可以从存储有第二探针数组的数据库中获取已存储的第二探针数组。
在另一种可能的实现方式中,服务器存储有待处理项目对应的第二覆盖率信息,服务器可以从已存储的待处理项目对应的第二覆盖率信息中获取第二探针数组。
第二覆盖率信息是由待处理项目对应的每个版本的覆盖率信息合并得到的。第二覆盖率信息用于表示待处理项目整体的代码覆盖率情况,待处理项目的各个版本的覆盖率信息的合并对应于探针数组的合并。
例如,待处理项目对应有版本1、版本2、版本3和版本4等4个版本,版本4为待处理项目的第一版本,版本1、版本2和版本3为待处理项目历史的第二版本。当待处理项目产生版本1,得到版本1的覆盖率信息时,存储版本1的覆盖率信息,将版本1的覆盖率信息作为第二覆盖率信息;当待处理项目产生版本2,得到版本2的覆盖率信息时,将版本2的覆盖率信息和版本1的覆盖率信息合并,更新第二覆盖率信息;当待处理项目产生版本3,得到版本3的覆盖率信息时,将版本3的覆盖率信息和第二覆盖率信息合并,更新第二覆盖率信息;当待处理项目产生版本4,得到版本4的覆盖率信息时,将版本4的覆盖率信息和第二覆盖率信息合并,更新第二覆盖率信息。
继续参见图4,待处理项目的第二覆盖率信息可以用List<ExecFunction>b来表示。待处理项目的第二覆盖率信息可以存储在数据库中,服务器从已存储的第二覆盖率信息中获取第二探针数组之前,还要判断是否存储有待处理项目的字节码文件对应的第二覆盖率信息。服务器判断是否存储有待处理项目的字节码文件对应的第二覆盖率信息的步骤可以为:服务器获取待处理项目中类的类名;根据该类名,确定是否存储有该类名对应的第二覆盖率信息。继续参见图4,服务器判断是否存储有待处理项目的字节码文件对应的第二覆盖率信息,也即判断数据库中是否包含此项目的List<ExecFunction>b,也可以说是,判断数据库中是否包含该项目的第二覆盖率信息。如果数据库中包含此项目的List<ExecFunction>b,获取数据库中的List<ExecFunction>b,将List<ExecFunction>a和List<ExecFunction>b合并,也即a与b合并,更新List<ExecFunction>b,也即更新数据库中的List<ExecFunction>,也可以说是,如果数据库中包含此项目的第二覆盖率信息,获取数据库中的第二覆盖率信息,将第一覆盖率信息和第二覆盖率信息合并,更新数据库中的覆盖率信息。
如果第一版本为待处理项目的初始版本,存储第一探针数组。例如,待处理项目的第一个版本产生时,第一个版本之前还没有历史的第二版本,可以存储第一个版本的探针数组,将第一个版本作为下一个版本的历史的第二版本。继续参见图4,如果第一版本为待处理项目的初始版本,则初始版本之前没有历史的第二版本,数据库中还未存储有历史的第二版本对应的第二探针数组,将第一版本的第一探针数组存储在数据库中,也即如果数据库中不包含此项目的List<ExecFunction>b,则将List<ExecFunction>a存储在数据库中,也即新增数据库中的List<ExecFunction>,也可以说是,如果数据库中不包含此项目的第二覆盖率信息,则将第一覆盖率信息存储在数据库中,也即新增数据库中的覆盖率信息。
在本申请实施例中,服务器获取已存储的第二探针数组,第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的,从而只需要将第一探针数组和第二探针数组进行一次合并即可得到用于表示待处理项目整体的代码覆盖率情况的第三探针数组,相较于时间复杂度为O(n)的遍历方法,一次合并的时间复杂度仅为O(1)。对于多次合并的情况,能够将合并耗时有几分钟降低为几秒,大大降低了合并耗时,提高了合并效率。并且,合并次数越多,提高合并效率的效果越显著。
需要说明的一点是,第二版本可以为第一版本之前的任一版本。第二版本也可以为第一版本的前一个上线版本和第一版本之间的任一版本。
在本申请实施例中,第二版本可以为第一版本之前的任一版本,从而服务器将第二探针数组和第一探针数组进行合并,得到的第三探针数组能够代表待处理项目总体的代码覆盖情况,从而能够根据总体的代码覆盖情况,完善测试流程,提高测试质量。
在本申请实施例中,第二版本也可以为第一版本的前一个上线版本和第一版本之间的任一版本,从而当第一版本为上线版本时,可以通过合并得到两个上线版本之间的总的代码覆盖率,也即迭代覆盖率,从而能够根据迭代覆盖率衡量两个上线版本之间的代码覆盖情况,根据两个上线版本之间的代码覆盖情况,完善测试流程,提高对本次上线版本测试的质量。
(2)服务器从第二探针数组中确定函数标识对应的第二元素。
服务器从第二探针数组中确定函数标识对应的第二元素的步骤与步骤202相似,在此不再赘述。
304、服务器对第一元素和第二元素进行合并,得到第三探针数组。
第一元素和第二元素分别为同一个函数标识对应的第一探针数组中的元素和第二探针数组中的元素。第一元素和第二元素对应于不同版本的同一个函数的同一代码段。
第三探针数组用于表示待处理项目中每个类对应的代码覆盖情况,每个类中包括至少一个函数,第三探针数组包括至少一个函数中每个函数的函数标识对应的元素,第三探针数组中的元素的值为第一元素的值和第二元素的值合并得到的值。
在一种可能的实现方式中,第一元素和第二元素为布尔类型的值,服务器依次对第一元素和第二元素进行逻辑或运算,得到第三探针数组。例如,函数标识对应的第一元素分别为0、1和1,该函数标识对应的第二元素分别为1、0和1;服务器对函数标识对应的第一个第一元素0和函数标识对应的第一个第二元素1进行逻辑或运算,得到1;服务器对函数标识对应的第二个第一元素1和函数标识对应的第二个第二元素0进行逻辑或运算,得到1;服务器对函数标识对应的第三个第一元素1和函数标识对应的第三个第二元素1进行逻辑或运算,得到1,则该函数标识在第三探针数组中对应的元素分别为1、1和1。
在另一种可能的实现方式中,服务器可以合并对应于同一代码段的第一元素和第二元素,相应的,服务器对函数标识对应的第一元素和第二元素进行合并,得到第三探针数组的步骤可以为:服务器确定第一元素对应于函数标识对应的函数中的第一代码段,以及第二元素对应于函数标识对应的函数中的第二代码段;如果第一代码段和第二代码段是同一代码段,对第一元素对应的布尔类型的第一数值和第二元素对应的布尔类型的第二数值进行逻辑或运算,得到第三探针数组。
每个函数对应有探针数组中的至少一个元素,不同的元素指向函数中不同的代码段。例如,函数中包括判断语句,该判断语句可以对应有3个元素,第一个元素指向判断结果为“是”的分支,用于表示判断结果为“是”的分支是否被执行,第二个元素指向判断结果为“否”的分支,用于表示判断结果为“否”的分支是否被执行,第三个元素指向该判断语句的结尾,用于判断是否完整的执行了该判断语句。
例如,待处理项目对应的第二探针数组为probes2[0,1,1,0,1]。其中,第二探针数组对应有第四函数、第二函数和第三函数。其中,第四函数的函数标识对应的第二元素和第二元素对应的第二数值可以表示为probes2[0]=0;第二函数的函数标识对应的第二元素和第二元素对应的第二数值可以分别表示为probes2[1]=1,probes2[2]=1,probes2[3]=0;第三函数的函数标识对应的第二元素和第二元素对应的第二数值可以分别表示为probes2[4]=1。
待处理项目第一版本的字节码文件对应的第一探针数组为probes1[0,1,0,0,1,0],其中,第一版本和第一版本的上一个版本的区别在于第四函数修改为了第一函数。其中,第一函数的函数标识对应的第一元素和第一元素对应的第一数值可以分别表示为probes1[0]=0和probes1[1]=1;第二函数的函数标识对应的第一元素和第一元素对应的第一数值可以分别表示为probes1[2]=0、probes1[3]=0和probes1[4]=1;第三函数的函数标识对应的第一元素和第一元素对应的第一数值可以表示为probes1[5]=0。
对于第一版本和第一版本的上一个版本来说,第二函数和第三函数并未发生变化,第二函数和第三函数的代码覆盖情况可以合并。也就是说,第一探针数组中第二函数对应的元素可以与第二探针数组中第二函数对应的元素合并,第一探针数组中第三函数对应的元素可以与第三探针数组中第三函数对应的元素合并。
在第一探针数组中,第二函数的函数标识对应的第一元素和第一元素对应的第一数值可以分别表示为probes1[2]=0、probes1[3]=0和probes1[4]=1;在第二探针数组中,第二函数的函数标识对应的第二元素和第二元素对应的第二数值可以分别表示为probes2[1]=1,probes2[2]=1,probes2[3]=0;probes1[2]和probes2[1]对应于第二函数中的同一代码段,将probes1[2]的值0和probes2[1]的值1进行逻辑或运算,得到第三元素的值为1,将probes1[3]的值0和probes2[2]的值1进行逻辑或运算,得到第三元素的值为1,将probes1[4]的值1和probes2[3]的值0进行逻辑或运算,得到第三元素的值为1。
在第一探针数组中,第三函数的函数标识对应的第一元素和第一元素对应的第一数值可以分别表示为probes1[5]=0;在第二探针数组中,第三函数的函数标识对应的第二元素和第二元素对应的第二数值可以分别表示为probes2[4]=1;probes1[5]和probes2[4]对应于第二函数中的同一代码段,将probes1[5]的值0和probes2[4]的值1进行逻辑或运算,得到第三元素的值为1。
由第一函数的函数标识对应的第一元素的第一数值、第二函数的函数标识对应的第三元素的值和第三函数的函数标识对应的第三元素的值,组成第三探针数组,第三探针数组可以表示为probes3[0,1,1,1,1,1]。
在本申请实施例中,对函数标识对应的第一元素和第二元素进行逻辑或运算,只要待处理项目的任一版本对应函数的代码覆盖情况为已覆盖,则表明该函数已被覆盖,不需要再对该函数进行重复的测试,从而能够有效的提高测试效率。
需要说明的一点是,服务器对第一元素和第二元素进行合并,得到第三探针数组之后,还将已存储的第二探针数组更新为第三探针数组。服务器也可以在得到第三探针数组后,将第二探针数组更新为第三探针数组,并且,将第一探针数组更新为第三探针数组。
需要说明的另一点是,第二探针数组存在于第二覆盖率信息List<ExecFunction>b中,服务器得到第三探针数组后,将第二探针数组更新为第三探针数组,也即更新第二覆盖率信息List<ExecFunction>b。第一探针数组存在于第一覆盖率信息List<ExecFunction>a中,服务器得到第三探针数组后,还可以将第一探针数组更新为第三探针数组,也即更新第一覆盖率信息List<ExecFunction>a。
在本申请实施例中,服务器基于每个函数标识对应的元素对第一探针数组和第二探针数组进行合并,即服务器基于函数对代码覆盖情况进行合并,相较于基于类合并的方法,能够得到更精细的代码覆盖情况,从而基于代码覆盖情况,能够得到更完备的指标来衡量代码覆盖率,使得不同版本的代码覆盖率合并更有价值,进而能够提高合并后的代码覆盖率的准确性。
305、服务器根据第三探针数组,确定待处理项目的代码覆盖率。
在一种可能的实现方式中,服务器可以根据第三探针数组中1的值所占的比例,确定待处理项目的代码覆盖率。相应的,服务器根据第三探针数组,确定待处理项目的代码覆盖率的步骤可以为:服务器确定第三探针数组的元素的第一数量和第三探针数组中值为1的元素的第二数量;将第二数量和第一数量的比值确定为待处理项目的代码覆盖率。
在另一种可能的实现方式中,服务器可以借助代码覆盖率工具Jacoco,根据每个类对应的第三探针数组得到第二覆盖率文件,再根据第二覆盖率文件,生成待处理项目对应的第二覆盖率报告。相应的,服务器根据第三探针数组,确定待处理项目的代码覆盖率的步骤可以为:服务器根据第三探针数组和第三探针数组对应的字节码文件的字节码标识,生成第二覆盖率文件;根据第二覆盖率文件,确定第二覆盖率文件对应的源码文件的代码覆盖程度;根据源码文件的代码覆盖程度,对源码文件中的代码段进行标记,生成待处理项目对应的第二覆盖率报告,第二覆盖率报告用于展示待处理项目的代码覆盖率。
继续参见图4,第二探针数组存在于第一覆盖率信息List<ExecFunction>a中,服务器可以将第二探针数组更新为第三探针数组,也即服务器更新第一覆盖率信息List<ExecFunction>a;将更新后的第一覆盖率信息List<ExecFunction>a转换为第二覆盖率文件,也即List<ExecFunction>a转换为ec文件。相应的,服务器根据第三探针数组和第三探针数组对应的字节码文件的字节码标识,生成第二覆盖率文件的步骤可以为:服务器关联第三探针数组和第三探针数组对应的字节码标识,生成第二覆盖率文件。第二覆盖率文件包括待处理项目的至少一个类对应的至少一个第三探针数组。
继续参见图4,服务器生成第二覆盖率文件,根据第二覆盖率文件生成第二覆盖率报告,也即生成合并覆盖率报告。
第二覆盖率报告可以为源码文件的覆盖情况视图。服务器可以根据源码文件的代码覆盖程度,用不同的颜色对源码文件中的代码进行标记。相应的,服务器根据源码文件的代码覆盖程度,对源码文件中的代码段进行标记的步骤可以为:对于完全被执行的代码,用第一颜色标记该代码的背景;对于部分执行的代码,用第二颜色标记该代码的背景;对于未被执行的代码,用第三颜色标记该代码的背景。
服务器还可以将第二覆盖率文件、待处理项目的第一版本的源码文件和该待处理项目的第一版本的字节码文件输入到代码覆盖率工具Jacoco中,得到待处理项目对应的第二覆盖率报告。第二覆盖率报告用于展示待处理项目的总体的代码覆盖率。第二覆盖率报告为对待处理项目的所有版本的测试覆盖情况的总和。
服务器生成第二覆盖率报告后,将第二覆盖率报告发送给终端;终端接收服务器发送的第二覆盖率报告,显示该第二覆盖率报告。第二覆盖率报告可以为源码文件的覆盖情况视图,第二覆盖率报告包括源码文件中的被测代码和覆盖情况标记,终端显示被测代码和覆盖情况标记。例如,对于被测代码的每一行来说,如果某行代码没有指令被执行,该行代码未被覆盖,则该行代码的背景为红色;如果某行代码只有部分指令被执行,该行代码仅被部分覆盖,则该行代码的背景为黄色;如果某行代码中的所有指令都被执行,该行代码被完全覆盖,则该行代码的背景为绿色。
再如,对于被测代码的分支来说,如果某行代码中没有分支被覆盖,该行代码被红色菱形标记;如果某行代码的分支中只有部分被覆盖,该行代码被黄色菱形标记;如果某行代码的所有分支都被覆盖,该行代码被绿色菱形标记。
第二覆盖率报告还可以包括行覆盖率、类覆盖率、分支覆盖率、函数覆盖率、指令覆盖率和圈复杂度中的一种或多种指标。例如,行覆盖率可以为被测代码中的多行代码中被执行的代码的行数和被测代码的所有行数的比值,行覆盖率的比值可以用百分比的形式来表示。行覆盖率还可以用进度条的形式来表示,可以用进度条的长度表示被测代码的所有行数,进度条包括两种颜色,其中一种颜色在进度条中所占的比例表示行覆盖率。
在本申请实施例中,提供了用于展示待处理项目的总体的代码覆盖率的第二覆盖率报告,便于发现待处理项目测试任务的完成情况,进而完善测试方法和测试用例,提高测试的效率和质量,从而保证高质量高效率的软件交付。并且,能够根据得到的代码覆盖率,进行覆盖率卡点,对于上线前未达到标准的上线版本,不予上线,从而能够提高软件的上线版本的质量。
在本申请实施例中,基于待处理项目的第一版本对应的字节码文件,获取字节码文件对应的函数标识和第一探针数组;从第一探针数组中确定函数标识对应的第一元素;获取已存储的第二探针数组,从第二探针数组中确定函数标识对应的第二元素,第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的;对第一元素和第二元素进行合并,得到第三探针数组;根据第三探针数组,确定待处理项目的代码覆盖率。由于第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的,因此,只需要将第一版本对应的第一探针数组和第二探针数组进行一次合并,即可得到待处理项目总体的代码覆盖率,在实现不同版本的代码覆盖率合并的基础上,大大减少了合并的时间,提高了合并待处理项目不同版本的代码覆盖率的效率。
上述所有可选技术方案,可以采用任意结合形成本申请的可选实施例,在此不再一一赘述。
图5是本申请实施例提供的一种代码覆盖率处理装置的框图。参见图5,该装置包括:
获取模块501,被配置为基于待处理项目的第一版本对应的字节码文件,获取字节码文件对应的函数标识和第一探针数组;
确定模块502,被配置为从第一探针数组中确定函数标识对应的第一元素;
确定模块502,还被配置为获取已存储的第二探针数组,从第二探针数组中确定函数标识对应的第二元素,第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的;
合并模块503,被配置为对第一元素和第二元素进行合并,得到第三探针数组;
确定模块502,还被配置为根据第三探针数组,确定待处理项目的代码覆盖率。
在一种可能的实现方式中,合并模块503,还被配置为确定第一元素对应于函数标识对应的函数中的第一代码段,以及第二元素对应于函数标识对应的函数中的第二代码段;如果第一代码段和第二代码段是同一代码段,对第一元素对应的布尔类型的第一数值和第二元素对应的布尔类型的第二数值进行逻辑或运算,得到第三探针数组。
在另一种可能的实现方式中,确定模块502,还被配置为确定函数标识在第一探针数组中对应的下标范围;从第一探针数组中确定下标在下标范围内的第一元素,下标为区分第一探针数组中每个元素的数字编号。
在另一种可能的实现方式中,该装置还包括:
更新模块,被配置为将已存储的第二探针数组更新为第三探针数组。
在另一种可能的实现方式中,获取模块501,还被配置为获取第一版本对应的第一覆盖率文件;根据字节码文件和第一版本的第一覆盖率文件,提取字节码文件对应的函数标识和第一探针数组。
在另一种可能的实现方式中,获取模块501,还被配置为从字节码文件中确定函数对应的字节码片段;对字节码片段进行预设编码运算,得到函数的函数标识;解析第一覆盖率文件,得到字节码文件对应的第一探针数组。
在另一种可能的实现方式中,确定模块502,还被配置为根据第三探针数组和第三探针数组对应的字节码文件的字节码标识,生成第二覆盖率文件;根据第二覆盖率文件,确定第二覆盖率文件对应的源码文件的代码覆盖程度;根据源码文件的代码覆盖程度,对源码文件中的代码段进行标记,生成待处理项目对应的第二覆盖率报告,第二覆盖率报告用于展示待处理项目的代码覆盖率。
在另一种可能的实现方式中,该装置还包括:
存储模块,被配置为如果第一版本为待处理项目的初始版本,存储第一探针数组。
在本申请实施例中,基于待处理项目的第一版本对应的字节码文件,获取字节码文件对应的函数标识和第一探针数组;从第一探针数组中确定函数标识对应的第一元素;获取已存储的第二探针数组,从第二探针数组中确定函数标识对应的第二元素,第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的;对第一元素和第二元素进行合并,得到第三探针数组;根据第三探针数组,确定待处理项目的代码覆盖率。由于第二探针数组是由待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的,因此,只需要将第一版本对应的第一探针数组和第二探针数组进行一次合并,即可得到待处理项目总体的代码覆盖率,在实现不同版本的代码覆盖率合并的基础上,大大减少了合并的时间,提高了合并待处理项目不同版本的代码覆盖率的效率。
需要说明的是:上述实施例提供的代码覆盖率处理装置在处理代码覆盖率时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将服务器的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的代码覆盖率处理装置与代码覆盖率处理方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
图6是本申请实施例提供的一种服务器的框图,该服务器600可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(Central Processing Units,CPU)601和一个或一个以上的存储器602,其中,存储器602中存储有至少一条指令,至少一条指令由处理器601加载并执行以实现上述各个方法实施例提供的代码覆盖率处理方法。当然,该服务器还可以具有有线或无线网络接口、键盘以及输入输出接口等部件,以便进行输入输出,该服务器还可以包括其他用于实现设备功能的部件,在此不做赘述。
在示例性实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有至少一条指令,上述至少一条指令可由服务器中的处理器执行以完成上述实施例中的代码覆盖率处理方法。例如,计算机可读存储介质可以是ROM(Read-Only Memory,只读存储器)、RAM(Random Access Memory,随机存取存储器)、CD-ROM(Compact Disc Read-Only Memory,只读光盘)、磁带、软盘和光数据存储设备等。
本申请还提供了一种计算机程序产品,计算机程序产品包括一个或多个计算机程序,计算机程序被处理器执行时,用于实现上述各个方法实施例提供的代码覆盖率处理方法。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (10)
1.一种代码覆盖率处理方法,其特征在于,所述方法包括:
基于待处理项目的第一版本对应的字节码文件,获取所述字节码文件对应的函数标识和第一探针数组;
从所述第一探针数组中确定所述函数标识对应的第一元素;
获取已存储的第二探针数组,从所述第二探针数组中确定所述函数标识对应的第二元素,所述第二探针数组是由所述待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的;
对所述第一元素和所述第二元素进行合并,得到第三探针数组;
根据所述第三探针数组,确定所述待处理项目的代码覆盖率。
2.根据权利要求1所述的方法,其特征在于,所述对所述第一元素和所述第二元素进行合并,得到第三探针数组,包括:
确定所述第一元素对应于所述函数标识对应的函数中的第一代码段,以及所述第二元素对应于所述函数标识对应的函数中的第二代码段;
如果所述第一代码段和所述第二代码段是同一代码段,对所述第一元素对应的布尔类型的第一数值和所述第二元素对应的布尔类型的第二数值进行逻辑或运算,得到第三探针数组。
3.根据权利要求1所述的方法,其特征在于,所述从所述第一探针数组中确定所述函数标识对应的第一元素,包括:
确定所述函数标识在所述第一探针数组中对应的下标范围;
从所述第一探针数组中确定下标在所述下标范围内的第一元素,所述下标为区分所述第一探针数组中每个元素的数字编号。
4.根据权利要求1所述的方法,其特征在于,所述对所述第一元素和所述第二元素进行合并,得到第三探针数组之后,所述方法还包括:
将已存储的所述第二探针数组更新为所述第三探针数组。
5.根据权利要求1所述的方法,其特征在于,所述获取所述字节码文件对应的函数标识和第一探针数组,包括:
获取所述第一版本对应的第一覆盖率文件;
根据所述字节码文件和所述第一版本的第一覆盖率文件,提取所述字节码文件对应的函数标识和第一探针数组。
6.根据权利要求5所述的方法,其特征在于,所述根据所述字节码文件和所述第一版本的第一覆盖率文件,提取所述字节码文件对应的函数标识和第一探针数组,包括:
从所述字节码文件中确定函数对应的字节码片段;
对所述字节码片段进行预设编码运算,得到所述函数的函数标识;
解析所述第一覆盖率文件,得到所述字节码文件对应的第一探针数组。
7.根据权利要求1所述的方法,其特征在于,所述根据所述第三探针数组,确定所述待处理项目的代码覆盖率,包括:
根据所述第三探针数组和所述第三探针数组对应的字节码文件的字节码标识,生成第二覆盖率文件;
根据所述第二覆盖率文件,确定所述第二覆盖率文件对应的源码文件的代码覆盖程度;
根据所述源码文件的代码覆盖程度,对所述源码文件中的代码段进行标记,生成所述待处理项目对应的第二覆盖率报告,所述第二覆盖率报告用于展示所述待处理项目的代码覆盖率。
8.一种代码覆盖率处理装置,其特征在于,所述装置包括:
获取模块,被配置为基于待处理项目的第一版本对应的字节码文件,获取所述字节码文件对应的函数标识和第一探针数组;
确定模块,被配置为从所述第一探针数组中确定所述函数标识对应的第一元素;
所述确定模块,还被配置为获取已存储的第二探针数组,从所述第二探针数组中确定所述函数标识对应的第二元素,所述第二探针数组是由所述待处理项目历史的第二版本对应的字节码文件的探针数组合并得到的;
合并模块,被配置为对所述第一元素和所述第二元素进行合并,得到第三探针数组;
所述确定模块,还被配置为根据所述第三探针数组,确定所述待处理项目的代码覆盖率。
9.一种服务器,其特征在于,所述服务器包括处理器和存储器,所述存储器中存储有至少一条指令,所述至少一条指令由所述处理器加载并执行,以实现如权利要求1-7任一项所述的代码覆盖率处理方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有至少一条指令,所述至少一条指令由处理器加载并执行,以实现如权利要求1-7任一项所述的代码覆盖率处理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010031116.7A CN111290943A (zh) | 2020-01-13 | 2020-01-13 | 代码覆盖率处理方法、装置、服务器及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010031116.7A CN111290943A (zh) | 2020-01-13 | 2020-01-13 | 代码覆盖率处理方法、装置、服务器及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111290943A true CN111290943A (zh) | 2020-06-16 |
Family
ID=71029927
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010031116.7A Withdrawn CN111290943A (zh) | 2020-01-13 | 2020-01-13 | 代码覆盖率处理方法、装置、服务器及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111290943A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117349150A (zh) * | 2023-09-22 | 2024-01-05 | 乾升利信息技术(上海)有限公司 | 一种覆盖率数据处理方法、装置、电子设备及存储介质 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103699476A (zh) * | 2012-09-27 | 2014-04-02 | 腾讯科技(深圳)有限公司 | 覆盖率测试方法及系统 |
CN106326118A (zh) * | 2016-08-19 | 2017-01-11 | 东软集团股份有限公司 | 代码测试覆盖率确定方法和装置 |
CN106502901A (zh) * | 2016-10-24 | 2017-03-15 | 网易(杭州)网络有限公司 | 覆盖率检测方法、装置和设备 |
CN108519945A (zh) * | 2018-03-21 | 2018-09-11 | 腾讯科技(深圳)有限公司 | 覆盖率测试方法、装置及存储设备 |
CN108829593A (zh) * | 2018-06-05 | 2018-11-16 | 平安壹钱包电子商务有限公司 | 代码覆盖率计算分析方法、装置、设备及存储介质 |
CN109388566A (zh) * | 2018-09-27 | 2019-02-26 | 北京城市网邻信息技术有限公司 | 一种代码覆盖率分析方法、装置、设备及存储介质 |
US10402310B1 (en) * | 2018-03-30 | 2019-09-03 | Atlassian Pty Ltd | Systems and methods for reducing storage required for code coverage results |
CN110209568A (zh) * | 2018-04-24 | 2019-09-06 | 腾讯科技(深圳)有限公司 | 覆盖率测试方法、装置及存储设备 |
CN110245073A (zh) * | 2019-05-21 | 2019-09-17 | 北京字节跳动网络技术有限公司 | 终端代码覆盖率监测方法、系统、介质和电子设备 |
-
2020
- 2020-01-13 CN CN202010031116.7A patent/CN111290943A/zh not_active Withdrawn
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103699476A (zh) * | 2012-09-27 | 2014-04-02 | 腾讯科技(深圳)有限公司 | 覆盖率测试方法及系统 |
CN106326118A (zh) * | 2016-08-19 | 2017-01-11 | 东软集团股份有限公司 | 代码测试覆盖率确定方法和装置 |
CN106502901A (zh) * | 2016-10-24 | 2017-03-15 | 网易(杭州)网络有限公司 | 覆盖率检测方法、装置和设备 |
CN108519945A (zh) * | 2018-03-21 | 2018-09-11 | 腾讯科技(深圳)有限公司 | 覆盖率测试方法、装置及存储设备 |
US10402310B1 (en) * | 2018-03-30 | 2019-09-03 | Atlassian Pty Ltd | Systems and methods for reducing storage required for code coverage results |
CN110209568A (zh) * | 2018-04-24 | 2019-09-06 | 腾讯科技(深圳)有限公司 | 覆盖率测试方法、装置及存储设备 |
CN108829593A (zh) * | 2018-06-05 | 2018-11-16 | 平安壹钱包电子商务有限公司 | 代码覆盖率计算分析方法、装置、设备及存储介质 |
CN109388566A (zh) * | 2018-09-27 | 2019-02-26 | 北京城市网邻信息技术有限公司 | 一种代码覆盖率分析方法、装置、设备及存储介质 |
CN110245073A (zh) * | 2019-05-21 | 2019-09-17 | 北京字节跳动网络技术有限公司 | 终端代码覆盖率监测方法、系统、介质和电子设备 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117349150A (zh) * | 2023-09-22 | 2024-01-05 | 乾升利信息技术(上海)有限公司 | 一种覆盖率数据处理方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110414242A (zh) | 用于检测业务逻辑漏洞的方法、装置、设备及介质 | |
US20040044996A1 (en) | System and method for verifying installed software | |
US10437885B2 (en) | Graph modeling of applications for detection of duplicate modules | |
CN111158741B (zh) | 监控业务模块对第三方类库依赖关系变化的方法及装置 | |
CN109976999B (zh) | 测试用例覆盖率的度量方法和度量装置 | |
KR20190031030A (ko) | 바이너리 파일에 기초하여 오픈소스 소프트웨어 패키지를 식별하는 방법 및 시스템 | |
CN111475411A (zh) | 一种服务器问题检测方法、系统、终端及存储介质 | |
CN115185550A (zh) | 服务部署方法、装置、计算机设备及存储介质 | |
CN112328499A (zh) | 一种测试数据生成方法、装置、设备及介质 | |
CN110221933A (zh) | 代码缺陷辅助修复方法及系统 | |
CN105868956A (zh) | 一种数据处理方法及装置 | |
CN113688134B (zh) | 基于多维数据的可视化变量管理方法、系统及设备 | |
CN111290943A (zh) | 代码覆盖率处理方法、装置、服务器及存储介质 | |
Polese et al. | Adoption of third-party libraries in mobile apps: a case study on open-source Android applications | |
CN117009911A (zh) | 一种目标事件的异常判定方法、装置、介质及电子设备 | |
CN112346981A (zh) | 联调测试覆盖率检测方法及系统 | |
CN114879985B (zh) | 一种证书文件的安装方法、装置、设备及存储介质 | |
CN115576831A (zh) | 一种测试案例推荐方法、装置、设备及存储介质 | |
US20230086564A1 (en) | System and method for automatic discovery of candidate application programming interfaces and dependencies to be published | |
CN115687129A (zh) | 一种覆盖率报告生成方法、装置、存储介质和计算机设备 | |
CN113742208A (zh) | 一种软件检测方法、装置、设备及计算机可读存储介质 | |
CN113806231A (zh) | 一种代码覆盖率分析方法、装置、设备和介质 | |
CN117258303B (zh) | 一种模型对比方法及相关装置 | |
CN114510409A (zh) | 一种应用程序代码检测方法和计算机可读存储介质 | |
CN118445214B (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 | ||
WW01 | Invention patent application withdrawn after publication |
Application publication date: 20200616 |
|
WW01 | Invention patent application withdrawn after publication |