CN114546868A - 代码覆盖率测试方法、装置和电子设备 - Google Patents
代码覆盖率测试方法、装置和电子设备 Download PDFInfo
- Publication number
- CN114546868A CN114546868A CN202210179043.5A CN202210179043A CN114546868A CN 114546868 A CN114546868 A CN 114546868A CN 202210179043 A CN202210179043 A CN 202210179043A CN 114546868 A CN114546868 A CN 114546868A
- Authority
- CN
- China
- Prior art keywords
- code
- test
- test case
- tested
- information
- 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/3688—Test management for test execution, e.g. scheduling of test suites
-
- 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
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
技术领域
本申请涉及计算机技术领域,具体而言,涉及一种代码覆盖率测试方法、装置和电子设备。
背景技术
随着计算机技术的发展,企业对软件测试的范围和技术要求予以高度重视。软件测试对于软件开发过程的重要性不言而喻,如何衡量软件测试的质量成为了人们的关注点。而代码覆盖率测试是衡量软件质量的一个重要指标,也是衡量测试工作进展的重要指标。
测试覆盖率通过量化软件中哪些代码在测试中被执行过的概念来衡量测试的安全性。在实际测试过程中,并没有可完全覆盖所有场景的测试用例,但是测试人员可以通过测试代码覆盖率来评价测试的完全度是否达到了预期,进而有针对性的补充缺少的测试用例。对于具有较高可靠性和安全性要求的软件系统来说,通过统计代码覆盖率来提高测试的质量是必要且有效的重要手段。
然而现有常规的代码覆盖率测试方法中,主要应用在单元测试领域中,并且在测试效率上也存在不足。
发明内容
本申请的目的包括,例如,提供了一种代码覆盖率测试方法、装置和电子设备,其能够适用于接口测试和功能测试领域,且提高测试效率。
本申请的实施例可以这样实现:
第一方面,本申请提供一种代码覆盖率测试方法,所述方法包括:
获取待测试代码,在所述待测试代码中添加覆盖率参数以构建可执行的待测试代码,该可执行的待测试代码包含多个待测试块;
比对所述待测试代码与上一版本的代码之间的差异信息,根据所述差异信息对预先存储的映射关系和测试用例的信息进行更新,所述映射关系为代码与测试用例之间的映射关系;
针对每个所述待测试块,查询所述映射关系和各个测试用例的优先级信息,以确定所述待测试块的目标测试用例;
基于所述目标测试用例对所述待测试块进行测试得到测试结果,并根据所述测试结果获得代码覆盖率信息。
在可选的实施方式中,所述查询所述映射关系和各个测试用例的优先级信息,以确定所述待测试块的目标测试用例的步骤,包括:
查询所述映射关系,以确定与所述待测试块对应的多个测试用例;
根据所述多个测试用例中各所述测试用例的优先级信息,确定其中优先级最高的测试用例为所述待测试块的目标测试用例。在可选的实施方式中,所述映射关系包括第一映射表和第二映射表,所述第一映射表包括从测试用例的角度建立的测试用例与代码之间的映射关系,所述第二映射表包括从代码的角度建立的代码与测试用例之间的映射关系;
所述根据所述差异信息对预先存储的映射关系和测试用例的信息进行更新的步骤,包括:
在所述待测试代码相较于上一版本的代码存在删减的代码时,将所述第一映射表和第二映射表中所述删减的代码与映射的测试用例的映射关系删除,并将所述删减的代码对应的测试用例的信息删除;
在所述待测试代码相较于上一版本的代码存在新增的代码时,构建所述新增的代码映射的测试用例,并将所述新增的代码与映射的测试用例的映射关系添加至所述第一映射表和第二映射表中、对存储的测试用例的信息进行更新。
在可选的实施方式中,所述方法还包括预先获得测试用例的优先级信息,该步骤包括:
获得各个测试用例的测试结果集,所述测试结果集包括所述测试用例所覆盖的代码信息;
针对各所述测试用例,根据所述测试用例的测试结果集以及与其他测试用例的测试结果集之间的交集,确定所述测试用例的优先级信息。
在可选的实施方式中,所述方法还包括:
获得所述测试用例的测试结果集与其他各个测试用例的测试结果集之间的差集;
在所述测试用例与其他任一测试用例之间的差集为空时,将所述测试用例删除。
在可选的实施方式中,所述根据该测试用例的测试结果集以及与其他测试用例的测试结果集之间的交集,确定所述测试用例的优先级信息的步骤,包括:
获得所述测试用例的测试结果集中包含的所覆盖的代码的第一数量;
获得其他测试用例的测试结果集的并集,并获得所述测试用例的测试结果集与该并集之间的交集,获得该交集中所覆盖代码的第二数量;
根据所述第一数量和第二数量确定所述测试用例的优先级信息。
在可选的实施方式中,所述在所述待测试代码中添加覆盖率参数以构建可执行的待测试文件的步骤,包括:
在所述待测试代码中添加覆盖率参数,并进行预处理;
对预处理后的文件进行优化,生成汇编文件,并在所述汇编文件中进行插桩,在每个桩点插入汇编语句;
基于所述汇编文件生成包含二进制机器码的目标文件;
根据所述目标文件生成基本块文件和可执行的待测试文件。
在可选的实施方式中,所述方法还包括:
基于所述代码覆盖率信息生成可视图形化覆盖率报告。
第二方面,本申请提供一种代码覆盖率测试装置,所述装置包括:
获取模块,用于获取待测试代码,在所述待测试代码中添加覆盖率参数以构建可执行的待测试代码,该可执行的待测试代码包含多个待测试块;
更新模块,用于比对所述待测试代码与上一版本的代码之间的差异信息,根据所述差异信息对预先存储的映射关系和测试用例的信息进行更新,所述映射关系为代码与测试用例之间的映射关系;
查询模块,用于针对每个所述待测试块,查询所述映射关系和各个测试用例的优先级信息,以确定所述待测试块的目标测试用例;
测试模块,用于基于所述目标测试用例对所述待测试块进行测试得到测试结果,并根据所述测试结果获得代码覆盖率信息。
第三方面,本申请提供一种电子设备,包括一个或多个存储介质和一个或多个与存储介质通信的处理器,一个或多个存储介质存储有处理器可执行的机器可执行指令,当电子设备运行时,处理器执行所述机器可执行指令,以执行前述实施方式中任意一项所述的方法步骤。
本申请实施例的有益效果包括,例如:
本申请提供一种代码覆盖率测试方法、装置和电子设备,通过获得包含多个待测试块的待测试代码,在待测试代码中添加覆盖率参数以构建可执行的待测试文件。比对待测试块代码与上一版本的代码之间的差异信息,基于差异信息对预先存储的映射关系和测试用例的信息进行更新。针对各个待测试块,查询映射关系以及各个测试用例的优先级信息,确定待测试块的目标测试用例。再基于目标测试用例对待测试块进行测试得到测试结果,并根据测试结果获得代码覆盖率信息。该方案通过在待测试块中添加覆盖率参数以构建可执行的待测试文件,可以适用于接口测试和功能测试领域,并且在执行测试时基于优先级信息来确定测试用例以用于代码测试,可以提高测试效率。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本申请实施例提供的代码覆盖率测试方法的流程图;
图2为本申请实施例提供的代码覆盖率测试方法中,设置方法的流程图;
图3为图2中步骤S202包含的子步骤的流程图;
图4为本申请实施例提供的代码覆盖率测试方法中,冗余去除方法的流程图;
图5为图1中步骤S101包含的子步骤的流程图;
图6为本申请实施例中测试用例分配执行测试的示意图;
图7为本申请实施例提供的代码覆盖率测试方法的整体流程示意图;
图8为本申请实施例提供的电子设备的结构框图;
图9为本申请实施例提供的代码覆盖率测试装置的功能模块框图。
图标:110-存储介质;120-处理器;130-代码覆盖率测试装置;131-获取模块;132-更新模块;133-查询模块;134-测试模块;140-通信接口。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
在本申请的描述中,需要说明的是,若出现术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
需要说明的是,在不冲突的情况下,本申请的实施例中的特征可以相互结合。
请参阅图1,为本申请实施例提供的代码覆盖率测试方法的流程图,该代码覆盖率测试方法有关的流程所定义的方法步骤可以由电子设备所实现,该电子设备可以是单独的服务器,也可以是由多台服务器构成的服务器集群。下面将对图1所示的具体流程进行详细阐述。
S101,获取待测试代码,在所述待测试代码中添加覆盖率参数以构建可执行的待测试文件,该可执行的待测试文件包含多个待测试块。
S102,比对所述待测试代码与上一版本的代码之间的差异信息,根据所述差异信息对预先存储的映射关系和测试用例的信息进行更新,所述映射关系为代码与测试用例之间的映射关系。
S103,针对每个所述待测试块,查询预先存储的映射关系和各个测试用例的优先级信息,以确定所述待测试块的目标测试用例,所述映射关系为代码与测试用例之间的映射关系。
S104,基于所述目标测试用例对所述待测试块进行测试得到测试结果,并根据所述测试结果获得代码覆盖率信息。
本实施例所提供的测试方法可以对于Linux下的C/C++代码进行测试,并获得测试的代码覆盖率信息。在代码有所变更,例如发布了新版本的代码,或者是对代码有所修改等,可以触发对于代码的测试。
电子设备可以拉取待测试代码至本地,以执行测试流程。获取的待测试代码即为上述的如发布的新版本的代码或有所修改的代码。
本实施例中,针对待测试代码,可以通过GCC(GNU Compiler Collection,GNU编译器套件)内建代码覆盖工具以实现代码测试的覆盖率统计。本实施例中,在待测试代码中添加覆盖率参数以构建可执行的待测试文件,覆盖率参数可为编译器参数-fprofile-arcs-ftest-coverage。
待测试文件中包含多行代码,该多行代码可以划分为多个待测试块。电子设备中还预先存储有代码与测试用例之间的映射关系,以及各个测试用例的优先级信息。该映射关系和优先级信息为基于历史时段内进行代码测试时,代码和测试用例之间的对应关系所设置。其中,测试用例的优先级信息可以是按照测试用例所覆盖的代码等信息进行设置。
由上述可知,一般是在发布新版本的情况下触发测试,而新版本的代码与之前版本的代码相比一般有所更新,而预先存储的映射关系以及测试用例的信息是基于之前版本的代码获得的。
因此,为了适用于当前版本的代码的测试,本实施例中,在获得当前的待测试代码后,可以比对待测试代码与上一版本的代码之间的差异信息,根据差异信息对预先存储的映射关系和测试用例的信息进行更新。
针对当前待测试代码中的每个待测试块,基于预先存储的映射关系,则可以查找到与待测试块对应的测试用例。而各个待测试块,其对应的测试用例可以是一个或多个。在此基础上,基于预先存储的各个待测试块的优先级信息,可以从待测试块对应的测试用例中,选择出优先级较高的测试用例进行测试。
例如,可以查询映射关系,以确定与待测试块对应的多个测试用例,根据该多个测试用例中各个测试用例的优先级信息,确定其中优先级最高的测试用例为待测试块的目标测试用例。
在对待测试代码包含的各个待测试块完成测试后,可以基于测试结果获得代码覆盖率信息。测试结果可体现各个待测试块中的代码是否被执行测试、测试的结果是否满足预期结果、测试用例所具体覆盖的代码等信息。而基于测试结果获得的代码覆盖率信息,可以包括如测试用例覆盖的代码的数量、各个测试用例的覆盖情况之间的交集、并集、差集等信息。
本实施例所提供的代码覆盖率测试方法,可以利用测试用例对待测试代码进行测试以获得代码覆盖率信息,进而可以衡量软件测试的质量。其中,在待测试代码中添加覆盖率参数以构建可执行的待测试文件,基于待测试文件进行测试,可以适用于接口测试和功能测试领域。并且,在执行测试时基于优先级信息来确定测试用例以用于代码测试,可以提高测试效率。
在本实施例中,电子设备中预先存储的映射关系和优先级信息为预先基于代码的测试结果所设置。可选的,请参阅图2,本实施例所提供的代码覆盖率测试方法还包括预先获得测试用例的优先级信息的步骤,可以通过以下方式实现:
S201,获得各个测试用例的测试结果集,所述测试结果集包括所述测试用例所覆盖的代码信息。
S202,针对各所述测试用例,根据该测试用例的测试结果集以及与其他测试用例的测试结果集之间的交集,确定所述测试用例的优先级信息。
本实施例中,在预先进行代码的测试时,同样地,以所需测试的代码所包含的各个测试块为单位,选择与测试块中各个代码对应的测试用例对各个测试块进行测试。从各个测试用例的角度,可以获得各个测试用例的测试结果集。例如测试用例1的测试结果可以包含该测试用例所覆盖的代码信息,如代码1、代码2、代码3等,主要以代码行号进行统计。
如此,在各个测试用例均获得对应的测试结果集的情况下,由于测试用例的性能的差别,不同测试用例所覆盖的代码可能存在重叠的情况。在评价测试用例的优良时,一方面可以从测试用例自身所覆盖的代码情况来确定,另一方面,还可结合测试用例与其他测试用例的覆盖情况的重叠情况来确定。
如此,可以结合单个测试用例的局部以及多个测试用例的全局的角度实现对测试用例的优良的判断,有利于后续代码测试时的测试效率。
本实施例中,请参阅图3,作为一种可能的实现方式,上述步骤S202中确定测试用例的优先级信息时,可以通过以下方式实现:
S2021,获得所述测试用例的测试结果集中包含的所覆盖的代码的第一数量。
S2022,获得其他测试用例的测试结果集的并集,并获得所述测试用例的测试结果集与该并集之间的交集,获得该交集中所覆盖代码的第二数量。
S2023,根据所述第一数量和第二数量确定所述测试用例的优先级信息。
本实施例中,假设某个测试块M1中包含1000行有效代码,测试块M1对应的测试用例为TC1至TC50共50条测试用例。在执行测试之后,若前两条测试用例覆盖的代码的映射关系为TC1={2,3,5},TC2={1,2,3,4,5},其中,测试用例的测试结果集中包含的元素代表代码的行号。以测试用例TC1和测试用例TC2为例,则测试用例TC1的测试结果集中包含的所覆盖的代码的第一数量为3,测试用例TC2的测试结果集中包含的所覆盖的代码的第二数量为5。
测试用例TC1和测试用例TC2的测试结果集的交集为TC1∩TC2={2,3,5},该交集所覆盖代码的第二数量为3。若将测试用例TC3考虑在内,则可先获得测试用例TC2和测试用例TC3之间的并集,并获得测试用例TC1与该并集之间的交集,再获得该交集所覆盖代码的第二数量。
可以按上述方式,获得各个测试用例对应的第一数量和第二数量,统计多个测试用例的第一数量和第二数量并进行比较,进而确定各个测试用例的优先级信息。
作为一种可能的实现方式,在基于上述信息设置各个测试用例的优先级时,可以按优先级从高到低的顺序设置第一优先级High、第二优先级Normal和第三优先级Low。
在测试用例的测试结果集中所覆盖率的代码的第一数量大于或等于第一预设值,并且,测试用例对应的第二数量小于或等于设定值时,可以将该测试用例的优先级设置为第一优先级。其中,第一预设值可为10,设定值可为3。
在测试用例的测试结果集中所覆盖的代码的第一数量大于或等于第二预设值且小于第一预设值,并且,测试用例对应的第二数量小于或等于设定值时,可以将该测试用例的优先级设置为第二优先级。其中,第二预设值可为5。
而对于其他的不满足上述情况的测试用例,则可以将其优先级设置为第三优先级。
具体地,可以按以下公式进行相应设置:
上式中,TCi表示第i条测试用例所覆盖代码的测试结果集的表达式,crad(TCi)表示集合TCi中的元素的个数。
本实施例中,通过以上方式,从单个测试用例所覆盖的代码的规模,以及测试用例与其他测试用例之间的覆盖交集情况,来设置测试用例的优先级。
此外,考虑到多个测试用例中可能存在某些冗余的测试用例,这类测试用例对于测试结果的提高并无实际帮助,并且还会造成存储数据的冗余。基于此考虑,请参阅图4,本实施例所提供的代码覆盖率测试方法还可包括以下步骤:
S301,获得所述测试用例的测试结果集与其他各个测试用例的测试结果集之间的差集。
S302,在所述测试用例与其他任一测试用例之间的差集为空时,将所述测试用例删除。
本实施例中,以上述为例,对于测试用例TC1,该测试用例与测试用例TC2之间的差集为TC1-TC2={}。容易理解,由于测试用例TC1为测试用例TC2的子集,因此,其差集为空,可以确定测试用例TC1为冗余用例,可标记为Suspend。
因此,可以将冗余的测试用例TC1删除,以避免对数据存储造成的负担,并且避免对于后续执行测试用例时的干扰。
本实施例中,按照以上方式,在预先对代码利用测试用例执行测试后,可以确定各个测试用例的优先级信息,并且,可以获得代码与测试用例之间的映射关系。如此,在例如发布新版本或者是代码有所修改时,则可以基于映射关系以及优先级信息执行新一轮的测试。
本实施例中,代码与测试用例之间的映射关系可以包括第一映射表和第二映射表,第一映射表包括从测试用例的角度建立的测试用例与代码之间的映射关系,例如,第一映射表可如下表1所示。
表1第一映射表
而第二映射表包括从代码的角度建立的代码与测试用例之间的映射关系,第二映射表可如下表2所示。
表2第二映射表
在比对当前的待测试代码与上一版本的代码之间的差异信息时,一般地,其差异通常为新增代码、删减代码。
在一种可能的实现方式中,在待测试代码相较于上一版本的代码存在删减的代码时,将第一映射表和第二映射表中删减的代码与映射的测试用例的映射关系删除,并将删减的代码对应的测试用例的信息删除。
本实施例中,在代码有所删减时,可以查询第二映射表找到所删减的代码,并删除这一部分代码在第二映射表中所在行的数据。然后根据更新后的第二映射表中的数据,更新第一映射表中的数据。在第一映射表中,每个测试用例可能映射有多行代码。若删减的代码为某个测试用例所映射的多行代码中的其中一行或多个,则可以将该测试用例对应的该一行或多行代码删除。若某个测试用例映射的所有代码均删减,也即,该测试用于当前已无映射关系的代码,则可以将第一映射表中该测试用例删除。
本实施例中,测试用例的信息可保存在如下表3所示的测试用例表中。该测试用例表中记载有各个测试用例的版本、用例模块(具体测试用例)、用例编号、优先级、创建时间等。在按上述方式更新第一映射表、第二映射表中的数据后,基于更新后的数据对测试用例表中的数据进行更新。
表3测试用例表
此外,在另一种可能的实现方式中,在待测试代码相较于上一版本的代码存在新增的代码时,构建新增的代码映射的测试用例,并将新增的代码与映射的测试用例的映射关系添加至第一映射表和第二映射表中、对存储的测试用例的进行更新。
本实施例中,对于新增的代码所构建的测试用例,由于该新构建的测试用例在当前的待测试代码的测试时,应当被调用以执行测试。因此,可将该测试用例的优先级设置为第一优先级。如此,可以优先调取该测试用例执行测试。
对于新增的代码,可以在第二映射表中添加该新增的代码,并记录该新增的代码所映射的测试用例。并且,在第一映射表中添加该新构建的测试用例,并记录该新构建的测试用例所映射的代码。此外,将新构建的测试用例的信息添加至测试用例表中。
此外,当前的待测试代码相较于上一版本的代码可能存在代码修改的情况,代码修改可以理解为在上一版本的代码的基础上,既有删减的代码、也有新增的代码。因此,在相较于上一版本的代码存在修改时,可以结合上述两种方式对第一映射表、第二映射表、测试用例表进行更新。
本实施例中,在对预先存储的信息进行更新后,则可以基于更新后的信息查找用于执行当前的待测试代码的测试的测试用例,以进行测试。
请参阅图5,本实施例中,在上述步骤S101中,获取当前的待测试代码后,基于待测试代码构建可执行的待测试文件时,可以通过以下方式实现:
S1011,在所述待测试代码中添加覆盖率参数,并进行预处理。
S1012,对预处理后的文件进行优化,生成汇编文件,并在所述汇编文件中进行插桩,在每个桩点插入汇编语句。
S1013,基于所述汇编文件生成包含二进制机器码的目标文件。
S1014,根据所述目标文件生成基本块文件和可执行的待测试文件。
本实施例中,针对待测试代码进行预处理可以由预处理程序实现,当对一个源代码文件进行编译时,系统将自动引用预处理程序对源代码中的预处理部分作处理。例如,宏定义#define a b,预处理后就会把程序的a用b替换。
对于预处理后的文件可以进行文件语法检查,并对其中的源代码进行优化处理,生成汇编文件。例如,优化处理包括删除代码中无用的变量和一些注释等。并且,在生成的汇编文件的时候进行插桩,每个桩点插入汇编语句。其中,桩点也就是变量,内存中的一个格子,对应的代码执行一次,变量的值也就增加一次。
在汇编文件的基础上,产生得到二进制机器码的目标文件。实质上目标文件中存放的也是与源代码等效的机器语言代码。
在目标文件的基础上,生成基本块文件,基本块文件包含源代码的行号信息,以及插入的桩点信息。此外,基于目标文件还可生成可执行的待测试文件。生成的方式可以是将目标文件进行链接,例如将一个文件中引用的符号同另一个文件的定义连接起来,以构成一个统一的整体,得到操作系统可以执行的文件。在执行过程中之前插入的桩点会收集程序的执行信息。
在得到可执行的待测试文件的基础上,则可以按照上述的方式实现待测试文件中代码的测试。在该过程中,基于待测试文件执行测试后,可生成基本块跟踪文件,该基本块跟踪文件中包含桩点的统计信息。结合基本块跟踪文件和上述的基本块文件,可以得到行跟踪文件,该行跟踪文件可以理解为基本块跟踪文件的另一种表达。如此,可以得到源代码中各个待测试块的测试结果。而基于测试结果,可以统计得到测试用例的代码覆盖率信息。
本实施例中,在进行测试用例的执行时,同样地,可以将测试用例划分为多个用例块,可以指定地调取其中所需的用例块进行执行测试。例如,可如图6中所示的,将所有测试用例按照模块分配给测试团队成员。各个测试团队成员可以负责所分配到用例块的测试执行。基于各个测试团队成员执行测试后得到的行跟踪文件,并进行汇总得到整体的测试结果。
本实施例中,代码覆盖率测试的代码覆盖率信息可以包括行覆盖率、函数覆盖率、分支覆盖率等。代码覆盖率测试可根据各测试模块查看各自的模块覆盖率报告,通过分析单个代码覆盖率报告可获知模块测试用例是否存在设计缺陷。其中,行覆盖率又称语句覆盖率、段覆盖率、基本块覆盖率,就是度量被测代码中的每个可执行语句是否被执行到了;函数覆盖率,用于度量每个函或过程是否被调用;分支覆盖率,又称所有边界覆盖率、基本路径覆盖率、判定路径覆盖率,可用于度量程序中每一个判定的分支是否都被测试到了。
在测试执行结束后,可以将每一条测试用例对应的覆盖代码行号存入数据库中的第一映射表。通过查询该第一映射表中的数据,经过计算得到每一行代码被哪些测试用例执行过,然后将数据存入数据库中的第二映射表中。
在此基础上,可以基于代码覆盖率信息生成可视图形化覆盖率报告。可以便于相关人员一目了然的查看相关的代码覆盖率信息。
本实施例中,还可以将可视图形化覆盖率报告基于HTML的输出通过浏览器以清晰的图标形式呈现覆盖率统计结果。此外,还可以将代码覆盖率报告通过邮件形式发送给相关人员,相关人员可根据需求查询指定的测试块或者整体的代码覆盖率信息。
本实施例中,以待测试块的形式进行测试,代码覆盖率测试可以选择指定模块生成覆盖率数据,如此,在测试过程中,可以预先生成部分模块的覆盖率数据,而不必等所有用例执行完成再测试覆盖率,且不会影响其他模块代码的测试和覆盖率报告生成。
本实施例中,针对当前的待测试代码利用测试用例执行测试后得到的覆盖率信息,同样地,可以构建新的映射关系以及优先级信息,并进行保存。优先级的设置方式同上述的历史时段内的测试结果进行优先级设置相同,本实施例在此不作赘述。以便于后续再进行新的一轮版本的代码测试时,可以基于该更新的映射关系和优先级信息进行测试。并且,同样地,可以基于测试结果,对其中的冗余用例进行去除,以避免信息数据的冗余。
本实施例中,可以分析测试结果中每个测试用例执行过的代码行号和源代码,以判断哪些代码在测试中从未被执行过,进而补充相应的测试用例。
请结合参阅图7,以下将结合图7中所示流程,对本实施例所提供的代码覆盖率测试方法的整体流程进行介绍。
S401,在发布新版本或代码有所修改时,获取当前的待测试代码。
S402,在待测试代码中添加覆盖率参数构建可执行的待测试文件。
在该步骤中,覆盖率参数可为-fprofile-arcs-ftest-coverage,其中,-ftest-coverage会生成源码的基本块文件,其中包括重建基本块图和相应的块的源码的行号的信息,主要负责程序流图的重构。而-fprofile-arcs编译出的.so动态链接库在代码被执行完后,才会生成基本块跟踪文件,它主要包含每个基本块被执行计数相关联的信息。
S403,部署软件测试环境。
在该步骤中,部署测试环境主要包括部署如版本可执行文件与覆盖信息文件自动收集脚本。
S404,将待测试代码与上一版本的代码进行比对,获得差异信息。
S405,在待测试代码相较于上一版本的代码具有新增代码时,构建对应的测试用例。
S406,在待测试代码相较于上一版本的代码具有删减代码时,标记并删除该删减代码及映射的测试用例。
S407,选择需要执行的测试用例。
S408,在测试环境中基于选择的测试用例执行待测试文件的测试。
S409,在测试用例执行结束后,执行kill命令。
在该步骤中,主要是考虑到后台常驻进程中,测试用例执行完后的进程依然还在运行,则需跳转到进程并关闭进程。
S410,在所有测试用例执行结束后,生成基本块跟踪文件。
S411,结合基本块跟踪文件、基本块文件和源代码生成行跟踪文件,该行跟踪文件中包括每条测试用例对应的覆盖代码信息。
S412,基于测试用例的覆盖代码信息对包含测试用例与代码之间映射关系的第一映射表进行更新。
S413,基于覆盖代码信息和第一映射表对包含代码与测试用例之间映射关系的第二映射表进行更新。
S414,合并所有的行跟踪文件得到覆盖率数据,并转化为HTML格式的可视图形化覆盖率报告。
在该步骤中,覆盖率数据的格式可为:用例编号-覆盖代码模块名-覆盖代码行号。
S415,将可视图形化覆盖率报告以邮件形式进行发送。
S416,对覆盖率数据进行分析,去除冗余用例,补充未覆盖代码的用例。
S417,基于覆盖率数据对测试用例进行优先级设置。
S418,更新数据库中的测试用例表。
本实施例所提供的代码覆盖率测试方法,通过GCC的内建工具GCOV实现软件覆盖率版本构建编译,无需复杂操作,即可收集指定模块或者整体版本的代码覆盖率数据。便于实时查看模块代码的覆盖率统计情况,以分析代码存在的缺陷和测试用例存在的缺陷,方便提升代码质量和改进测试用例。
并且,通过测试用例的覆盖代码数据,生成代码-用例覆盖率映射表,便于对用例进行优先级分类和优化。针对不同版本测试,根据需求可以灵活的选择指定用例集,减少了重复测试、漏测情况,且提高了测试效率。
请参阅图8,为本申请实施例提供的电子设备的示例性组件示意图,该电子设备可以是单独的服务器,也可以由多台服务器构成的集群。该电子设备可包括存储介质110、处理器120、代码覆盖率测试装置130及通信接口140。本实施例中,存储介质110与处理器120均位于电子设备中且二者分离设置。然而,应当理解的是,存储介质110也可以是独立于电子设备之外,且可以由处理器120通过总线接口来访问。可替换地,存储介质110也可以集成到处理器120中,例如,可以是高速缓存和/或通用寄存器。
代码覆盖率测试装置130可以理解为上述电子设备,或电子设备的处理器120,也可以理解为独立于上述电子设备或处理器120之外的在电子设备控制下实现上述代码覆盖率测试方法的软件功能模块。
如图9所示,上述代码覆盖率测试装置130可以包括获取模块131、更新模块132、查询模块133和测试模块134。下面分别对该代码覆盖率测试装置130的各个功能模块的功能进行详细阐述。
获取模块131,用于获取待测试代码,在所述待测试代码中添加覆盖率参数以构建可执行的待测试文件,该可执行的待测试文件包含多个待测试块。
可以理解,该获取模块131可以用于执行上述步骤S101,关于该获取模块131的详细实现方式可以参照上述对步骤S101有关的内容。
更新模块132,用于比对所述待测试代码与上一版本的代码之间的差异信息,根据所述差异信息对预先存储的映射关系和测试用例的信息进行更新,所述映射关系为代码与测试用例之间的映射关系。
可以理解,该更新模块132可以用于执行上述步骤S102,关于该获取模块131的详细实现方式可以参照上述对步骤S102有关的内容。
查询模块133,用于针对每个所述待测试块,查询所述映射关系和各个测试用例的优先级信息,以确定所述待测试块的目标测试用例。
可以理解,该查询模块133可以用于执行上述步骤S103,关于该查询模块133的详细实现方式可以参照上述对步骤S103有关的内容。
测试模块134,用于基于所述目标测试用例对所述待测试块进行测试得到测试结果,并根据所述测试结果获得代码覆盖率信息。
可以理解,该测试模块134可以用于执行上述步骤S104,关于该测试模块134的详细实现方式可以参照上述对步骤S104有关的内容。
在一种可能的实施方式中,上述查询模块133可以用于:
查询所述映射关系,以确定与所述待测试块对应的多个测试用例;
根据所述多个测试用例中各所述测试用例的优先级信息,确定其中优先级最高的测试用例为所述待测试块的目标测试用例。
在一种可能的实施方式中,所述映射关系包括第一映射表和第二映射表,所述第一映射表包括从测试用例的角度建立的测试用例与代码之间的映射关系,所述第二映射表包括从代码的角度建立的代码与测试用例之间的映射关系,上述更新模块132可以用于:
在所述待测试代码相较于上一版本的代码存在删减的代码时,将所述第一映射表和第二映射表中所述删减的代码与映射的测试用例的映射关系删除,并将所述删减的代码对应的测试用例的信息删除;
在所述待测试代码相较于上一版本的代码存在新增的代码时,构建所述新增的代码映射的测试用例,并将所述新增的代码与映射的测试用例的映射关系添加至所述第一映射表和第二映射表中、对存储的测试用例的信息进行更新。
在一种可能的实施方式中,所述装置还包括设置模块,该设置模块可以用于:
获得各个测试用例的测试结果集,所述测试结果集包括所述测试用例所覆盖的代码信息;
针对各所述测试用例,根据该测试用例的测试结果集以及与其他测试用例的测试结果集之间的交集,确定所述测试用例的优先级信息。
在一种可能的实施方式中,所述装置还包括删除模块,该删除模块可以用于:
获得所述测试用例的测试结果集与其他各个测试用例的测试结果集之间的差集;
在所述测试用例与其他任一测试用例之间的差集为空时,将所述测试用例删除。
在一种可能的实施方式中,上述设置模块可以用于:
获得所述测试用例的测试结果集中包含的所覆盖的代码的第一数量;
获得其他测试用例的测试结果集的并集,并获得所述测试用例的测试结果集与该并集之间的交集,获得该交集中所覆盖代码的第二数量;
根据所述第一数量和第二数量确定所述测试用例的优先级信息。
在一种可能的实施方式中,上述获取模块131可以用于:
在所述待测试代码中添加覆盖率参数,并进行预处理;
对预处理后的文件进行优化,生成汇编文件,并在所述汇编文件中进行插桩,在每个桩点插入汇编语句;
基于所述汇编文件生成包含二进制机器码的目标文件;
根据所述目标文件生成基本块文件和可执行的待测试文件。
在一种可能的实施方式中,所述装置还可以包括生成模块,该生成模块可以用于:
基于所述代码覆盖率信息生成可视图形化覆盖率报告。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
进一步地,本申请实施例还提供一种计算机可读存储介质,计算机可读存储介质存储有机器可执行指令,机器可执行指令被执行时实现上述实施例提供的代码覆盖率测试方法。
具体地,该计算机可读存储介质能够为通用的存储介质,如移动磁盘、硬盘等,该计算机可读存储介质上的计算机程序被运行时,能够执行上述代码覆盖率测试方法。关于计算机可读存储介质中的及其可执行指令被运行时,所涉及的过程,可以参照上述方法实施例中的相关说明,这里不再详述。
综上所述,本申请实施例提供的代码覆盖率测试方法、装置和电子设备,通过获得包含多个待测试块的待测试代码,在待测试代码中添加覆盖率参数以构建可执行的待测试文件。比对待测试块代码与上一版本的代码之间的差异新,基于差异信息对预先存储的映射关系和测试用例的信息进行更新。针对各个待测试块,查询映射关系以及各个测试用例的优先级信息,确定待测试块的目标测试用例。再基于目标测试用例对待测试块进行测试得到测试结果,并根据测试结果获得代码覆盖率信息。该方案通过在待测试块中添加覆盖率参数以构建可执行的待测试文件,可以适用于接口测试和功能测试领域,并且在执行测试时基于优先级信息来确定测试用例以用于代码测试,可以提高测试效率。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。
Claims (10)
1.一种代码覆盖率测试方法,其特征在于,所述方法包括:
获取待测试代码,在所述待测试代码中添加覆盖率参数以构建可执行的待测试文件,该可执行的待测试文件包含多个待测试块;
比对所述待测试代码与上一版本的代码之间的差异信息,根据所述差异信息对预先存储的映射关系和测试用例的信息进行更新,所述映射关系为代码与测试用例之间的映射关系;
针对每个所述待测试块,查询所述映射关系和各个测试用例的优先级信息,以确定所述待测试块的目标测试用例;
基于所述目标测试用例对所述待测试块进行测试得到测试结果,并根据所述测试结果获得代码覆盖率信息。
2.根据权利要求1所述的代码覆盖率测试方法,其特征在于,所述查询所述映射关系和各个测试用例的优先级信息,以确定所述待测试块的目标测试用例的步骤,包括:
查询所述映射关系,以确定与所述待测试块对应的多个测试用例;
根据所述多个测试用例中各所述测试用例的优先级信息,确定其中优先级最高的测试用例为所述待测试块的目标测试用例。
3.根据权利要求1所述的代码覆盖率测试方法,其特征在于,所述映射关系包括第一映射表和第二映射表,所述第一映射表包括从测试用例的角度建立的测试用例与代码之间的映射关系,所述第二映射表包括从代码的角度建立的代码与测试用例之间的映射关系;
所述根据所述差异信息对预先存储的映射关系和测试用例的信息进行更新的步骤,包括:
在所述待测试代码相较于上一版本的代码存在删减的代码时,将所述第一映射表和第二映射表中所述删减的代码与映射的测试用例的映射关系删除,并将所述删减的代码对应的测试用例的信息删除;
在所述待测试代码相较于上一版本的代码存在新增的代码时,构建所述新增的代码映射的测试用例,并将所述新增的代码与映射的测试用例的映射关系添加至所述第一映射表和第二映射表中、对存储的测试用例的信息进行更新。
4.根据权利要求1所述的代码覆盖率测试方法,其特征在于,所述方法还包括预先获得测试用例的优先级信息,该步骤包括:
获得各个测试用例的测试结果集,所述测试结果集包括所述测试用例所覆盖的代码信息;
针对各所述测试用例,根据所述测试用例的测试结果集以及与其他测试用例的测试结果集之间的交集,确定所述测试用例的优先级信息。
5.根据权利要求4所述的代码覆盖率测试方法,其特征在于,所述方法还包括:
获得所述测试用例的测试结果集与其他各个测试用例的测试结果集之间的差集;
在所述测试用例与其他任一测试用例之间的差集为空时,将所述测试用例删除。
6.根据权利要求4所述的代码覆盖率测试方法,其特征在于,所述根据该测试用例的测试结果集以及与其他测试用例的测试结果集之间的交集,确定所述测试用例的优先级信息的步骤,包括:
获得所述测试用例的测试结果集中包含的所覆盖的代码的第一数量;
获得其他测试用例的测试结果集的并集,并获得所述测试用例的测试结果集与该并集之间的交集,获得该交集中所覆盖代码的第二数量;
根据所述第一数量和第二数量确定所述测试用例的优先级信息。
7.根据权利要求1所述的代码覆盖率测试方法,其特征在于,所述在所述待测试代码中添加覆盖率参数以构建可执行的待测试文件的步骤,包括:
在所述待测试代码中添加覆盖率参数,并进行预处理;
对预处理后的文件进行优化,生成汇编文件,并在所述汇编文件中进行插桩,在每个桩点插入汇编语句;
基于所述汇编文件生成包含二进制机器码的目标文件;
根据所述目标文件生成基本块文件和可执行的待测试文件。
8.根据权利要求1所述的代码覆盖率测试方法,其特征在于,所述方法还包括:
基于所述代码覆盖率信息生成可视图形化覆盖率报告。
9.一种代码覆盖率测试装置,其特征在于,所述装置包括:
获取模块,用于获取待测试代码,在所述待测试代码中添加覆盖率参数以构建可执行的待测试文件,该可执行的待测试文件包含多个待测试块;
更新模块,用于比对所述待测试代码与上一版本的代码之间的差异信息,根据所述差异信息对预先存储的映射关系和测试用例的信息进行更新,所述映射关系为代码与测试用例之间的映射关系;
查询模块,用于针对每个所述待测试块,查询所述映射关系和各个测试用例的优先级信息,以确定所述待测试块的目标测试用例;
测试模块,用于基于所述目标测试用例对所述待测试块进行测试得到测试结果,并根据所述测试结果获得代码覆盖率信息。
10.一种电子设备,其特征在于,包括一个或多个存储介质和一个或多个与存储介质通信的处理器,一个或多个存储介质存储有处理器可执行的机器可执行指令,当电子设备运行时,处理器执行所述机器可执行指令,以执行权利要求1-8中任意一项所述的方法步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210179043.5A CN114546868A (zh) | 2022-02-25 | 2022-02-25 | 代码覆盖率测试方法、装置和电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210179043.5A CN114546868A (zh) | 2022-02-25 | 2022-02-25 | 代码覆盖率测试方法、装置和电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114546868A true CN114546868A (zh) | 2022-05-27 |
Family
ID=81679160
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210179043.5A Pending CN114546868A (zh) | 2022-02-25 | 2022-02-25 | 代码覆盖率测试方法、装置和电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114546868A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115203064A (zh) * | 2022-09-19 | 2022-10-18 | 北京探境科技有限公司 | 代码检测方法、装置、计算机设备及可读存储介质 |
CN116610577A (zh) * | 2023-05-25 | 2023-08-18 | 成都融见软件科技有限公司 | 一种覆盖率获取方法 |
CN116627973A (zh) * | 2023-05-25 | 2023-08-22 | 成都融见软件科技有限公司 | 一种数据定位系统 |
CN116954745A (zh) * | 2023-05-25 | 2023-10-27 | 成都融见软件科技有限公司 | 一种目标文件部分加载系统 |
CN117171057A (zh) * | 2023-11-02 | 2023-12-05 | 沐曦集成电路(上海)有限公司 | 芯片软硬件联合仿真阶段的软件代码覆盖率确定系统 |
CN117667750A (zh) * | 2024-01-31 | 2024-03-08 | 北京纷扬科技有限责任公司 | 测试用例生成、测试方法、装置、计算机设备及存储介质 |
-
2022
- 2022-02-25 CN CN202210179043.5A patent/CN114546868A/zh active Pending
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115203064A (zh) * | 2022-09-19 | 2022-10-18 | 北京探境科技有限公司 | 代码检测方法、装置、计算机设备及可读存储介质 |
CN116610577A (zh) * | 2023-05-25 | 2023-08-18 | 成都融见软件科技有限公司 | 一种覆盖率获取方法 |
CN116627973A (zh) * | 2023-05-25 | 2023-08-22 | 成都融见软件科技有限公司 | 一种数据定位系统 |
CN116954745A (zh) * | 2023-05-25 | 2023-10-27 | 成都融见软件科技有限公司 | 一种目标文件部分加载系统 |
CN116610577B (zh) * | 2023-05-25 | 2024-01-26 | 成都融见软件科技有限公司 | 一种覆盖率获取方法 |
CN116954745B (zh) * | 2023-05-25 | 2024-02-09 | 成都融见软件科技有限公司 | 一种目标文件部分加载系统 |
CN116627973B (zh) * | 2023-05-25 | 2024-02-09 | 成都融见软件科技有限公司 | 一种数据定位系统 |
CN117171057A (zh) * | 2023-11-02 | 2023-12-05 | 沐曦集成电路(上海)有限公司 | 芯片软硬件联合仿真阶段的软件代码覆盖率确定系统 |
CN117171057B (zh) * | 2023-11-02 | 2024-01-26 | 沐曦集成电路(上海)有限公司 | 芯片软硬件联合仿真阶段的软件代码覆盖率确定系统 |
CN117667750A (zh) * | 2024-01-31 | 2024-03-08 | 北京纷扬科技有限责任公司 | 测试用例生成、测试方法、装置、计算机设备及存储介质 |
CN117667750B (zh) * | 2024-01-31 | 2024-05-14 | 北京纷扬科技有限责任公司 | 测试用例生成、测试方法、装置、计算机设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114546868A (zh) | 代码覆盖率测试方法、装置和电子设备 | |
Pfleeger et al. | A framework for software maintenance metrics | |
CN101739339B (zh) | 一种基于程序动态依赖关系的软件故障定位方法 | |
US7503037B2 (en) | System and method for identifying bugs in software source code, using information from code coverage tools and source control tools to determine bugs introduced within a time or edit interval | |
Morales et al. | On the use of developers’ context for automatic refactoring of software anti-patterns | |
Göde | Evolution of type-1 clones | |
Shi et al. | Integration testing of software product lines using compositional symbolic execution | |
CN110209568A (zh) | 覆盖率测试方法、装置及存储设备 | |
Maplesden et al. | Performance analysis for object-oriented software: A systematic mapping | |
JP2011248895A (ja) | ソフトウェアアプリケーションのプロファイリング方法及び装置 | |
US8418145B2 (en) | Simple method optimization | |
CN113568839A (zh) | 软件测试和统计测试覆盖率的方法、装置、设备及介质 | |
CN110704297A (zh) | 代码评审方法、装置、计算机设备及存储介质 | |
CN103186463B (zh) | 确定软件的测试范围的方法和系统 | |
CN111190814B (zh) | 软件测试用例的生成方法、装置、存储介质及终端 | |
CN115658452A (zh) | 埋点校验方法、埋点校验装置、可读存储介质、电子设备 | |
CN115658725A (zh) | 一种获取全量可直接执行的sql语句的方法及装置 | |
CN111966587A (zh) | 数据采集方法、装置和设备 | |
CN116991751B (zh) | 代码测试方法、装置、电子设备及存储介质 | |
Zheng et al. | Why do developers remove lambda expressions in Java? | |
Kauhanen et al. | Regression test selection tool for python in continuous integration process | |
Izsó et al. | MONDO-SAM: A Framework to Systematically Assess MDE Scalability. | |
Zhao et al. | A Large-Scale Empirical Study of Real-Life Performance Issues in Open Source Projects | |
Park et al. | Parallel programming and performance evaluation with the ursa tool family | |
Lind et al. | CompSize: Automated size estimation of embedded software components |
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 |