代码覆盖率处理方法与流程

文档序号:14779467发布日期:2018-06-26 10:54阅读:318来源:国知局

本发明有关于代码覆盖率(code coverage),更具体地,有关于一种用于执行没有源代码修改的关注区域(cared-zone)代码覆盖率评估的代码覆盖率处理方法。



背景技术:

在计算机科学中,代码覆盖率是用于描述当使用特定测试模式(test pattern)来测试程序的执行时程序的源代码被执行的程度的度量。具有高代码覆盖率(以百分比测量)的程序在测试期间执行更多的源代码,这表明与具有低代码覆盖率的程序相比,其包含未检测到的错误的机会较低。

一个程序的源代码可以包括由不同软件工程师(或不同的软件开发团队)开发的不同代码段。当测试程序时,一个软件工程师(或一个软件开发团队)可能对源代码的仅一个代码段的代码覆盖率感兴趣。因此,需要仅计算感兴趣的代码段的代码覆盖率。



技术实现要素:

依据本发明的示范性实施例,提出一种代码覆盖率处理方法以解决上述问题。

依据本发明的一个实施例,提出一种代码覆盖率处理方法,包括:接收以预定编程语言编写的源代码;根据源代码执行程序,其中源代码被分类为多个基本块,并且包括在相同基本块中的每行被执行相同次数;创建行跟踪文件,包括分别对于源代码的多个行的多个行跟踪记录,其中行跟踪记录中的每一个指示源代码中的相应行已被执行了多少次;接收指示源代码中的至少一个基本块被选择为非关注区域的一部分的非关注区域设置;根据行跟踪文件和非关注区域设置计算源代码的代码覆盖率结果;以及提供代码覆盖率结果。

依据本发明的另一实施例,提出一种代码覆盖率处理方法,包括:接收以预定编程语言编写的源代码;根据源代码执行程序,其中源代码被分类为多个基本块,包括在相同基本块中的每行被执行相同次数,通过根据源代码执行程序来创建至少一个基本块跟踪文件,并且基本块跟踪文件记录指示源代码中的每个基本块已经执行了多少次的信息;接收指示源代码中的多个基本块中的至少一个被选择为非关注区域的一部分的非关注区域设置;基于基本块跟踪文件通过修改与属于非关注区域的至少一个基本块相关联的记录信息来生成修改的基本块跟踪文件;至少根据修改的基本块跟踪文件计算源代码的代码覆盖率结果;以及提供代码覆盖率结果。

依据本发明的另一实施例,提出一种代码覆盖率处理方法,包括:接收以预定编程语言编写的源代码;根据源代码执行程序,其中源代码被分类为多个基本块,包括在相同基本块中的每行被执行相同次数,通过根据源代码执行程序来创建基本块跟踪文件,并且基本块跟踪文件记录指示源代码中的每个基本块已被执行了多少次的基本块跟踪信息;接收指示源代码中的多个基本块中的至少一个被选择为非关注区域的一部分的非关注区域设置;不考虑与属于由非关注区域设置指示的非关注区域的至少一个基本块相关联的基本块跟踪信息,而是根据基本块跟踪文件来计算代码覆盖率结果,其中,根据非关注区域设置不对基本块跟踪文件进行修改;以及提供代码覆盖率结果。

依据本发明的另一实施例,提出一种代码覆盖率处理方法,包括:接收以预定编程语言编写的源代码;根据源代码执行程序,其中源代码被分类为多个基本块,并且包括在相同基本块中的每行被执行相同次数;接收指示源代码中的多个基本块中的至少一个被选择为非关注区域的一部分的非关注区域设置,其中非关注区域设置包括:在显示屏上提供源代码的至少一部分;当源代码的至少一部分被提供在显示屏上时,接收选择源代码的至少一部分的至少一行的至少一个用户输入;以及将包含由至少一个用户输入选择的至少一个行的源代码的至少一个基本块作为非关注区域的一部分;计算源代码的代码覆盖率结果,排除属于非关注区域的多行;以及提供代码覆盖率结果。

本发明的代码覆盖率处理方法可以仅计算感兴趣的代码段的代码覆盖率。

【附图说明】

图1是根据本发明的实施例的计算机系统的示意图。

图2是根据本发明的实施例的代码覆盖率评估的第一阶段的示意图。

图3是根据本发明实施例的被分类为基本块的源代码的示意图。

图4是根据本发明的实施例的表示基本块文件的文本文件的示意图。

图5是根据本发明的实施例的表示基本块跟踪文件的文本文件的示意图。

图6是根据本发明实施例的代码覆盖率评估的第二阶段的示意图。

图7是根据本发明实施例的行跟踪文件的示意图。

图8是根据本发明的实施例的代码覆盖率评估的第三阶段的示意图。

图9是根据本发明的实施例的非关注区域选择的示意图。

图10是根据本发明的实施例的代码覆盖率评估的修改的第一阶段的示意图。

图11是根据本发明实施例的表示修改的基本块文件的文本文件的示意图。

图12是根据本发明实施例的表示修改的基本块跟踪文件的文本文件的示意图。

图13是根据本发明的实施例的代码覆盖率评估的修改的第二阶段的示意图。

图14是根据本发明的实施例的修改的行跟踪文件的示意图。

图15是根据本发明的实施例的代码覆盖率评估的修改的第三阶段的示意图。

图16是根据本发明实施例的Java源代码的第一修改的代码覆盖率评估设计的示意图。

图17是根据本发明实施例的Java源代码的第二修改代码覆盖率评估设计的示意图。

【具体实施方式】

在说明书及权利要求书当中使用了某些词汇来指称特定的组件。所属领域中的技术人员应可理解,制造商可能会用不同的名词来称呼同样的组件。本说明书及权利要求书并不以名称的差异异来作为区分组件的方式,而是以组件在功能上的差异异来作为区分的基准。在通篇说明书及权利要求书当中所提及的「包含」是开放式的用语,故应解释成「包含但不限定于」。另外,「耦接」一词在此包含任何直接及间接的电气连接手段。因此,若文中描述第一装置耦接于第二装置,则代表第一装置可直接电气连接于第二装置,或透过其它装置或连接手段间接地电气连接至第二装置。

图1是根据本发明的实施例的计算机系统的示意图。计算机系统100能够提供软件开发环境,并且包括处理器102、存储设备104和显示屏106。应当注意,在图1中仅示出了与本发明相关的组件。在实践中,计算机系统100可以包括用于实现其他功能的附加电路。存储设备104用于存储包括一个或多个代码覆盖率工具105的软件模块。例如,代码覆盖率工具105可以包括编译器、代码覆盖率分析工具和/或代码覆盖率报告工具;并且存储设备104可以是硬盘驱动器、非易失性存储器或任何数据存储装置。当代码覆盖率工具105被处理器102加载和执行时,指示处理器102执行代码覆盖率评估并生成代码覆盖率结果至显示屏106。可以提供(例如,显示)用户界面(user interface,简写为UI)107在显示屏106上,使得用户可以与UI 107交互以控制代码覆盖率评估,并且可以通过UI 107查看代码覆盖率结果。例如,用户输入USER_IN包括指示源代码中的非关注区域(non-cared region)(即,源代码的不感兴趣的行)的非关注区域设置SNCZ,并且建议的关注区域代码覆盖率处理方法可以参考非关注区域设置SNCZ来生成并显示源代码中的关注区域(即源代码的感兴趣行)的代码覆盖率结果,其中源代码由关注区域和非关注区域组成。稍后描述所提出的关注区域代码覆盖率处理方法的进一步细节。

源代码以预定的编程语言编写。为了更好地理解本发明的技术特征,给出了范例性源代码foo.c(以C编程语言编写并且将被测试用于代码覆盖率评估)。应当注意,这仅是为了说明的目的,并不意味着是对本发明的限制。

C源代码的代码覆盖率评估可以包括多个阶段。图2是根据本发明的实施例的代码覆盖率评估的第一阶段的示意图。编译器(例如,gcc)是代码覆盖率工具105之一。当用户启用源代码foo.c的编译函数时,编译器由处理器102加载并执行。在处理器102上运行的编译器gcc接收源代码foo.c,并根据源代码foo.c输出可执行二进制文件(例如,foo.out)和基本块文件(例如,foo.gcno)。例如,编译器gcc编译源代码foo.c以生成可执行二进制文件foo.out,其中在源代码foo.c.的编译期间添加用于代码覆盖率的代码探测(code instrumentation)。编译器gcc将源代码foo.c分类为多个基本块,其中包含在相同基本块中的每一行将被执行相同的次数。除了可执行二进制文件foo.out之外,源代码foo.c的编译进一步创建了基本块文件foo.gcno,其记录了源代码foo.c.中的基本块的信息。

图3是根据本发明实施例的被分类为基本块的源代码(例如,foo.c)的示意图。图3所示的基本块仅用于说明目的。也就是说,图3仅用于说明不同基本块的关系。实际上,源代码(例如,foo.c)不一定被分类到图3所示的基本块中。例如,根据编译器的实际设计,源代码(例如,foo.c)可以被分类为与图3所示的基本块不同的基本块。简而言之,本发明可以采用能够将源代码分类为基本块的任何装置。基本块(base block,简写为bb)由一个或多个被不可分割地(atomically)调用/执行的表达式组成,也就是说,它们之间没有分支。弧(或者边缘或分支)指定一对基本块(源bb,目标bb),从而指示哪一个基本块跳到哪个其他基本块。在本实施例中,上述范例性源代码foo.c可以被分类为基本块bb0、bb1、bb2、bb3、bb4、bb5和bb6。例如,源代码foo.c的第4、5和7行属于相同的基本块bb2,源代码foo.c的第8行属于源代码foo.c的基本块bb3,第10行属于基本块bb4,源代码foo.c的第12行属于基本块bb5。如图3所示,arc0指定(源bb,目的地bb)=(bb0,bb2),arc1指定(源bb,目的地bb)=(bb2,bb3),arc2指定(源bb,目的地bb)=(bb2,bb4),arc3指定(源bb,目标bb)=(bb3,bb5),arc4指定(源bb,目标bb)=(bb4,bb5),arc5指定(源bb,目标bb)=(bb5,bb6),arc6指定(源bb,目标bb)=(bb6,bb1)。

图4是根据本发明的实施例的表示基本块文件(例如,foo.gcno)的文本文件的示意图。从编译器gcc产生的基本块文件foo.gcno是可以记录源代码foo.c中的基本块的信息的二进制文件,并且还可以记录源代码foo.c中关联弧(associated arcs)的信息。为了说明的目的,将基本块文件foo.gcno转换为文本文件,然后在图4中示出。换句话说,图4所示的文本文件是由二进制文件(binary file)转成的文本文件(text file)的文字内容,基本块文件foo.gcno可能是从编译器输出的二进制文件。第一个字段(field)表示文本文件中行的行号,第二个字段表示二进制文件中的位置(使用八进制表示法表示),第三个字段表示基本块文件foo.gcno的4字节二进制内容,其中4字节二进制内容的每个数字使用十六进制符号表示。

在该范例中,数据段404包含图3所示的arc4的信息。文本文件的第42行中的4字节二进制内容“01430000”指示后续的4字节二进制内容具有弧信息(arc information)。文本文件的第43行中的4字节二进制内容“00000003”指示弧信息的数据长度为3,意味着随后的三个4字节二进制内容依序表示源基本块、目的基本块和弧标志(arc flag)。因此,文本文件的第44行中的4字节二进制内容“00000004”指示源基本块是bb4,文本文件的第45行中的4字节二进制内容“00000005”指示目的基本块是bb5,并且文本文件的第46行中的4字节二进制内容“00000004”指示相关联的arc4标志。

在该范例中,数据段402包含图3所示的arc1和arc2的信息。文本文件的第30行中的4字节二进制内容“01430000”指示随后的4字节二进制内容具有弧信息。文本文件的第31行中的4字节二进制内容“00000005”表示弧信息的数据长度为5。由于弧信息的数据长度大于3,所以随后的4字节二进制内容顺序地指示源基本块、目的基本块1、弧1标志、目的基本块2和弧2标志。因此,文本文件的第32行中的4字节二进制内容“00000002”指示源基本块是bb2,文本文件的第33行中的4字节二进制内容“00000003”指示目的基本块1是bb3,文本文件的第34行的4个字节的二进制内容“00000005”指示相关arc1标志,在文本文件中的第35行的4个字节的二进制内容“00000004”表示目标基本块2是bb4,并且文本文件的第36行中的4字节二进制内容“00000001”指示相关联的arc2标志。

在该范例中,数据段406包含图3所示的bb4的信息。文本文件的第80行中的4字节二进制内容“01450000”指示随后的4字节二进制内容具有基本块信息。文本文件的第81行中的4字节二进制内容“00000008”指示基本块信息的数据长度为8。因此,文本文件的第82行中的4字节二进制内容“00000004”指示该基本块的序列号为4,并且文本文件的第87行中的4字节二进制内容“0000000a”指示源代码的第10行包括在该基本块中。

如图2所示,通过在处理器102上运行可执行二进制文件foo.out来执行源代码foo.c的程序。由于在源代码foo.c的编译期间由编译器gcc添加用于代码覆盖率的代码测试(code instrumentation),还通过运行可执行二进制文件foo.out来创建基本块跟踪文件(例如,foo.gcda),其中基本块跟踪文件foo.gcda记录指示源代码foo.c中的每个基本块被执行多少次的信息。换句话说,基本块跟踪文件foo.gcda记录与源代码foo.c.中的基本块的执行计数相关联的信息。

图5是根据本发明的实施例的表示基本块跟踪文件(例如,foo.gcda)的文本文件的示意图。从执行可执行二进制文件foo.out生成的基本块跟踪文件foo.gcda是一个二进制文件。为了说明的目的,将基本块跟踪文件foo.gcda转换为文本文件,然后在图5中示出。换句话说,图5中所示的文本文件5是由二进制文件转成的文本文件的文字内容。基本块跟踪文件foo.gcda可以是从执行可执行二进制文件foo.out输出的二进制文件。第一个字段表示文本文件中行的行号,第二个字段表示二进制文件中的位置(使用八进制表示法表示),第三个字段表示基本块跟踪文件foo.gcno的4字节二进制内容,其中4字节二进制内容的每个数字使用十六进制符号表示。从图3可以看出,当arc3和arc4的执行计数已知时,可以容易地推导出arc0、arc1、acr2、arc5和acr6的执行计数。因此,在已知arc3和arc4的执行计数之后,可以推导出基本块bb0-bb6的执行计数。例如,可以选择arc3和arc4(其执行计数可以用于推断基本块bb0-bb6的执行计数)以记录它们的执行计数,使得可以进一步减少用于保持跟踪数据的存储空间。在一些实施例中,用于确定所有弧中的至少一个探测弧(instrumented arc)(例如,arc3和arc4)的方式可以用于选择至少一个弧来记录其执行计数。记录在基本块跟踪文件foo.gcda中的arc3和arc4的执行计数可以被认为是指示源代码中的每个基本块已执行多少次的信息。当所有探测弧(例如,arc3和arc4)的执行计数被记录在基本块跟踪文件foo.gcda中时,可以从所有探测弧(例如,arc3和arc4)的执行计数导出所有基本块(例如,bb0-bb6)的执行计数。在该范例中,由于所有探测弧(例如,arc3和arc4)的执行计数可以指示所有基本块(例如,bb0-bb6)的执行计数,所以基本块跟踪文件foo.gcda可以仅记录所有探测弧(例如,arc3和arc4)的执行计数来节省文件大小。然而,这仅是为了说明的目的,并不意味着是对本发明的限制。

在该范例中,数据段502包含图3所示的探测弧(例如,arc3和arc4)的信息。文本文件第38行中的4字节二进制内容“01a10000”指示随后的4字节二进制内容具有探测弧信息。文本文件的第39行中的4字节二进制内容“00000004”指示探测弧信息的数据长度为4。每个探测弧的信息使用两个4字节二进制内容记录。因此,文本文件的第40和41行中的两个4字节二进制内容记录arc4的执行计数为0,并且文本文件的第42和43行中的两个4字节二进制内容记录arc3的执行计数是1。探测弧(例如,arc3和arc4)通过代码覆盖率工具中使用的相同排序算法排序。例如,编译器和代码覆盖率分析工具都跟随探测弧(例如,arc3和arc4)的顺序。以这种方式,不需要在基本块跟踪文件(例如,foo.gcda)中添加与探测弧(例如,arc3和arc4)相关联的标块文件foo.gcno和基本块跟踪文件foo.gcda给出的信息生成行跟踪文件(例如,coverage.info)。如上所述,基本块文件foo.gcno记录了源代码foo.c中的基本块的信息,基本块跟踪文件foo.gcda记录了表示源代码中每个基本块已被执行多少次的信息。由于源代码的每一行被分类为仅一个基本块,所以行跟踪文件coverage.info分别具有源代码的多个行的多个行跟踪记录。每个行跟踪记录指示源代码中的对应行已经执行了的次数。例如,每个行跟踪记录存储源代码中相应行的执行计数。

图7是根据本发明实施例的行跟踪文件(例如,coverage.info)的示意图。从代码覆盖率分析工具lcov的执行生成的行跟踪文件coverage.info可以是人类可读的纯文本文件。换句话说,图7所示的范例性行跟踪文件coverage.info可以是代码覆盖率分析工具lcov的执行的输出。然而,这仅是为了说明的目的,并不意味着是对本发明的限制。关于上述范例性源代码foo.c,行跟踪文件coverage.info的第7行中的一个行跟踪记录示出了源代码的第1行被执行一次,行跟踪文件的第8行中的一个行跟踪记录显示源代码的第4行被执行一次,行跟踪文件的第9行中的一个行跟踪记录显示源代码的第5行被执行一次,行跟踪文件的第10行中的一个行跟踪记录显示源代码的第7行被执行一次,行跟踪文件的第11行中的一个行跟踪记录显示源代码的第8行被执行一次,行跟踪文件的第12行中的一个行跟踪记录显示源代码的第10行被执行一次,并且行跟踪文件的第13行中的一行跟踪记录示出源代码的第12行被执行一次。

图8是根据本发明的实施例的代码覆盖率评估的第三阶段的示意图。代码覆盖率报告工具(例如,genhtml)是代码覆盖率工具105之一。当用户启用代码覆盖率报告功能时,代码覆盖率报告工具genhtml被处理器102加载并执行。代码覆盖率报告工具genhtml运行在处理器102上,根据从行跟踪文件coverage.info给出的信息计算源代码foo.c的代码覆盖率结果。接下来,生成的代码覆盖率结果被提供(例如,显示)在显示屏(具体地,显示屏106上的UI 107)上或以某些其他方式呈现。例如,在处理器102上运行的代码覆盖率报告工具genhtml将行跟踪文件coverage.info中的分析数据转换为具有诸如HTML(HyperText Markup Languag,简写为超文本标记语言)格式的人类可读格式的代码覆盖率结果。作为范例而非限制,代码覆盖率结果可以是源代码的执行百分比,或者可以是

如果代码覆盖率评估被应用于整个源代码,则图2所示的第一阶段,图6所示的第二阶段以及图8所示的第三阶段可以顺序地执行。然而,如上所述,源代码可以由关注区域(其包括源代码的感兴趣的行)和非关注区域(其包括源代码的不感兴趣的行)组成。例如,一个程序的源代码可以包括由不同软件工程师(或不同的软件开发团队)开发的不同代码段;并且当测试程序时,一个软件工程师(或一个软件开发团队)可能对源代码的仅一个代码段的代码覆盖率感兴趣。因此,本发明提出了一种关注区域代码覆盖率处理方法。关注区域代码覆盖率处理方法可以由图1所示的计算机系统100执行。例如,存储在存储设备104中的代码覆盖率工具105包括执行或调用提出的关注区域代码覆盖率处理方法所需的至少一部分或所有软件工具。关注区域代码覆盖率处理方法可以参考非关注区域设置SNCZ来生成并显示在源代码中的关注区域的代码覆盖率结果,而不对源代码进行任何修改。由于不对源代码进行修改,所以关注区域代码覆盖率处理方法对源代码的维护没有影响。

在一个范例性实施例中,非关注区域设置SNCZ可以由用户通过UI 107手动确定。图9是根据本发明的实施例的非关注区域选择的示意图。非关注区域选择工具是代码覆盖率工具105之一。在由用户启用的关注区域代码覆盖率处理方法之前或期间,非关注区域选择工具可以由处理器102加载和执行以生成源代码的非关注区域设置SNCZ。可以在显示屏106上为非关注区域选择工具提供(例如,显示)测试下的源代码的至少一部分(即,部分或全部)(例如,上述范例性源代码foo.c)在处理器102上运行。在该范例中,如果每次只能在UI 107中显示源代码的一部分,则用户可以控制UI 107来查看源代码的不同部分。当在显示屏106上提供(例如,显示)源代码的至少一部分时,在处理器102上运行的非关注区域选择工具接收至少一个用户输入USER_IN,其选择所提供/显示的源代码的至少一部分的至少一行,使得包括由至少一个用户输入USER_IN选择的至少一个行的源代码的至少一个基本块被视为非关注区域的一部分。在一些其它实施例中,可以提供关注区域选择工具以接收至少一个用户输入USER_IN,该用户输入USER_IN选择所提供/显示的源代码的至少一部分的至少一行,并且获取包括由至少一个用户输入USER_IN选择的至少一行的源代码的至少一个基本块作为关注区域的一部分,其在本公开中不受此限制。

在该范例中,由于不执行源代码foo.c的第10行,所以用户可以移动鼠标以在显示屏106上移动光标902,并且可以点击鼠标以选择范例性源代码foo.c的第10行作为非关注区域的一部分。应当注意,由于固有的基本块特性,可以自动选择包含源代码foo.c的所选择的第10行的完整基本块作为非关注区域的一部分。在包含源代码foo.c的所选择的第10行的基本块具有用户尚未选择的其他行的情况下,可以自动选择包括在该基本块中的其他行作为非关注区域的一部分,无需用户干预。在包含源代码foo.c的所选第10行的基本块仅具有一行的另一情况下,只有源代码foo.c的所选第10行被视为非关注区域的一部分。

例如,用户将光标902移动到源代码foo.c的第10行的开始处,然后按下鼠标的左按钮以使能选择源代码foo.c的第10行。对于另一个范例,用户将光标902移动到源代码foo.c的第10行的开始处,然后按下鼠标的右按钮以使能选择源代码foo.c的第10行。然而,这些仅是为了说明的目的,并不意味着是对本发明的限制。在替代设计中,一个或多个键盘键或任何其它输入设备也可以涉及源代码的非感兴趣行(例如,源代码foo.c的非感兴趣第10行)的选择。

在用户通过非关注区域选择工具选择了源代码的所有不感兴趣行之后,确定源代码的非关注区域。源代码由关注区域和非关注区域组成。因此,在源代码的非关注区域由非关注区域设置SNCZ确定之后,可以相应地确定源代码的关注区域。此时,非关注设置SNCZ可以由用于实现关注区域代码覆盖率评估的关注区域代码覆盖率工具引用。在一些其它实施例中,可以生成关注设置以由关注区域代码覆盖率工具引用以实现关注区域代码覆盖率评估,并且关注区域代码覆盖率工具可以根据这样的关注设置生成非关注设置SNCZ。

在第一个关注区域代码覆盖率评估设计中,由处理器102加载和执行的关注区域代码覆盖率工具将修改应用于图2所示的代码覆盖率评估的第一阶段。图10是根据本发明的实施例的代码覆盖率评估的修改的第一阶段的示意图。如图10所示,在处理器102上运行的关注区域代码覆盖率工具参考非关注区域设置SNCZ以修改前述基本块文件(例如,foo.gcno)和基本块跟踪文件(例如,foo.gcda)。例如,通过修改与属于非关注区域的至少一个基本块相关联的记录信息,基于原始基本块文件foo.gcno来生成修改的基本块文件,并且基于所述基本块跟踪文件foo.gcda,通过修改与属于所述非关注区域的所述至少一个基本块相关联的记录信息,生成修改的基本块跟踪文件。

请结合图4一并参考图11。图11是根据本发明实施例的表示修改的基本块文件的文本文件的示意图。为了说明的目的,将修改的基本块文件foo.gcno转换成文本文件,然后在图11中示出。具体地说,图11中所示的文本文件可以被看作是图4中所示的文本文件,其中对其进行了修改。因此,图11所示的文本文件是由二进制文件转成的文本文件的文字内容,基本块文件foo.gcno可能是从编译器输出的二进制文件,其是对图2所示的代码覆盖率评估的第一阶段应用提议的修改输出的二进制文件。如图2所示。如图3所示,源代码foo.c的第10行属于基本块bb4。由于非关注设置SNCZ指示代码覆盖率评估不应考虑基本块bb4(其包括源代码foo.c的不感兴趣第10行),所以数据段404中的所有4字节二进制内容(其包含图3所示的arc4的信息)被删除(这意味着从基本块文件foo.gcno中移除了arc4的信息的实际二进制内容),并且删除数据段406(其包含图3所示的bb4的信息)中的所有4字节二进制内容(这意味着从基本块文件foo.gcno中移除bb4的信息的实际二进制内容)。由于数据段402包含图3所示的arc1和arc2的信息,并且非关注基本块bb4与arc2相关联时,数据段402中的4字节二进制内容应当被适当地修改(即,实际包括在基本块文件foo.gcno中的相应二进制内容应该被适当地修改),以反映非关注基本块bb4的省略。如上所述,第31行中的4字节二进制内容表示弧信息的数据长度。由于省略了bb4和相关联的arc2,因此将第31行中的4字节二进制内容“00000005”修改为“00000003”(即,实际包括在基本块文件foo.gcno中的相应二进制内容被修改),意味着随后的4字节二进制内容顺序地指示一个源基本块、一个目的基本块和一个弧标志。另外,由于第35和36行中的4字节二进制内容记录目的基本块信息和arc2的标志信息,第35和36行中的4字节二进制内容被删除(这意味着从基本块文件foo.gcno中删除目的基本块信息和arc2的标志信息的实际二进制内容)。

请结合图5一并参考图12。图12是根据本发明实施例的表示修改的基本块跟踪文件的文本文件的示意图。为了说明的目的,将修改的基本块跟踪文件foo.gcda转换成文本文件,然后在图12中示出。具体地说,图12所示的文本文件可以被看作是图5中所示的文本文件,其中对其进行了修改。因此,图12所示的文本文件是由二进制文件转成的文本文件的文字内容,基本块文件foo.gcno可能是从编译器输出的二进制文件,其是对图2所示的代码覆盖率评估的第一阶段应用提议的修改输出的二进制文件。非关注设置SNCZ指示代码覆盖率评估不应考虑基本块bb4(其包括源代码foo.c的不感兴趣的第10行)。因此,应当适当地修改包含探测弧的信息(例如,图3所示的arc3和arc4)的数据段502(即,应当适当地修改实际包括在基本块跟踪文件foo.gcda中的相应二进制内容)以反映非关注基本块bb4的省略。如上所述,第39行中的4字节二进制内容表示弧信息的数据长度。由于探测弧arc3的信息被保持,所以删除探测弧arc4的信息,并且使用两个4字节的二进制内容来记录每个探测弧的信息,将第39行中的4字节二进制内容“00000004”修改为“00000002”(即,基本块跟踪文件foo.gcda中实际包括的相应二进制内容被修改)。另外,由于第40和41行中的4字节二进制内容记录了探测弧arc4的执行计数信息,因此删除了第40和41行中的4字节二进制内容(这意味着从基本块跟踪文件foo.gcda中删除探测弧arc4的执行计数信息的实际二进制内容)。

图10中所示的代码覆盖率评估的修改的第一阶段生成修改的基本块文件和修改的基本块跟踪文件作为图6所示的代码覆盖率评估的第二阶段的输入,使得代码覆盖率分析工具根据修改的基本块文件和修改的基本块跟踪文件创建行跟踪文件。因此,基于修改的基本块文件和修改的基本块跟踪文件创建的行跟踪文件不具有非关注区域(例如,源代码foo.c中的不感兴趣第10行)中的每行的执行计数信息。接下来,图6所示的代码覆盖率评估的第二阶段中接收到的行跟踪文件被用作图8所示的代码覆盖率评估的第三阶段的输入。由于行跟踪文件不具有非关注区域中(例如,源代码foo.c中的不感兴趣第10行)的每行的执行计数信息,所以代码覆盖率报告工具仅根据关注区域中的行的执行计数信息生成代码覆盖率结果。以这种方式,可以接收和提供(例如,由显示屏106显示)期望的关注区域代码覆盖率结果。

在第二个关注区域代码覆盖率评估设计中,在处理器102上运行的关注区域代码覆盖率工具对图6所示的代码覆盖率评估的第二阶段应用修改。图13是根据本发明的实施例的代码覆盖率评估的修改的第二阶段的示意图。由图2所示的代码覆盖率评估的第一阶段生成的基本块文件(例如,foo.gcno)和基本块跟踪文件(例如,foo.gcda)用作代码覆盖率评估的修改的第二阶段的输入。代码覆盖率分析工具根据基本块文件(例如,foo.gcno)和基本块跟踪文件(例如,foo.gcda)生成行跟踪文件(例如coverage.info)。接下来,在处理器102上运行的关注区域代码覆盖率工具参考非关注区域设置SNCZ以修改行跟踪文件。例如,通过修改(例如,移除)属于非关注区域的行的行跟踪记录(例如,源代码foo.c中的不感兴趣第10行的一个行跟踪记录)来生成修改的行跟踪文件。

请结合图7一并参考图14。图14是根据本发明的实施例的修改的行跟踪文件的示意图。如上所述,从代码覆盖率分析工具lcov的执行生成的行跟踪文件coverage.info可以是人类可读的纯文本文件。因此,所得到的修改的行跟踪文件coverage.info也可以是人类可读的纯文本文件。然而,这仅是为了说明的目的,并不意味着是对本发明的限制。由于非关注设置SNCZ指示基本块bb4(其包括源代码foo.c的不感兴趣第10行)不应被代码覆盖率评估考虑,且源代码foo.c的不感兴趣第10行的行跟踪记录被记录在行跟踪文件coverage.info的第12行中,行跟踪文件coverage.info的第12行中的行跟踪记录被去除。

图13所示的代码覆盖率评估的修改的第二阶段生成修改的行跟踪文件,作为图8所示的代码覆盖率评估的第三阶段的输入,使得代码覆盖率报告工具根据修改后的行跟踪文件生成代码覆盖率结果。由于修改后的行跟踪文件没有非关注区域中的每行的执行计数信息(例如,源代码foo.c中的不感兴趣第10行),所以代码覆盖率报告工具仅根据关注区域中的行的信息的执行计数生成代码覆盖率结果。以这种方式,可以接收和提供(例如,由显示屏106显示)期望的关注区域代码覆盖率结果。

在第三个关注区域代码覆盖率评估设计中,对图8所示的代码覆盖率评估的第三阶段进行修改。图15是根据本发明的实施例的代码覆盖率评估的修改的第三阶段的示意图。由图2所示的代码覆盖率评估的第一阶段生成的基本块文件(例如,foo.gcno)和基本块跟踪文件(例如,foo.gcda)被用作代码覆盖率评估的修改的第二阶段的输入,以及由图6所示的代码覆盖率评估的第二阶段生成的行跟踪文件(例如,coverage.info)用作代码覆盖率评估的修改的第三阶段的输入。在该实施例中,修改代码覆盖率报告工具以进一步接收非关注区域设置SNCZ。在处理器102上运行的修改的代码覆盖率报告工具计算代码覆盖率结果,而不考虑如非关注区域设置SNCZ所指示的属于非关注区域的行的行跟踪记录(例如,源代码foo.c中的非兴趣第10行的一行跟踪记录)。应当注意,根据非关注区域设置SNCZ,没有对行跟踪文件进行修改。修改的代码覆盖率报告工具的算法被配置为参考非关注区域设置SNCZ以在行跟踪文件中搜索属于非关注区域的行的行跟踪记录,并且进一步被配置为在进行代码覆盖率结果的计算时忽略属于所述非关注区域的行的所找到的行跟踪记录。换句话说,虽然修改的代码覆盖率报告工具接收具有关注区域中的每行的执行计数信息和非关注区域中的每行的执行计数信息的行跟踪文件,但是修改的代码覆盖率报告工具仅根据关注区域中的行的执行计数信息来计算代码覆盖率结果。以这种方式,可以接收和提供(例如,由显示屏106显示)期望的关注区域代码覆盖率结果。

在上述范例中,要用其代码覆盖率来评估的范例性源代码foo.c是以C编程语言编写的。然而,这仅是为了说明的目的,并不意味着是对本发明的限制。相同的发明概念可以应用于以不同的编程语言(例如,C++编程语言)编写的用于关注区域代码覆盖率评估的源代码。用于对以C++编程语言编写的源代码执行关注区域代码覆盖率评估的代码覆盖率工具105几乎与用于以C编程语言编写的源代码执行关注区域代码覆盖率评估所使用的相同。例如,用于编译以C编程语言编写的源代码的C编译器(例如,gcc)可以由用于编译以C++编程语言编写的源代码的C++编译器(例如,g++)代替。剩余的用于关注区域代码覆盖率评估的代码转换工具对于C源代码和C++源代码是相同的。此外,包括基本块文件、基本块跟踪文件和行跟踪文件的程序数据对于C关注区域代码覆盖率评估和C++关注区域代码覆盖率评估是相同的。

或者,相同的发明概念可以应用于以Java编程语言编写的源代码用于关注区域代码覆盖率评估。例如,可以采用对基本块跟踪文件所提出的修改以实现Java关注区域代码覆盖率评估。对于另一个范例,可以采用对代码覆盖率报告工具所提出的修改以实现Java关注区域代码覆盖率评估。

由于Java编程语言和C/C++编程语言之间的不同特性,用于Java源代码的代码覆盖率评估流程可能不同于用于C/C++源代码的代码覆盖率评估流程。例如,代码覆盖率工具105可以包括翻译器(interpreter)、JVM(Java虚拟机)和代码覆盖率报告工具(例如,JaCoCo(Java代码覆盖率)),如图16所示。翻译器将Java源代码翻译成Java字节码(bytecode),并且Java字节码由JVM执行。因为jacoco:coverage对象在Java环境下使用,所以基本块跟踪文件(例如,foo.exec)可以直接由JVM和jacoco:coverage对象生成,在解释Java源代码期间不添加任何代码探测。应该注意,像基本块跟踪文件foo.gcda一样,基本块跟踪文件foo.exec是一个二进制文件。接下来,代码覆盖率报告工具引入jacoco:report对象,以读取和分析基本块跟踪文件foo.exec,从而生成代码覆盖率结果。应当注意,在Java代码覆盖率评估期间生成的基本块跟踪文件foo.exec等价于在C/C++代码覆盖率评估期间生成的基本块文件foo.gcno和基本块跟踪文件foo.gcda的组合,并且Java代码覆盖率评估直接生成基于基本块跟踪文件foo.exec的代码覆盖率结果,而不创建任何行跟踪文件(然而,这是C/C++代码覆盖率评估所需要的)。

图16是根据本发明实施例的Java源代码的第一修改的代码覆盖率评估设计的示意图。如图16所示,在处理器102上运行的关注区域代码覆盖率工具参考非关注区域设置SNCZ来修改基本块跟踪文件(例如,foo.exec),使得修改的基本块跟踪文件被用作代码覆盖率报告工具的输入。例如,通过修改与属于非关注区域的至少一个基本块相关联的记录信息,基于基本块跟踪文件来生成修改的基本块跟踪文件。由于基本块跟踪文件在非关注区域中没有每个基本块的执行计数信息,所以代码覆盖率报告工具仅根据关注区域中的基本块的执行计数信息生成代码覆盖率结果。以这种方式,可以接收和提供(例如,由显示屏106显示)期望的关注区域代码覆盖率结果。

图17是根据本发明实施例的Java源代码的第二修改代码覆盖率评估设计的示意图。通过执行源代码的程序(例如,foo.java)生成的基本块跟踪文件(例如,foo.exec)被用作修改的代码覆盖率报告工具的输入。在该实施例中,修改代码覆盖率报告工具以进一步接收非关注区域设置SNCZ。在处理器102上运行的修改的代码覆盖率报告工具计算代码覆盖率结果,而不考虑属于非关注区域的基本块的信息,如由非关注区域设置SNCZ所指示的。应当注意,根据非关注区域设置SNCZ,没有对基本块跟踪文件(例如,foo.exec)进行修改。修改的代码覆盖率报告工具的算法被配置为参考非关注区域设置SNCZ以在基本块跟踪文件中搜索属于非关注区域的基本块的执行计数信息,并且进一步配置为在计算代码覆盖率结果时忽略所找到的属于非关注区域的基本块的执行计数信息。换句话说,虽然修改的代码覆盖率报告工具接收具有关注区域中的每个基本块的执行计数信息和非关注区域中的每个基本块的执行计数信息的基本块跟踪文件,修改后的代码覆盖率报告工具仅根据关注区域中的基本块的执行计数信息计算代码覆盖率结果。以这种方式,可以接收和提供(例如,由显示屏106显示)期望的关注区域代码覆盖率结果。

在上述范例中,相同的发明构思可以应用于用于关注区域代码覆盖率评估的C源代码、C++源代码和Java源代码。然而,这些仅是为了说明的目的,并不意味着是对本发明的限制。在实践中,使用所提出的技术(例如,修改基本块文件和基本块跟踪文件,修改行跟踪文件和修改代码覆盖率报告工具)之一的任何关注区域代码覆盖率评估设计落入本发明的范围。

尽管已经在文中使用不同的方法、设备以及系统来描述和示出了一些范例性的技术,但是本领域普通技术人员应当理解的是:可以在不脱离所要求保护的主题的情况下进行各种其它修改以及进行等同物替换。此外,在不脱离文中描述的中心构思的情况下,可以进行许多修改以使特定的情况适应于所要求保护的主题的教导。因此,意在所要求保护的主题不限制于所公开的特定范例,而且这样的要求保护的主题还可以包含落在所附权利要求的范围内的所有实施及它们的等同物。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1