1.本发明实施例涉及软件测试技术领域,特别涉及一种代码覆盖率的确定方法、装置、电子设备及存储介质。
背景技术:2.软件测试是软件开发过程中的一个重要环节,其中,代码覆盖率是软件测试度量结果的一种,它描述了源代码被测试的比例和程度。目前已经产生了各种代码覆盖率工具,如gnu编译器套件(gnu compiler collection,gcc)提供的gcov工具等。
3.但是开发人员使用现有的代码覆盖率工具确定代码覆盖率效率太低,会严重影响开发进度。
技术实现要素:4.本发明实施例的目的在于提供一种代码覆盖率的确定方法、装置、电子设备及存储介质,使得能够提高确定代码覆盖率的效率,从而提升开发效率。
5.为达到上述目的,本发明的实施例提供了一种代码覆盖率的确定方法,包括:获取源代码和测试代码,所述测试代码用于对所述源代码进行代码测试;在所述源代码和所述测试代码具有对应的历史源代码和历史测试代码的情况下,将所述源代码中与所述历史源代码不相同的基本块,以及,所述测试代码中与所述历史测试代码不相同的基本块,作为第一基本块;根据所述第一基本块进行代码测试,得到第一代码覆盖率;将所述第一代码覆盖率和第二基本块对应的历史代码覆盖率进行合并,得到所述源代码的代码覆盖率,其中,所述第二基本块为所述源代码与所述历史源代码相同的基本块中,对应的所述测试代码部分与所述历史测试代码部分也相同的基本块,所述历史代码覆盖率为基于所述历史测试代码对所述历史源代码中的各基本块进行代码覆盖率确定得到的代码覆盖率。
6.为达到上述目的,本发明的实施例还提供了一种代码覆盖率的确定装置,包括:获取模块,用于获取源代码和测试代码,所述测试代码用于对所述源代码进行代码测试;确定模块,用于在所述源代码和所述测试代码具有对应的历史源代码和历史测试代码的情况下,将所述源代码中与所述历史源代码不相同的基本块,以及,所述测试代码中与所述历史测试代码不相同的基本块,作为第一基本块;测试模块,用于根据所述第一基本块进行代码测试,得到第一代码覆盖率;合并模块,用于将所述第一代码覆盖率和第二基本块对应的历史代码覆盖率进行合并,得到所述源代码的代码覆盖率,其中,所述第二基本块为所述源代码与所述历史源代码相同的基本块中,对应的所述测试代码部分与所述历史测试代码部分也相同的基本块,所述历史代码覆盖率为基于所述历史测试代码对所述历史源代码进行代码覆盖率确定得到的代码覆盖率。
7.为达到上述目的,本发明的实施例还提供了一种电子设备,包括:至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理
器能够执行如上所述的代码覆盖率的确定方法。
8.为达到上述目的,本发明的实施例还提供了一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的代码覆盖率的确定方法。
9.本发明实施例提供的代码覆盖率的确定方法,在获取了源代码和用于对源代码进行代码测试的测试代码后,接着在源代码和测试代码具有对应的历史源代码和历史测试代码的情况下,确定出第一基本块,从而由于第一基本块包括源代码中与历史源代码不同的基本块以及测试代码中与历史测试代码不同的基本块,因此,使得根据第一基本块进行代码测试得到的第一代码覆盖率会包括:源代码中的第一基本块的代码覆盖率,以及,测试代码中的第一基本块对应的源代码的基本块的代码覆盖率。此外,由于第二基本块为源代码与历史源代码相同的基本块中,对应的测试代码部分与历史测试代码部分也相同的基本块,即第二基本块在确定源代码的代码覆盖率过程中与确定历史源代码的代码覆盖率过程中对应的测试语句是相同,因此,第二基本块在源代码和历史源代码中确定出的代码覆盖率是相同的,也就是说,第二基本块对应的历史代码覆盖率就是对源代码中的第二基本块进行代码测试将得到的代码覆盖率,即第二基本块对应的历史代码覆盖率作为源代码中的第二基本块的代码覆盖率是可行且准确的。因此,将第一代码覆盖率和第二基本块对应的历史代码覆盖率进行合并,就是将源代码中的第一基本块的代码覆盖率、测试代码中的第一基本块在源代码中对应的基本块的代码覆盖率以及第二基本块的代码覆盖率进行合并,并且,根据第一基本块、第二基本块和测试代码中的第一基本块在源代码中对应的基本块的含义可知,第一基本块、第二基本块和测试代码中的第一基本块在源代码中对应的基本块共同构成了源代码,即将第一代码覆盖率和第二基本块对应的历史代码覆盖率进行合并,得到的是源代码的完整的代码覆盖率。由此可见,本实施例是在对当前获取的源代码进行代码覆盖率确定时,只针对相对于历史源代码和历史测试代码发生了变动的第一基本块进行代码测试,即只对代码覆盖率可能会发生变化的源代码部分进行代码测试,而在第一代码覆盖率的基础上合并第二基本块对应的历史代码覆盖率,实际合并的是相对于历史源代码和历史测试代码未发生变动的第二基本块的准确代码覆盖率,即减少了需要进行代码测试的代码量,从而提高了确定代码覆盖率的效率,还保证了确定的代码覆盖率的准确性。此外,由于只对被修改的代码部分进行代码测试,而不需要考虑其他部分的实现情况,从而可以将某一开发人员所修改的部分作为第一基本块,而默认其他开发人员撰写的代码(不论是否更改)作为第二基本块,最终实现针对单个用户的代码覆盖率确定,即用户级的代码测试,而不是项目级的代码测试。提高了单个开发人员的代码覆盖率确定效率。
附图说明
10.一个或多个实施例通过与之对应的附图中的图片进行示例性说明,这些示例性说明并不构成对实施例的限定,附图中具有相同参考数字标号的元件表示为类似的元件,除非有特别申明,附图中的图不构成比例限制。
11.图1是本发明一实施例中提供的代码覆盖率的确定方法的流程图;
12.图2是本发明另一实施例中提供的包括输出源代码的代码覆盖率步骤的代码覆盖率的确定方法的流程图;
13.图3是本发明另一实施例中提供的包括格式转化步骤的代码覆盖率的确定方法的
流程图;
14.图4是本发明另一实施例中提供的包括备份步骤的代码覆盖率的确定方法的流程图;
15.图5是本发明另一实施例中提供的包括删除步骤的代码覆盖率的确定方法的流程图;
16.图6是本发明另一实施例中提供的代码覆盖率的确定装置的结构示意图;
17.图7是本发明另一实施例中提供的电子设备的结构示意图。
具体实施方式
18.由背景技术可知,亟需提供一种高效的代码覆盖率确定方法,以解决利用现有的代码覆盖率工具效率低,影响开发进度的问题。
19.经分析发现,出现上述效率低问题的主要原因在于:开发过程中很可能涉及多位开发人员、大量代码文件,且代码通常会经过多次修改,每次修改后,代码覆盖率工具都会对先前确定的代码覆盖率进行清零而后对开发人员撰写的所有代码重新执行确定代码覆盖率的步骤,而无法针对某个开发人员的代码进行确定,且需要对未修改的代码部分重新进行确定。
20.为解决上述问题,本发明实施例提供了一种代码覆盖率的确定方法,包括:获取源代码和测试代码,所述测试代码用于对所述源代码进行代码测试;在所述源代码和所述测试代码具有对应的历史源代码和历史测试代码的情况下,将所述源代码中与所述历史源代码不相同的基本块,以及,所述测试代码中与所述历史测试代码不相同的基本块,作为第一基本块;根据所述第一基本块进行代码测试,得到第一代码覆盖率;将所述第一代码覆盖率和第二基本块对应的历史代码覆盖率进行合并,得到所述源代码的代码覆盖率,其中,所述第二基本块为所述源代码中未被所述第一代码覆盖率确定到的基本块,所述历史代码覆盖率为基于所述历史测试代码对所述历史源代码中的各基本块进行代码覆盖率确定得到的代码覆盖率。
21.本发明实施例提供的代码覆盖率的确定方法,在获取了源代码和用于对源代码进行代码测试的测试代码后,根据源代码中与历史源代码不同,以及,测试代码中与历史测试代码不同的第一基本块进行代码测试,即基于相对于历史源代码发生改动的源代码部分和相对于历史测试代码发生改动的测试代码部分进行代码测试,得到第一代码覆盖率,然后将基于第一基本块得到的第一代码覆盖率和第二基本块对应的历史代码覆盖率进行合并,得到源代码的代码覆盖率。也就是说,在对当前获取的源代码进行代码覆盖率确定时,只针对相对于历史源代码和历史测试代码发生变动的第一基本块进行代码测试,不对未发生变动的第二基本块进行代码测试,而为了获取源代码的完整代码覆盖率,将第二基本块,在确定历史源代码的代码覆盖率时得到的历史代码覆盖率,作为当前获取的源代码的覆盖率。相对于每次都对整个源代码从头到尾进行代码测试,本实施例中需要进行代码测试的代码量减小,进而代码测试所需的时间减少,其中,由于第二基本块为源代码中未被所述第一代码覆盖率确定到的基本块,即第二基本块未被修改且第二基本块对应的测试代码中的代码部分也未被修改,因此,第二基本块不论是作为历史源代码的一部分还是作为源代码的一部分,确定代码覆盖率时被测代码和测试代码都是相同,进而得到的代码覆盖率也是相同
的,即将第二基本块对应的历史代码覆盖率作为其在源代码中的代码覆盖率是准确的。此外,由于只对被修改的代码部分进行代码测试,而不需要考虑其他部分的实现情况,从而可以将某一开发人员所修改的部分作为第一基本块,而将其他开发人员撰写的代码(不论是否更改)作为第二基本块,最终实现针对单个用户的代码覆盖率确定,即用户级的代码测试,而不是项目级的代码测试。提高了单个开发人员的代码覆盖率确定效率。
22.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的各实施例进行详细的阐述。然而,本领域的普通技术人员可以理解,在本发明各实施例中,为了使读者更好地理解本发明而提出了许多技术细节。但是,即使没有这些技术细节和基于以下各实施例的种种变化和修改,也可以实现本发明所要求保护的技术方案。
23.以下各个实施例的划分是为了描述方便,不应对本发明的具体实现方式构成任何限定,各个实施例在不矛盾的前提下可以相互结合相互引用。
24.本发明实施例一方面提供了一种代码覆盖率的确定方法,应用于计算机、服务器等电子设备。本实施例所提供的代码覆盖率的确定方法流程如图1所示,至少包括如下步骤:
25.步骤101,获取源代码和测试代码,测试代码用于对源代码进行代码测试。
26.本实施例中,源代码可以是任一需要确定代码覆盖率的代码,测试代码是用于对源代码进行代码测试的代码。例如源代码可以是一个代码开发项目中由一位或几位代码开发人员所负责实现的功能对应的代码,也可以是一个代码文件,还可以是一个开发项目对应的完整代码等。
27.需要说明的是,源代码和测试代码可以是由任一种编程语言编写得到,特别地,即使源代码和测试代码对应的编程语言不一致,在进行代码测试时,还可以通过编译等方式使其被同一编程语言表示,因此,不对源代码和测试代码的编程语言进行限定。
28.在一些例子中,源代码和测试代码被存储在代码开发人员的个人设备上,相应地,获取源代码的测试代码可以通过如下方式实现:读取代码开发人员所上传的源代码和测试代码的本地地址;根据读取到的本地地址,在代码开发人员的本地存储中查找源代码和测试代码。
29.在另一些例子中,代码开发人员主动上传源代码和测试代码,相应地,获取源代码的测试代码可以通过如下方式实现:读取代码开发人员所上传的源代码和测试代码。
30.当然,以上仅为具体的举例说明,在其他例子中,还可以代码开发人员指定源代码所在的代码文件,直接读取代码文件获取源代码并查找源代码所对应的测试代码,此处就不再一一赘述了。
31.步骤102,在源代码和测试代码具有对应的历史源代码和历史测试代码的情况下,将源代码中与历史源代码不相同的基本块,以及,测试代码中与历史测试代码不相同的基本块,作为第一基本块。
32.可以理解的是,整个开发过程很可能需要多次进行代码修改和调整,并且修改和调整的可能是源代码,也可能是测试代码,或者两者均有修改和调整,因此,需要多次进行代码测试,即多次确定代码覆盖率等软件测试度量结果。其中,每一次确定代码覆盖率都是基于当前获取的源代码和测试代码而言的,并且相对于在当前确定代码覆盖率之前的任一确定代码覆盖率过程中使用的源代码和测试代码,当前获取的源代码和测试代码中的至少
一者中的至少一个基本块会发生变化。此时,可以将在当前确定代码覆盖率之前的某一个确定代码覆盖率过程中使用的源代码和测试代码作为历史源代码和历史测试代码。
33.本实施例中,源代码、历史源代码、测试代码和历史测试代码均包含若干基本块,源代码中与历史源代码不相同的基本块是指无法在历史源代码中匹配到基本块的源代码中的基本块,测试代码中与历史测试代码不相同的基本块是指无法在历史测试代码中匹配到基本块的测试代码中的基本块,其中,两个基本块匹配是指两个基本块中的语句相同,两个基本块不匹配是指两个基本块中的语句不完全相同。
34.也就是说,将源代码中与历史源代码不相同的基本块,以及,测试代码中与历史测试代码不相同的基本块,作为第一基本块实质是:对源代码中的每一个基本块,分别在历史源代码中进行匹配,从而确定出源代码中哪些基本块匹配成功、源代码中哪些基本块匹配不成功,然后将源代码中匹配不成功的基本块作为第一基本块;以及,对测试代码中的每一个基本块,分别在历史测试代码中进行匹配,从而确定出测试代码中哪些基本块匹配成功、测试代码中哪些基本块匹配不成功,然后将测试代码中匹配不成功的基本块作为第一基本块。
35.可以理解的是,源代码和历史源代码存在关联、测试代码和历史测试代码存在关联,如源代码可以是历史源代码进行修改和调整得到,因此,在源代码和测试代码具有对应的历史源代码和历史测试代码的情况下,基于源代码和测试代码确定源代码的代码覆盖率,可以参考基于历史源代码和历史测试代码得到的历史源代码的代码覆盖率,而对基于历史源代码和历史测试代码得到的历史源代码的代码覆盖率无法提供参考的源代码部分进行代码测试,确定代码覆盖率,从而减少进行测试的代码量,提高确定源代码的代码覆盖率的确定效率,其中,基于历史源代码和历史测试代码得到的历史源代码的代码覆盖率无法提供参考的源代码部分,包括源代码中相对于历史源代码中发生变化的基本块,以及,测试代码相对于历史测试代码中发生变化的基本块在源代码中对应的基本块。与此相对应的是,在源代码和测试代码不具备对应的历史源代码和历史测试代码的情况下,由于无法获取任何参考,因此,需要对所有的源代码从头到尾进行代码测试。也就是说,在源代码和测试代码不具备对应的历史源代码和历史测试代码的情况下,根据测试代码对源代码进行代码测试,得到源代码的代码覆盖率。
36.因此,在另一些实施例中,在当前获取了源代码和测试代码后,对获取的源代码和测试代码是否具有对应的历史源代码和历史测试代码进行判断,从而在判定获取的源代码和测试代码具有对应的历史源代码和历史测试代码的情况下,确定出第一基本块,并按照本实施例所提供的步骤103和步骤104继续实现;在判定获取的源代码和测试代码不具备对应的历史源代码和历史测试代码的情况下,根据测试代码对源代码进行代码测试,得到源代码的代码覆盖率。特别地,对获取的源代码和测试代码是否具有对应的历史源代码和历史测试代码进行判断,主要是对源代码对应的原始源代码是否已经确定过代码覆盖率进行判断。对获取的源代码和测试代码是否具有对应的历史源代码和历史测试代码进行判断,在对基于同一原始源代码得到的源代码进行代码覆盖率确定次数进行计数的情况下,可以通过判断计数值是否为0实现;在基于同一源代码得到的代码覆盖率确定结果存储在指定存储空间的情况下,可以通过判断存储空间的存储内容是否为空来实现。
37.需要说明的是,本实施例中并未将历史源代码和历史测试代码所对应的确定代码
覆盖率过程,限定为当前确定代码覆盖率过程的上一次确定代码覆盖率的过程,而是描述为在当前确定代码覆盖率过程的之前的某一个确定代码覆盖率的过程。这是由于对源代码和测试代码的修改和调整具有不确定性,因此,上一次确定代码覆盖率的过程中获取的源代码和测试代码不一定与当前确定代码覆盖率的过程中获取的源代码和测试代码差异度最小的,而基于与当前确定代码覆盖率的过程中获取的源代码和测试代码差异度不同会对本实施例提供的代码覆盖率效率产生影响。以源代码为例,在第6次确定代码覆盖率过程中获取的源代码,在第1-5次确定代码覆盖率过程中获取的源代码中,与第1次确定代码覆盖率过程中获取的源代码最接近,此时,相对于将2-5次确定代码覆盖率过程中获取的源代码作为历史源代码,将第1次确定代码覆盖率时获取的源代码作为历史源代码会得到数量更少的第一基本块,从而在步骤103时基于第一基本块进行代码测试,需要进行代码测试的基本块更少,确定第一代码覆盖率的效率更高,即通过选择合适的历史源代码实现了对第一代码覆盖率的提高,最终通过确定第一代码覆盖率的效率提高,使得确定源代码的代码覆盖率的效率随之得到提高。
38.因此,在其他实施例中,在存在多个历史源代码的情况下,还可以对源代码和多个历史源代码进行匹配,将匹配度最高的历史源代码及其对应的历史测试代码作为确定第一基本块时使用的历史源代码和历史测试代码;或者,对源代码和测试代码分别与历史源代码和历史测试代码同时进行匹配,将整体上匹配度最高的历史源代码和历史测试代码作为确定第一基本块时使用的历史源代码和历史测试代码等,此处就不再一一赘述了。
39.步骤103,根据第一基本块进行代码测试,得到第一代码覆盖率。
40.本实施例中,第一基本块包括源代码中存在的与历史源代码不相同的第一基本块,以及,测试代码中存在的与历史测试代码不相同的第一基本块。其中,对于源代码中存在的与历史源代码不相同的第一基本块,由于其自身代码不被历史源代码包含,因此,历史源代码的历史代码覆盖率中也不会包含该基本块的代码覆盖率,需要通过代码测试确定该基本块的代码覆盖率;对于测试代码中存在的与历史测试代码不相同的第一基本块,由于其测试逻辑不被历史测试代码包含,因此,需要基于其与历史测试代码所不同的测试逻辑对相应的测试代码部分进行代码测试,重新确定其对应的源代码中的对应基本块的代码覆盖率。
41.因此,在一些例子中,在源代码中存在与历史源代码不相同的第一基本块的情况下,根据第一基本块进行代码测试,得到第一代码覆盖率,通过如下方式实现:根据测试代码中对应的代码,对源代码中的第一基本块进行代码测试,得到源代码中的第一基本块中的第一代码覆盖率。即根据源代码中的第一基本块查找其在测试代码中对应的代码后,利用确定出来的代码对相应的源代码中的第一基本块进行代码测试,得到源代码中的第一基本块的第一代码覆盖率。
42.在一些例子中,在测试代码中存在与历史测试代码不相同的第一基本块的情况下,根据第一基本块进行代码测试,得到第一代码覆盖率,通过如下方式实现:根据测试代码中的第一基本块,对源代码中对应的代码进行代码测试,得到源代码中对应的代码的第一代码覆盖率。即根据测试代码中的第一基本块查找其在源代码中对应的代码后,利用测试代码中的第一基本块,对相应确定出来源代码中的代码进行代码测试,得到确定出来源代码中的代码的第一代码覆盖率。
43.步骤104,将第一代码覆盖率和第二基本块对应的历史代码覆盖率进行合并,得到源代码的代码覆盖率,其中,第二基本块为源代码与历史源代码相同的基本块中,对应的测试代码部分与历史测试代码部分也相同的基本块,历史代码覆盖率为基于历史测试代码对历史源代码中的各基本块进行代码覆盖率确定得到的代码覆盖率。
44.本实施例中,被合并的第一代码覆盖率包括通过步骤103确定出的所有的第一代码覆盖率,即,被合并的第一代码覆盖率包括:源代码中的第一基本块的代码覆盖率和测试代码中的第一基本块对应的源代码中的基本块的代码覆盖率。而第二基本块作为第二基本块为源代码与历史源代码相同的基本块中,对应的测试代码部分与历史测试代码部分也相同的基本块,由于源代码中的第一基本块是源代码和历史源代码不同的基本块,源代码中与测试代码中与历史测试代码不相同的第一基本块对应的基本块是源代码中对应的测试代码部分与历史代码部分不同的基本块,因此,第二基本块和与源代码中与历史源代码不相同的第一基本块以及源代码中与测试代码中与历史测试代码不相同的第一基本块对应的基本块的并集即为源代码。进而第二基本块对应的历史代码覆盖率作为第二基本块当前的代码覆盖率、被合并的第一代码覆盖率包括源代码中的第一基本块的代码覆盖率和测试代码中的第一基本块对应的源代码中的基本块的代码覆盖率的情况下,将第一代码覆盖率和第二基本块对应的历史代码覆盖率进行合并实际就是构成源代码的不同部分的代码覆盖率进行合并,得到的是源代码的完整的代码覆盖率。其中,由于第二基本块为源代码中未被所述第一代码覆盖率确定到的基本块,即第二基本块未被修改且第二基本块对应的测试代码中的代码部分也未被修改,因此,第二基本块不论是作为历史源代码的一部分还是作为源代码的一部分,确定代码覆盖率时被测代码和测试代码都是相同,进而得到的代码覆盖率也是相同的,即将第二基本块对应的历史代码覆盖率作为其在源代码中的代码覆盖率是准确的。
45.本发明实施例另一方面还提供了一种代码覆盖率的确定方法,应用于计算机、服务器等电子设备。本实施例所提供的代码覆盖率的确定方法流程如图2所示,至少还包括如下步骤:
46.步骤105,新增用于输出代码覆盖率的内容,用于输出代码覆盖率的内容包括代码覆盖率结果输出代码或新增代码覆盖率显示工具包。
47.本实施例中,代码覆盖率结果输出代码的新增可以通过在测试代码中增加实现输出代码覆盖率功能的代码实现,也可以通过在编译过程中新增编译参数实现;新增代码覆盖率显示工具包的新增可以通过在编译过程中打包相应的覆盖率工具包,此处就不再一一赘述了。
48.步骤106,调用用于输出代码覆盖率的内容,输出源代码的代码覆盖率。
49.本发明实施例另一方面还提供了一种代码覆盖率的确定方法,应用于计算机、服务器等电子设备。本实施例所提供的代码覆盖率的确定方法流程如图3所示,至少还包括如下步骤:
50.步骤107,将输出结果转化为超文本标记语言html格式。
51.本实施例中,可以调用预设的超文本标记语言(hypertext markup language,html)格式化工具,也可以是调用预设的格式转换代码等,将输出结果非html格式,以便能够通过浏览器等被呈现给代码开发人员,从而能够确定是否修改以及如何修改源代码和/
或测试代码。
52.需要说明的是,本实施例不对实现html格式转换的方式进行限定,可以是任何一种能够将非html格式的文本转化为html格式的实现方式。
53.步骤108,显示格式转化后的输出结果。
54.本实施例中,格式转换后的数据结果可以被呈现在代码开发人员的个人设备上,也可以被呈现在实现本实施例提供的代码覆盖率的确定方法的电子设备上等。
55.本发明实施例另一方面还提供了一种代码覆盖率的确定方法,应用于计算机、服务器等电子设备。本实施例所提供的代码覆盖率的确定方法流程如图4所示,至少还包括如下步骤:
56.步骤109,对源代码进行备份。
57.本实施例中,在确定了源代码的代码覆盖率后,源代码实质成为历史源代码,这是相对于下次将要发生的代码覆盖率确定过程而言的。而为了便于在下一个代码覆盖率确定过程中提供历史源代码,还希望能够保证历史源代码的安全性。因此,可以对源代码进行备份,以保证其信息安全。
58.在一些例子中,源代码可以被备份在实现本实施例提供的代码覆盖率的确定方法的电子设备上。
59.在另一些例子中,源代码可以被备份在代码开发人员的个人设备中。
60.本发明实施例另一方面还提供了一种代码覆盖率的确定方法,应用于计算机、服务器等电子设备。本实施例所提供的代码覆盖率的确定方法流程如图5所示,至少还包括如下步骤:
61.步骤110,删除历史源代码、历史测试代码和历史代码覆盖率。
62.本实施例中,由于确定了当前获取的源代码的代码覆盖率后,源代码实质成为历史源代码,这是相对于下次将要发生的代码覆盖率确定过程而言的。也就是说,在下一个代码覆盖率确定过程中,可提供历史源代码包括了当前获取的源代码和当前获取的源代码的历史源代码。对当前获取的源代码的历史源代码及其相关信息,即历史测试代码和历史代码覆盖率进行删除,仍然能够保证在下一个代码覆盖率确定过程中,仍然具备历史源代码、历史测试代码和历史代码覆盖率。同时还会由于对历史源代码、历史测试代码和历史代码覆盖率的及时删除,减小了缓存占用量。
63.其中,若是每次在确定了当前获取的源代码的代码覆盖率后,都对历史源代码、历史测试代码以及历史代码覆盖率进行删除,则每次要确定当前获取的源代码的代码覆盖率时,可用的历史源代码、历史测试代码以及历史代码覆盖率只有一组,即为在当前的确定源代码的代码覆盖率过程之前的上一次确定源代码的代码覆盖率过程中获取的源代码、测试代码以及源代码的代码覆盖率。
64.当然,在其他实施例中还可以不对历史源代码、历史测试代码和历史代码覆盖率进行删除,从而保留了较多的历史源代码、历史测试代码和历史代码覆盖率,这样在实现步骤102时就可以在确定第一基本块时选用一个与当前获取的源代码和/测试代码差异度更小的一组历史源代码和历史测试代码,从而实现如前所述的进一步提高代码覆盖率的确定效率的效果。
65.为了便于本领域技术人员更好地理解上述实施例所提供的代码覆盖率的确定方
法,以下将以源代码和测试代码均为c语言、lcov工具为用于输出代码覆盖率的内容、基于gnu编译器套件(gnu compiler collection,gcc)工具实现代码覆盖率的确定方法为例进行说明。
66.将gcc产生代码覆盖率的参数
“‑‑
coverage-fprofile-dir=/var/gcov/test”加入到编译参数中,其中,
“‑‑
coverage-fprofile-dir=/var/gcov/test”中的/var/gcov/test表示覆盖率二进制文件保存的目录,即源代码和测试代码所保存的位置,
“‑‑
coverage-fprofile-dir=/var/gcov/test”表示将产生的代码覆盖率数据写到“/var/gcov/test”目录下的文件中,从而在进行代码测试时,自动加入覆盖率功能。即只要gcov_test.c对应的代码有被运行到,就会在/var/gcov/test目录下产生gcov_test.c被执行到的二进制覆盖率信息文件gcov_test.gcda。可以理解的是,在其他例子中,/var/gcov/test目录可以根据需要被调整为其他表示,此处就不再一一赘述了。
67.进而在假设源代码为文件名为gcov_test.c的文件的情况下,确定出第一基本块并基于第一基本块进行代码测试,然后调用命令行“lcov-c-d./-b./-o a.info”,将得到的第一覆盖率转成覆盖率的文本文件,即命名为a.info的文件,该文件内将包括记录的每个基本块中的每一语句在代码测试时的执行此时的信息,具体可以包括如下内容:
68.sf:/home/test/gcov_test.c
69.fn:10,func1
70.fn:15,func2
71.fnda:1,func1
72.fnda:1,func2
73....
74.da:13,1
75.da:16,1
76.da:17,1
77.end_of_record
78.即,得到第一次实现代码覆盖率的确定。
79.然后通过如下方式第一代码覆盖率和历史代码覆盖率进行合并,其中,第一代码覆盖率被表示为a.info文件和历史代码覆盖率被表示为b.info文件:判断出当前存在b.info文件,其中,b.info文件表示历史源代码及其对应的代码覆盖率的文件,读取a.info,其中,a.info文件表示***,遍历每一个sf:开头的数据行,读取sf:到end_of_record之间数据继续以下循环。遍历每个fn,记录当前fn后面的行号和下一个fn后面的行号,读取这个行号之间的所有da开头的数据,假设第一个fn在[10,15)之间,不包含第15行。10-14之间的da数据有:da:13,1。则继续读取b.info的文件,查找sf:/home/test/gcov_test.c和end_of_record之间中为da:13开头的数据,然后分别打开gcov_test.c和gcov_test.c.bak文件并读取第13行程序代码数据进行对比,如果相同,则将b.info da:13后面的数字累加到a.info里的da:13里面,同时a.info的fnda:1,func1里面的1也要加上b.info对应fnda:1,func1这行上的数字。而如果两个代码文件的第13行不一样,则不合并累加数据。最终得到表示测试代码的代码覆盖率的a.info。然后删除b.info和gcov_test.c.bak,将a.info重命名b.info,实现对历史代码覆盖率的及时删除,避免占用存储空间,同时还将
gcov_test.c文件拷贝到gcov_test.c.bak备份,即对当前的源代码备份,待下次确定代码覆盖率时使用。其中,还可以调用命令行“genhtml-f b.info-o result”,使得每次确定代码覆盖率时新产生的b.info得到对应的html文件,从而可以在浏览器中直观的查看代码覆盖率结果。
[0080]
上面各种方法的步骤划分,只是为了描述清楚,实现时可以合并为一个步骤或者对某些步骤进行拆分,分解为多个步骤,只要包括相同的逻辑关系,都在本专利的保护范围内;对算法中或者流程中添加无关紧要的修改或者引入无关紧要的设计,但不改变其算法和流程的核心设计都在该专利的保护范围内。
[0081]
本发明实施例另一方面还提供了一种代码覆盖率的确定装置,如图6所示,包括:
[0082]
获取模块601,用于获取源代码和测试代码,测试代码用于对源代码进行代码测试。
[0083]
确定模块602,用于在源代码和测试代码具有对应的历史源代码和历史测试代码的情况下,将源代码中与历史源代码不相同的基本块,以及,测试代码中与历史测试代码不相同的基本块,作为第一基本块。
[0084]
测试模块603,用于根据第一基本块进行代码测试,得到第一代码覆盖率。
[0085]
合并模块604,用于将第一代码覆盖率和第二基本块对应的历史代码覆盖率进行合并,得到源代码的代码覆盖率,其中,第二基本块为源代码与历史源代码相同的基本块中,对应的测试代码部分与历史测试代码部分也相同的基本块,历史代码覆盖率为基于历史测试代码对历史源代码进行代码覆盖率确定得到的代码覆盖率。
[0086]
不难发现,本实施例为与方法实施例相对应的装置实施例,本实施例可与方法实施例互相配合实施。方法实施例中提到的相关技术细节在本实施例中依然有效,为了减少重复,这里不再赘述。相应地,本实施例中提到的相关技术细节也可应用在方法实施例中。
[0087]
值得一提的是,本实施例中所涉及到的各模块均为逻辑模块,在实际应用中,一个逻辑单元可以是一个物理单元,也可以是一个物理单元的一部分,还可以以多个物理单元的组合实现。此外,为了突出本发明的创新部分,本实施例中并没有将与解决本发明所提出的技术问题关系不太密切的单元引入,但这并不表明本实施例中不存在其它的单元。
[0088]
本发明实施例另一方面还提供了一种电子设备,如图7所示,包括:至少一个处理器701;以及,与至少一个处理器701通信连接的存储器702;其中,存储器702存储有可被至少一个处理器701执行的指令,指令被至少一个处理器701执行,以使至少一个处理器701能够执行上述任一方法实施例所描述的代码覆盖率的确定方法。
[0089]
其中,存储器702和处理器701采用总线方式连接,总线可以包括任意数量的互联的总线和桥,总线将一个或多个处理器701和存储器702的各种电路连接在一起。总线还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其他电路连接在一起,这些都是本领域所公知的,因此,本文不再对其进行进一步描述。总线接口在总线和收发机之间提供接口。收发机可以是一个元件,也可以是多个元件,比如多个接收器和发送器,提供用于在传输介质上与各种其他装置通信的单元。经处理器701处理的数据通过天线在无线介质上进行传输,进一步,天线还接收数据并将数据传输给处理器701。
[0090]
处理器701负责管理总线和通常的处理,还可以提供各种功能,包括定时,外围接口,电压调节、电源管理以及其他控制功能。而存储器702可以被用于存储处理器701在执行
操作时所使用的数据。
[0091]
本发明实施方式另一方面还提供了一种计算机可读存储介质,存储有计算机程序。计算机程序被处理器执行时实现上述任一方法实施例所描述的代码覆盖率的确定方法。
[0092]
即,本领域技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0093]
本领域的普通技术人员可以理解,上述各实施例是实现本发明的具体实施例,而在实际应用中,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。