增量代码覆盖率测试方法及装置、存储介质、电子设备与流程

文档序号:25063576发布日期:2021-05-14 15:00阅读:115来源:国知局
增量代码覆盖率测试方法及装置、存储介质、电子设备与流程

1.本发明的实施方式涉及软件测试领域,更具体地,本发明的实施方式涉及一种增量代码覆盖率测试方法、增量代码覆盖率测试装置、计算机可读存储介质以及电子设备。


背景技术:

2.本部分旨在为权利要求书中陈述的本发明的实施方式提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。
3.增量代码覆盖率的测试,是指在代码发生变更的时候,执行增量代码覆盖率的统计任务。
4.具体来说,可以通过如下方式实现:可以在检测到代码变更后,执行全量单元测试用例;同时,由于单元测试用例的对象往往是单个方案,因此可以用覆盖到的方法个数除以总的方法个数,得到全量代码覆盖率报告,进而从全量代码覆盖率报告中得到增量代码的覆盖率。
5.但是,当代码数量较多时,执行全量单元测试用例耗时较长,会导致增量代码覆盖率测试效率较低。


技术实现要素:

6.但是,在一些技术中,一方面,由于需要执行全量单元测试用例,会使得测试用例的执行效率较低,进而导致增量代码覆盖率测试效率较低;另一方面,随着开发运维技术的提升,软件开发的发布频率较高,执行全量单元测试用例进而得到增量代码的覆盖率无法适用于软件高频率发布的场景;再一方面,通过从全量代码覆盖率报告中得到增量代码的覆盖率,实现的是行级代码的增量覆盖率,无法实现方法级的增量覆盖率。
7.因此在相关技术中,不能获取与被修改的目标对象关联的目标类,提取与目标类对应的增量单元测试用例并执行增量单元测试用例得到每个目标对象在所述增量单元测试用例中的所覆盖的代码行数,进而根据每个目标对象在增量单元测试用例中所覆盖的代码行数,对项目在对象层级上的增量覆盖率进行测试,这是非常令人烦恼的过程。
8.为此,非常需要一种改进的增量代码覆盖率测试方法、增量代码覆盖率测试装置、计算机可读存储介质以及电子设备,以使得可以直接在获取到源代码中被修改的目标对象时,从与项目对应的倒排索引库中,获取与目标对象关联的目标类,并提取与目标类对应的增量单元测试用例;执行增量单元测试用例,得到每个目标对象在增量单元测试用例中的所覆盖的代码行数;根据目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在增量单元测试用例中所覆盖的代码行数,对项目在对象层级上的增量覆盖率进行测试,避免了由于需要对全量单元测试用例进行全部执行进而使得测试用例的执行效率较低的问题,提高了增量单元测试用例的执行效率,进而提高了增量代码覆盖率的测试效率。
9.在本上下文中,本发明的实施方式期望提供一种增量代码覆盖率测试方法、增量代码覆盖率测试装置、计算机可读存储介质以及电子设备。
10.根据本公开的一个方面,提供一种增量代码覆盖率测试方法,包括:
11.解析项目的源代码,得到所述源代码中所包括的每个原始对象在所述源代码中的起止位置,并根据所述源代码的修改行号以及所述起止位置,获取所述源代码中被修改的目标对象;其中,所述原始对象以及所述目标对象包括函数或者java方法;
12.从与所述项目对应的倒排索引库中,获取与所述目标对象关联的目标类,并提取与所述目标类对应的增量单元测试用例;
13.执行所述增量单元测试用例,得到每个目标对象在所述增量单元测试用例中的所覆盖的代码行数;
14.根据所述目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数,对所述项目在对象层级上的增量覆盖率进行测试。
15.在本公开的一种示例性实施例中,所述增量代码覆盖率计算方法还包括:
16.遍历所述项目中的代码目录,得到所述项目中所包括的模块的路径结构;
17.根据所述路径结构对所述模块下包括的子代码文件进行解析,得到每一个模块中所包括的类,以及每一个类中所包括的原始对象;
18.根据所述模块、模块中所包括的类以及类中所包括的原始对象,生成所述倒排索引库,并将所述倒排索引库存储至搜索引擎中。
19.在本公开的一种示例性实施例中,从与所述项目对应的倒排索引库中,获取与所述目标对象关联的目标类,包括:
20.根据所述项目的项目名称以及目标类生成代码获取请求,并通过所述搜索引擎支持的接口将所述代码获取请求发送至所述搜索引擎;
21.接收所述搜索引擎响应所述代码获取请求,根据所述项目名称以及目标类从所述倒排索引库中查询到的与所述目标对象关联的目标类。
22.在本公开的一种示例性实施例中,根据所述源代码的修改行号以及所述起止位置,获取所述源代码中被修改的目标对象,包括:
23.根据差异比较命令获取所述源代码中所包括的每一个模块的修改行号;
24.根据每一个模块的修改行号以及每个原始对象在每个模块中的起始行号以及结束行号,获取每个模块中被修改的目标对象。
25.在本公开的一种示例性实施例中,提取与所述目标类对应的增量单元测试用例,包括:
26.确定与所述目标类对应的目标模块,并提取与所述目标模块对应的增量单元测试用例;其中,每一个目标模块对应多个增量单元测试用例。
27.在本公开的一种示例性实施例中,执行所述增量单元测试用例,得到每个目标对象在所述增量单元测试用例中的所覆盖的代码行数,包括:
28.根据所述增量单元测试用例生成增量用例集,并通过并发执行的方式执行所述增量用例集中的目标模块下的各所述增量单元测试用例,得到执行结果;
29.当所述执行结果为执行成功时,从所述执行结果中获取每个目标对象在所述增量单元测试用例中的所覆盖的代码行数。
30.在本公开的一种示例性实施例中,所述增量代码覆盖率测试方法还包括:
31.当所述执行结果为执行失败时,将执行失败的增量单元测试用例以及失败原因发送至代码审核平台,以使的所述项目的开发人员根据所述失败原因对所述执行失败的增量单元测试用例中所包括的目标对象进行修复。
32.在本公开的一种示例性实施例中,根据所述目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数,对所述项目在对象层级上的增量覆盖率进行测试,包括:
33.根据每个原始对象在所述源代码中的起止位置,计算每个目标对象所包括的代码行数;
34.对所述目标对象的数量以及每个目标对象所包括的代码行数进行求和运算,得到第一运算结果;
35.对所述目标对象的数量以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数进行求和运算,得到第二运算结果;
36.对所述第二运算结果以及第一运算结果进行求商运算,得到所述项目在对象层级上的增量覆盖率。
37.在本公开的一种示例性实施例中,所述增量代码覆盖率测试方法还包括:
38.将所述项目的方法级增量覆盖率发送至代码审核平台,以使得所述代码审核平台根据所述项目的方法级增量覆盖率,确定所述项目的增量代码测试是否处于通过状态。
39.根据本公开的一个方面,提供一种增量代码覆盖率测试装置,包括:
40.源代码解析模块,用于解析项目的源代码,得到所述源代码中所包括的每个原始对象在所述源代码中的起止位置,并根据所述源代码的修改行号以及所述起止位置,获取所述源代码中被修改的目标对象;其中,所述原始对象以及所述目标对象包括java方法或者函数;
41.增量用例提取模块,用于从与所述项目对应的倒排索引库中,获取与所述目标对象关联的目标类,并提取与所述目标类对应的增量单元测试用例;
42.增量用例执行模块,用于执行所述增量单元测试用例,得到每个目标对象在所述增量单元测试用例中的所覆盖的代码行数;
43.覆盖率测试模块,用于根据所述目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数,对所述项目在对象层级上的增量覆盖率进行测试。
44.在本公开的一种示例性实施例中,所述增量代码覆盖率计算装置还包括:
45.代码目录遍历模块,用于遍历所述项目中的代码目录,得到所述项目中所包括的模块的路径结构;
46.代码文件解析模块,用于根据所述路径结构对所述模块下包括的子代码文件进行解析,得到每一个模块中所包括的类,以及每一个类中所包括的原始对象;
47.倒排索引库生成模块,用于根据所述模块、模块中所包括的类以及类中所包括的原始对象,生成所述倒排索引库,并将所述倒排索引库存储至搜索引擎中。
48.在本公开的一种示例性实施例中,从与所述项目对应的倒排索引库中,获取与所述目标对象关联的目标类,包括:
49.根据所述项目的项目名称以及目标类生成代码获取请求,并通过所述搜索引擎支
持的接口将所述代码获取请求发送至所述搜索引擎;
50.接收所述搜索引擎响应所述代码获取请求,根据所述项目名称以及目标类从所述倒排索引库中查询到的与所述目标对象关联的目标类。
51.在本公开的一种示例性实施例中,根据所述源代码的修改行号以及所述起止位置,获取所述源代码中被修改的目标对象,包括:
52.根据差异比较命令获取所述源代码中所包括的每一个模块的修改行号;
53.根据每一个模块的修改行号以及每个原始对象在每个模块中的起始行号以及结束行号,获取每个模块中被修改的目标对象。
54.在本公开的一种示例性实施例中,提取与所述目标类对应的增量单元测试用例,包括:
55.确定与所述目标类对应的目标模块,并提取与所述目标模块对应的增量单元测试用例;其中,每一个目标模块对应多个增量单元测试用例。
56.在本公开的一种示例性实施例中,执行所述增量单元测试用例,得到每个目标对象在所述增量单元测试用例中的所覆盖的代码行数,包括:
57.根据所述增量单元测试用例生成增量用例集,并通过并发执行的方式执行所述增量用例集中的目标模块下的各所述增量单元测试用例,得到执行结果;
58.当所述执行结果为执行成功时,从所述执行结果中获取每个目标对象在所述增量单元测试用例中的所覆盖的代码行数。
59.在本公开的一种示例性实施例中,所述增量代码覆盖率测试装置还包括:
60.测试用例发送模块,用于当所述执行结果为执行失败时,将执行失败的增量单元测试用例以及失败原因发送至代码审核平台,以使的所述项目的开发人员根据所述失败原因对所述执行失败的增量单元测试用例中所包括的目标对象进行修复。
61.在本公开的一种示例性实施例中,根据所述目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数,对所述项目在对象层级上的增量覆盖率进行测试,包括:
62.根据每个原始对象在所述源代码中的起止位置,计算每个目标对象所包括的代码行数;
63.对所述目标对象的数量以及每个目标对象所包括的代码行数进行求和运算,得到第一运算结果;
64.对所述目标对象的数量以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数进行求和运算,得到第二运算结果;
65.对所述第二运算结果以及第一运算结果进行求商运算,得到所述项目在对象层级上的增量覆盖率。
66.在本公开的一种示例性实施例中,所述增量代码覆盖率测试装置还包括:
67.增量覆盖率发送模块,用于将所述项目的方法级增量覆盖率发送至代码审核平台,以使得所述代码审核平台根据所述项目的方法级增量覆盖率,确定所述项目的增量代码测试是否处于通过状态。
68.根据本公开的一个方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任意一项所述的增量代码覆盖率测试方法。
69.根据本公开的一个方面,提供一种电子设备,包括:
70.处理器;以及
71.存储器,用于存储所述处理器的可执行指令;
72.其中,所述处理器配置为经由执行所述可执行指令来执行上述任意一项所述的增量代码覆盖率测试方法。
73.根据本发明实施方式的增量代码覆盖率测试方法和增量代码覆盖率测试装置,可以解析项目的源代码,得到源代码中所包括的每个原始对象在源代码中的起止位置,并根据源代码的修改行号以及起止位置,获取源代码中被修改的目标对象;然后从与项目对应的倒排索引库中,获取与目标对象关联的目标类,并提取与目标类对应的增量单元测试用例;再执行增量单元测试用例,得到每个目标对象在增量单元测试用例中的所覆盖的代码行数;最后根据目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在增量单元测试用例中所覆盖的代码行数,对项目在对象层级上的增量覆盖率进行测试,而无需执行全量单元测试用例,从而显著地降低了执行测试用例所需要的时间成本,并且实现了方法级的增量覆盖率,为用户带来了更好的体验。
附图说明
74.通过参考附图阅读下文的详细描述,本发明示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本发明的若干实施方式,其中:
75.图1示意性地示出了根据本发明示例实施例的一种增量代码覆盖率测试方法的流程图;
76.图2示意性地示出了根据本发明示例实施例的一种增量代码覆盖率测试系统的框图;
77.图3示意性地示出了根据本发明示例实施例的一种增量方法级覆盖率计算系统的框图;
78.图4示意性地示出了根据本发明示例实施例的一种依赖分析模块的框图;
79.图5示意性地示出了根据本发明示例实施例的另一种增量代码覆盖率测试方法的流程图;
80.图6(a)示意性地示出了根据本发明示例实施例的一种正向代码调用链的示例图;
81.图6(b)示意性地示出了根据本发明示例实施例的一种倒排索引库的示例图;
82.图7示意性地示出了根据本发明示例实施例的一种通过多线程并发的对增量单元测试用例进行执行的场景示例图;
83.图8示意性地示出了根据本发明示例实施例的一种根据所述目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数,对所述项目在对象层级上的增量覆盖率进行测试的方法流程图;
84.图9示意性地示出了根据本发明示例实施例的一种增量代码覆盖率测试装置的框图;
85.图10示意性地示出了根据本发明示例实施例的一种用于实现上述增量代码覆盖率测试方法的计算机可读存储介质;
86.图11示意性地示出了根据本发明示例实施例的一种用于实现上述增量代码覆盖率测试方法的电子设备。
87.在附图中,相同或对应的标号表示相同或对应的部分。
具体实施方式
88.下面将参考若干示例性实施方式来描述本发明的原理和精神。应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本发明,而并非以任何方式限制本发明的范围。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
89.本领域技术人员知道,本发明的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。
90.根据本发明的实施方式,提出了一种增量代码覆盖率测试方法、增量代码覆盖率测试装置、计算机可读存储介质以及电子设备。
91.在本文中,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。
92.下面参考本发明的若干代表性实施方式,详细阐释本发明的原理和精神。
93.发明概述
94.本发明人发现,在一些增量代码覆盖率的测试方法中,一种是,在检测到代码变更后,执行全量单元测试,得到全量代码覆盖率报告。比对本次修改的代码,统计解析全量代码覆盖率报告,提取出行级增量代码覆盖率;另一种是,由于单元测试的对象往往是单个方案,可以用覆盖到的方法个数除以总的方法个数,进而得到具体的覆盖率。
95.但是,在第一种测试方法中,在代码审核场景下,具有如下几点缺点:
96.一方面,需要执行全量单元测试用例,全量执行一般耗时较长,大型项目代码量与单元测试都非常庞大,执行耗时尤其长;另一方面,随着开发运维技术的提升,软件开发需要不断提高开发、发布的频率;因此,代码审核场景需要一种快速生成增量覆盖率报告的方案,该方案无法满足代码审核的使用场景。
97.进一步的,上述两种方法均缺乏方法级增量行代码覆盖率,需要对修改的增量方法的覆盖情况做更加详细的统计。具体来说:
98.在第一种测试方法中,在代码审核场景,单元测试用例一般是针对java方法或函数进行测试,方法以及函数是测试的最小对象,其能统计行级增量覆盖率,但是没法针对单元测试进行方法级增量行代码覆盖率统计。一般来说,单元测试用例针对方法进行测试,方法作为一个独立个体实现一个功能,因此第一种测试方法的基于行的覆盖率统计没有实际意义。
99.在第二种测试方法中,只单纯的考虑修改的方法个数,该增量方法覆盖率不够全面。由于不同的方法包含的代码行数可能差别很大,比如有些方法只有一行代码,有些方法有100多行代码,进而会使得增量代码覆盖率的测试结果的准确率较低。
100.基于此,本发明的基本思想在于:一方面,通过解析项目的源代码,得到源代码中所包括的每个原始对象在源代码中的起止位置,并根据源代码的修改行号以及起止位置,
获取源代码中被修改的目标对象;然后从与项目对应的倒排索引库中,获取与目标对象关联的目标类,并提取与目标类对应的增量单元测试用例;再执行增量单元测试用例,得到每个目标对象在增量单元测试用例中的所覆盖的代码行数;最后根据目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在增量单元测试用例中所覆盖的代码行数,对项目在对象层级上的增量覆盖率进行测试;由于可以直接从倒排索引库中提取与目标对象关联的目标类,进而执行与目标类对应的增量单元测试用例,进而避免由于需要执行全量单元测试用例导致的耗时较长的问题,提高了测试用例的执行速度,进而提高了增量覆盖率的测试效率,进而使得该增量代码覆盖率测试方法可以适用于各种不同的测试场景;另一方面,由于可以根据目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在增量单元测试用例中所覆盖的代码行数,对项目在对象层级上的增量覆盖率进行测试,进而实现了方法级增量行代码覆盖率的测试。
101.在介绍了本发明的基本原理之后,下面具体介绍本发明的各种非限制性实施方式。
102.示例性方法
103.下面结合图1来描述根据本发明示例性实施方式的增量代码覆盖率测试方法,该方法可以运行于服务器、服务器集群或云服务器等;当然,本领域技术人员也可以根据需求在其他平台运行本发明的方法,本示例性实施例中对此不做特殊限定。参考图1所示,该增量代码覆盖率测试方法可以包括以下步骤:
104.步骤s110.解析项目的源代码,得到所述源代码中所包括的每个原始对象在所述源代码中的起止位置,并根据所述源代码的修改行号以及所述起止位置,获取所述源代码中被修改的目标对象;其中,所述原始对象以及所述目标对象包括函数或者java方法;
105.步骤s120.从与所述项目对应的倒排索引库中,获取与所述目标对象关联的目标类,并提取与所述目标类对应的增量单元测试用例;
106.步骤s130.执行所述增量单元测试用例,得到每个目标对象在所述增量单元测试用例中的所覆盖的代码行数;
107.步骤s140.根据所述目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数,对所述项目在对象层级上的增量覆盖率进行测试。
108.上述增量代码覆盖率测试方法中,通过解析项目的源代码,得到源代码中所包括的每个原始对象在源代码中的起止位置,并根据源代码的修改行号以及起止位置,获取源代码中被修改的目标对象;然后从与项目对应的倒排索引库中,获取与目标对象关联的目标类,并提取与目标类对应的增量单元测试用例;再执行增量单元测试用例,得到每个目标对象在增量单元测试用例中的所覆盖的代码行数;最后根据目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在增量单元测试用例中所覆盖的代码行数,对项目在对象层级上的增量覆盖率进行测试,而无需执行全量单元测试用例,从而显著地降低了执行测试用例所需要的时间成本,并且实现了方法级的增量覆盖率,为用户带来了更好的体验。
109.以下,将结合附图对本公开的增量代码覆盖率测试方法中所记载的各步骤进行详细的解释以及说明。
110.首先,对本公开所涉及的名词进行解释以及说明。
111.cpu:central processing unit,计算机的中央处理器,作为计算机系统的运算和控制核心,是计算器的核心计算资源。
112.内存:计算机的内部存储,具有快速随机读写的特点,是计算机的核心存储资源。
113.代码审核:软件开发在提交修改代码后,审核人员通过查阅其代码修改内容、代码覆盖率报告、静态代码扫描报告等,确定是否接受本次提交的代码。
114.代码覆盖率:软件领域一种衡量代码测试情况的方法,测试用例覆盖到的行数除以代码整体行数就是整体的代码行覆盖率。当然,以此类推,还有方法覆盖率、方法行级覆盖率。
115.devops:dev(开发)和ops(运维)两个概念的组合,强调高效的更快、更频繁的交付更稳定的软件产品。
116.java:一种解释性、编译性结合的编程语言,通过运行在java虚拟机上实现跨平台特点。
117.java方法:java语言的代码逻辑块,java方法(java function)对应其他语言的函数。方法与方法之间可以相互调用,形成方法调用链。
118.phabricator:代码审核平台,支持与git仓库同步代码。
119.其次,对本发明的发明目的进行解释以及说明。
120.具体的,本发明要解决的技术问题是:增量覆盖率执行速度太慢,缺乏方法级代码覆盖率的统计方法。其具体的发明目的可以包括下面几个方面:
121.一方面,增量覆盖率执行速度太慢。具体的,由于需要执行全量单元测试用例,因此在大规模软件项目中,且单元测试数据量较多时,每执行一次增量覆盖率统计,耗时都很长;并且,无法满足代码审查的使用场景。
122.另一方面,本方案提取与本次修改相关的单元测试用例,只执行这部分与本次修改相关的测试用例,达到缩减用例执行的耗时的目标。并且,本公开可以通过倒排索引库提取关联单元测试用例,保证了所提取到的测试用例的精简性,同时也保证了与本次修改代码相关联的测试用例都要覆盖到,保证了全局影响的可控性。
123.再一方面,由于一个方法是一段独立的逻辑代码块,单元测试都是针对方法进行测试。因此,本公开在代码提交审查场景下,可以实现针对增量方法级的行覆盖率进行测试,进而更加具有实际的使用价值。
124.进一步的,对本公开的增量代码覆盖率测试系统进行解释以及说明。具体的,参考图2所示,该增量代码覆盖率测试系统可以包括增量方法级覆盖率计算系统210、代码审核平台220以及文件服务器230,增量方法级覆盖率计算系统分别与代码审核平台以及文件服务器网络连接,同时,代码审核平台与文件服务器也通过网络进行连接。
125.其中,代码审核平台用于对测试结果进行发布,以便于项目开发人员以及审核人员可以通过该平台对测试结果进行查看;当然,代码审核平台还可以用于对执行失败的增量单元测试用例进行发布,以便于项目开发人员对该测试用例进行调试;文件服务器用于对增量单元测试用例的执行结果进行存储。当然,该增量代码覆盖率计算系统中还可以包括搜索引擎240,该搜索引擎可以与增量方法级覆盖率计算系统网络连接,用于对倒排索引库进行存储,以便于服务器可以通过http接口对该倒排索引库中所包括的类进行查询。
126.以下,将结合图3对增量方法级覆盖率计算系统210进行进一步的解释以及说明。具体的,该增量方法级覆盖率计算系统可以用于执行本公开所记载的增量代码覆盖率测试方式;参考图3所示,该增量方法级覆盖率计算系统可以包括依赖分析模块301、增量用例提取模块302、增量用例执行模块303以及增量方法级覆盖率提取模块304。
127.其中,依赖分析模块301可以用于:通过构建整体项目中方法调用倒排索引,通过被修改的方法查询到调用该方法的所有类和模块,根据依赖分析,提取出与本次代码修改关联的增量测试用例,直接执行该增量测试用例,缩短用例的执行时间,从而提高覆盖率统计效率;其中,参考图4所示,该依赖分析模块301具体可以包括代码扫描模块401、方法解析模块402以及依赖查询模块403,各模块所起的作用将在下文进行详细的描述。
128.增量用例提取模块302可以用于:针对方法级的增量覆盖率,解析代码源码并分析方法在每个代码文件的分布详情,有的方法名称相同,参数不同。因此,本公开需要解析代码源码,精确统计每个方法的起始、结束行号。git diff命令获取每个代码文件修改的行号,通过这些修改的行号,找到被修改的方法。增量用例提取模块解析出所有被修改的方法,再去请求依赖分析模块的依赖分析查询子模块,查询到哪些代码文件调用了这些修改的方法。通过这些关联的代码文件,找出对应的单元测试用例(java项目中一般一个代码文件对于一个单元测试类文件)。
129.增量用例执行模块303可以用于:根据依赖分析模块提取出的增量测试用例,通过mvn test命令指定需要执行的具体单元测试用例,实现增量用例执行。当然,maven项目(java项目构建系统)需要配置jacoco插件,mvn test执行完成后生成代码覆盖率详情,也即每个方法在增量单元测试用例中的所覆盖的代码行数。
130.增量方法级行代码覆盖率提取模块304:如上所述,增量用例提取模块计算得到哪些方法被修改了,增量用例执行模块执行测试用例获取jacoco覆盖率统计结果,增量方法级覆盖率提取模块综合两者结果,提取出增量方法级覆盖率,然后把增量覆盖率结果发送回phabricator平台,同时将jacoco报告文件存储到web文件服务器保存。
131.以下,将结合图2、图3以及图4,对步骤s110

步骤s140进行解释以及说明。
132.在步骤s110中,解析项目的源代码,得到所述源代码中所包括的每个原始对象在所述源代码中的起止位置,并根据所述源代码的修改行号以及所述起止位置,获取所述源代码中被修改的目标对象;其中,所述原始对象以及所述目标对象包括函数或者java方法。
133.在本示例实施例中,增量用例提取模块针对方法级的增量覆盖率,可以通过解析代码源码并分析方法在每个代码文件的分布详情,因此,首先需对项目的代码源码进行解析,以精确统计每个方法(原对象)在源代码中的起始、结束行号(起止位置);然后,在根据源代码的修改行号以及起止位置,获取源代码中修改的目标对象。具体的可以包括:首先,根据差异比较命令获取所述源代码中所包括的每一个模块的修改行号;其次,根据每一个模块的修改行号以及每个原始对象在每个模块中的起始行号以及结束行号,获取每个模块中被修改的目标对象。
134.详细而言,首先,git diff(差异比较)命令获取每个代码文件(模块)修改的行号,通过这些修改的行号,找到被修改的方法。具体来说,通过如下命令获取每个代码文件变更的行号:
135.git diff
‑‑
no

ext

diff
‑‑
unified=0
‑‑
exit

code

a
‑‑
no

prefix。
136.其次,通过解析代码文件每个方法的起始、结束行号,结合这个代码文件变更的行号,则可以找出改代码文件哪些方法被修改了,进而得到上述目标对象。
137.在步骤s120中,从与所述项目对应的倒排索引库中,获取与所述目标对象关联的目标类,并提取与所述目标类对应的增量单元测试用例。
138.在本示例实施例中,为了获取到与目标对象关联的目标类,首先需要生成项目的倒排索引库。具体的,参考图5所示,该增量代码覆盖率计算方法还可以包括步骤s510

步骤s530。其中:
139.在步骤s510中,遍历所述项目中的代码目录,得到所述项目中所包括的模块的路径结构;
140.在步骤s520中,根据所述路径结构对所述模块下包括的子代码文件进行解析,得到每一个模块中所包括的类,以及每一个类中所包括的原始对象;
141.在步骤s530中,根据所述模块、模块中所包括的类以及类中所包括的原始对象,生成所述倒排索引库,并将所述倒排索引库存储至搜索引擎中。
142.以下,将对步骤s510

步骤s530进行解释以及说明。具体的,继续参考图4所示,当代码仓库404发生代码变更时,代码扫描模块401会将变更分支代码拉取到本地,将项目中的代码目录递归遍历,获取所有的代码路径结构,并针对每个模块的每个路径下的子代码文件进行扫描;进一步的,方法解析模块402对每个子代码文件进行解析,分析每个子代码文件(模块)内调用了哪些类的哪些方法,并将这些调用情况存储倒排索引库405中。
143.具体的,参考图6(a)所示,假设在module模块a中,account类代码文件中调用了user类中的adduser方法,则在倒排索引库图6(b)中插入一条记录:user.java#adduser

>{modulea.account类},在模块b中check类代码文件中也调用了user类中的adduser方法,则在倒排索引库中再插入一条记录:user.java#adduser

>{modulea.account类、moduleb.check类};进而,当某次提交的代码审查中,user文件中adduser方法被修改了,即可通过该索引关系可以直接查询到关联的类;最后,当得到倒排索引库以后,可以将该倒排索引库存储至搜索引擎中,该搜索引擎可以是elasticsearch分布式搜索引擎,也可以其他搜索引擎,例如可以是kibana、beats和logstash等等,本示例对此不做特殊限制。
144.进一步的,当得到倒排索引库以后,即可从倒排索引库中获取与目标对象关联的目标类。具体的可以包括:首先,根据所述项目的项目名称以及目标类生成代码获取请求,并通过所述搜索引擎支持的接口将所述代码获取请求发送至所述搜索引擎;其次,接收所述搜索引擎响应所述代码获取请求,根据所述项目名称以及目标类从所述倒排索引库中查询到的与所述目标对象关联的目标类。例如,依赖查询模块403对外提供查询接口,该查询接口可以使用http接口实现,也可以通过远程调用接口实现,本示例对此不做特殊限制。并且,在具体查询的过程中,入参是被修改的方法,出参是调用该方法的所有代码集合,也即目标类。
145.最后,当得到目标类以后,可以提取与所述目标类对应的增量单元测试用例。具体的可以包括:确定与所述目标类对应的目标模块,并提取与所述目标模块对应的增量单元测试用例;其中,每一个目标模块对应多个增量单元测试用例。详细而言,增量用例提取模块解析出所有被修改的方法,则去请求依赖分析模块的依赖分析查询子模块,查询到哪些代码文件调用了这些修改的方法,涉及项目中的哪些module模块。通过这些关联的代码文
件,找出其对应的单元测试用例(java项目中一般一个代码文件对应一个单元测试类文件,比如user.java对于usertest.java单元测试类文件),即可得到上述增量单元测试用例。
146.在步骤s130中,执行所述增量单元测试用例,得到每个目标对象在所述增量单元测试用例中的所覆盖的代码行数。
147.在本示例实施例中,首先,根据所述增量单元测试用例生成增量用例集,并通过并发执行的方式执行所述增量用例集中的目标模块下的各所述增量单元测试用例,得到执行结果;其次,当所述执行结果为执行成功时,从所述执行结果中获取每个目标对象在所述增量单元测试用例中的所覆盖的代码行数。
148.进一步的,当所述执行结果为执行失败时,将执行失败的增量单元测试用例以及失败原因发送至代码审核平台,以使的所述项目的开发人员根据所述失败原因对所述执行失败的增量单元测试用例中所包括的目标对象进行修复。
149.具体的,增量用例执行模块根据用增量用例提取模块提取出的增量测试用例,通过mvn test命令指定需要执行的具体单元测试用例,实现增量用例执行。具体的执行过程可以包括:首先,获取增量用例提取模块提取出的增量用例集,该测试集按照项目子模块分类,每个模块下面包含若干单元测试用例,这些增量测试集都是与本次提交相关联的用例,不关联的不会提取出来;其次,并发多个线程,进入每个关联的子模块的目录下,执行该模块下的增量单元测试用例;其中,并发执行可以加速执行速度,同时只执行与本次修改的增量代码相关的用例,大大缩减了执行用例的时间,具体的测试用例执行场景图可以参考图7所示;进一步的,记录下每个模块单元测试用例的执行情况,如果有一些用例执行失败,需要记录原因并提交回phabricator代码审核平台,以使得开发人员根据错误提示,修复相关问题后再次提交审核,进而避免由于测试用例执行失败不能对目标对象在增量单元测试用例中所覆盖的代码行数进行计算,以使得增量覆盖率测试结果的准确率较低的问题。
150.在步骤s140中,根据所述目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数,对所述项目在对象层级上的增量覆盖率进行测试。
151.在本示例实施例中,参考图8所示,根据所述目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数,对所述项目在对象层级上的增量覆盖率进行测试,可以包括步骤s810

步骤s840。其中:
152.在步骤s810中,根据每个原始对象在所述源代码中的起止位置,计算每个目标对象所包括的代码行数;
153.在步骤s820中,对所述目标对象的数量以及每个目标对象所包括的代码行数进行求和运算,得到第一运算结果;
154.在步骤s830中,对所述目标对象的数量以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数进行求和运算,得到第二运算结果;
155.在步骤s840中,对所述第二运算结果以及第一运算结果进行求商运算,得到所述项目在对象层级上的增量覆盖率。
156.以下,将对步骤s810

步骤s840进行解释以及说明。具体的,增量用例提取模块计算得到哪些方法被修改了,增量用例执行模块执行测试用例获取jacoco覆盖率统计结果,增量方法级覆盖率提取模块综合两者结果,提取出增量方法级覆盖率,然后把增量覆盖率
结果发送回phabricator平台,同时将jacoco报告文件存储到web文件服务器保存。
157.其中,项目在对象层级上的增量覆盖率的具体计算过程具体可以如下公式(1)所示。假设本次修改的代码行数为x,一共修改了m个方法,每个方法的代码行数是l(i),每个方法覆盖到的代码行数是c(i),其中i等于1到m的正整数。那么,方法级增量覆盖率r的统计可以用如下公式(1)概括:
[0158][0159]
此处需要进一步补充说明的是,在对增量单元测试用例执行的过程中,针对每一行代码都运行了至少一次,因此在运行的过程中,即可得到每个方法在每个增量单元测试用例中所覆盖得到的代码行数;另外,由于在对源代码的解析过程中得到了每个方法在源代码中的起止位置,因此可以得到每个方法所包括的代码行数。基于此可以得知,l(i)是每个方法在源代码中所包括的行数,c(i)是每个方法在每个增量单元测试用例中所覆盖的行数。
[0160]
进一步的,当得到方法级增量覆盖率以后,可以将所述项目的方法级增量覆盖率发送至代码审核平台,以使得所述代码审核平台根据所述项目的方法级增量覆盖率,确定所述项目的增量代码测试是否处于通过状态。例如,可以将该方法级增量覆盖率的结果作为留言提交回phabricator代码审核平台,同时将jacoco原始覆盖率报告上传到web文件服务器。代码开发人员和审核人员,可以通过phabricator代码审核平台的覆盖率审核结果,直接查看整体覆盖率情况,也可以点击查看具体哪些行覆盖了,哪些没有被覆盖。
[0161]
至此,可以得出,本申请所提出的一种快速方法级增量覆盖率统计方案,应用在代码审核场景下,过依赖分析模块结合倒排索引,快速查询方法被调用的情况;同时,增量用例提取模块解析出所有被修改的方法,请求依赖分析模块的依赖分析查询子模块,查询到哪些代码文件调用了这些修改的方法,涉及项目中的那些module模块。通过该方法,能够大大提高增量覆盖率执行速度,通过依赖分析模块、增量用例提取模块,分析出本次修改的代码相关的测试用例,并发执行这些测试用例,加速执行速度。方法级代码覆盖率的统计,更加契合代码审核场景下的单元测试覆盖率指标。
[0162]
示例性装置
[0163]
在介绍了本发明示例性实施方式的介质之后,接下来,参考图9对本发明示例性实施方式的增量代码覆盖率测试装置进行解释。
[0164]
参考图9所示,该增量代码覆盖率测试装置可以包括源代码解析模块910、增量用例提取模块920、增量用例执行模块930以及覆盖率测试模块940。其中:
[0165]
源代码解析模块910可以用于解析项目的源代码,得到所述源代码中所包括的每个原始对象在所述源代码中的起止位置,并根据所述源代码的修改行号以及所述起止位置,获取所述源代码中被修改的目标对象;其中,所述原始对象以及所述目标对象包括java方法或者函数;
[0166]
增量用例提取模块920可以用于从与所述项目对应的倒排索引库中,获取与所述目标对象关联的目标类,并提取与所述目标类对应的增量单元测试用例;
[0167]
增量用例执行模块930可以用于执行所述增量单元测试用例,得到每个目标对象
在所述增量单元测试用例中的所覆盖的代码行数;
[0168]
覆盖率测试模块940可以用于根据所述目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数,对所述项目在对象层级上的增量覆盖率进行测试。
[0169]
在本公开的一种示例性实施例中,所述增量代码覆盖率计算装置还包括:
[0170]
代码目录遍历模块,用于遍历所述项目中的代码目录,得到所述项目中所包括的模块的路径结构;
[0171]
代码文件解析模块,用于根据所述路径结构对所述模块下包括的子代码文件进行解析,得到每一个模块中所包括的类,以及每一个类中所包括的原始对象;
[0172]
倒排索引库生成模块,用于根据所述模块、模块中所包括的类以及类中所包括的原始对象,生成所述倒排索引库,并将所述倒排索引库存储至搜索引擎中。
[0173]
在本公开的一种示例性实施例中,从与所述项目对应的倒排索引库中,获取与所述目标对象关联的目标类,包括:
[0174]
根据所述项目的项目名称以及目标类生成代码获取请求,并通过所述搜索引擎支持的接口将所述代码获取请求发送至所述搜索引擎;
[0175]
接收所述搜索引擎响应所述代码获取请求,根据所述项目名称以及目标类从所述倒排索引库中查询到的与所述目标对象关联的目标类。
[0176]
在本公开的一种示例性实施例中,根据所述源代码的修改行号以及所述起止位置,获取所述源代码中被修改的目标对象,包括:
[0177]
根据差异比较命令获取所述源代码中所包括的每一个模块的修改行号;
[0178]
根据每一个模块的修改行号以及每个原始对象在每个模块中的起始行号以及结束行号,获取每个模块中被修改的目标对象。
[0179]
在本公开的一种示例性实施例中,提取与所述目标类对应的增量单元测试用例,包括:
[0180]
确定与所述目标类对应的目标模块,并提取与所述目标模块对应的增量单元测试用例;其中,每一个目标模块对应多个增量单元测试用例。
[0181]
在本公开的一种示例性实施例中,执行所述增量单元测试用例,得到每个目标对象在所述增量单元测试用例中的所覆盖的代码行数,包括:
[0182]
根据所述增量单元测试用例生成增量用例集,并通过并发执行的方式执行所述增量用例集中的目标模块下的各所述增量单元测试用例,得到执行结果;
[0183]
当所述执行结果为执行成功时,从所述执行结果中获取每个目标对象在所述增量单元测试用例中的所覆盖的代码行数。
[0184]
在本公开的一种示例性实施例中,所述增量代码覆盖率测试装置还包括:
[0185]
测试用例发送模块,用于当所述执行结果为执行失败时,将执行失败的增量单元测试用例以及失败原因发送至代码审核平台,以使的所述项目的开发人员根据所述失败原因对所述执行失败的增量单元测试用例中所包括的目标对象进行修复。
[0186]
在本公开的一种示例性实施例中,根据所述目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数,对所述项目在对象层级上的增量覆盖率进行测试,包括:
[0187]
根据每个原始对象在所述源代码中的起止位置,计算每个目标对象所包括的代码行数;
[0188]
对所述目标对象的数量以及每个目标对象所包括的代码行数进行求和运算,得到第一运算结果;
[0189]
对所述目标对象的数量以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数进行求和运算,得到第二运算结果;
[0190]
对所述第二运算结果以及第一运算结果进行求商运算,得到所述项目在对象层级上的增量覆盖率。
[0191]
在本公开的一种示例性实施例中,所述增量代码覆盖率测试装置还包括:
[0192]
增量覆盖率发送模块,用于将所述项目的方法级增量覆盖率发送至代码审核平台,以使得所述代码审核平台根据所述项目的方法级增量覆盖率,确定所述项目的增量代码测试是否处于通过状态。
[0193]
示例性存储介质
[0194]
在介绍了本发明示例性实施方式的弹窗处理方法和弹窗处理装置之后,接下来,参考图10对本发明示例性实施方式的存储介质进行说明。
[0195]
参考图10所示,描述了根据本发明的实施方式的用于实现上述方法的程序产品1000,其可以采用便携式紧凑盘只读存储器(cd

rom)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本发明的程序产品不限于此。
[0196]
所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑盘只读存储器(cd

rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。
[0197]
计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质。
[0198]
可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如java、c++等,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(lan)或广域网(wan),连接到用户计算设备。
[0199]
示例性电子设备
[0200]
在介绍了本发明示例性实施方式的存储介质之后,接下来,参考图对本发明示例性实施方式的电子设备进行说明。
[0201]
在介绍了本发明示例性实施方式的存储介质之后,接下来,参考图7对本发明示例性实施方式的电子设备进行说明。
[0202]
图11显示的电子设备1100仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
[0203]
如图11所示,电子设备1100以通用计算设备的形式表现。电子设备1100的组件可以包括但不限于:上述至少一个处理单元1110、上述至少一个存储单元1120、连接不同系统组件(包括存储单元1120和处理单元1110)的总线1130、显示单元1140。
[0204]
其中,所述存储单元1120存储有程序代码,所述程序代码可以被所述处理单元1110执行,使得所述处理单元1110执行本说明书上述“示例性方法”部分中描述的根据本发明各种示例性实施方式的步骤。例如,所述处理单元1110可以执行如图1中所示的步骤s110:解析项目的源代码,得到所述源代码中所包括的每个原始对象在所述源代码中的起止位置,并根据所述源代码的修改行号以及所述起止位置,获取所述源代码中被修改的目标对象;其中,所述原始对象以及所述目标对象包括函数或者java方法;步骤s120:从与所述项目对应的倒排索引库中,获取与所述目标对象关联的目标类,并提取与所述目标类对应的增量单元测试用例;步骤s130:执行所述增量单元测试用例,得到每个目标对象在所述增量单元测试用例中的所覆盖的代码行数;步骤s140:根据所述目标对象的数量、每个目标对象所包括的代码行数以及每个目标对象在所述增量单元测试用例中所覆盖的代码行数,对所述项目在对象层级上的增量覆盖率进行测试。。
[0205]
存储单元1120可以包括易失性存储单元,例如随机存取存储单元(ram)11201和/或高速缓存存储单元11202,还可以进一步包括只读存储单元(rom)11203。
[0206]
存储单元1120还可以包括具有一组(至少一个)程序模块11205的程序/实用工具11204,这样的程序模块11205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
[0207]
总线1130可以包括数据总线、地址总线和控制总线。
[0208]
电子设备1100也可以通过输入/输出(i/o)接口1150,与一个或多个外部设备1200(例如键盘、指向设备、蓝牙设备等)通信。并且,电子设备1100还可以通过网络适配器1160与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。如图所示,网络适配器1160通过总线1130与电子设备1100的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备1100使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储系统等。
[0209]
应当注意,尽管在上文详细描述中提及了增量代码覆盖率测试装置的若干模块或子模块,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本发明的实施方式,上文描述的两个或更多单元/模块的特征和功能可以在一个单元/模块中具体化。反之,上文描述的一个单元/模块的特征和功能可以进一步划分为由多个单元/模块来具体化。
[0210]
此外,尽管在附图中以特定顺序描述了本发明方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
[0211]
虽然已经参考若干具体实施方式描述了本发明的精神和原理,但是应该理解,本发明并不限于所公开的具体实施方式,对各方面的划分也不意味着这些方面中的特征不能
组合以进行受益,这种划分仅是为了表述的方便。本发明旨在涵盖所附权利要求的精神和范围内所包括的各种修改和等同布置。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1