首页 / 专利库 / 软件 / 黑盒测试 / 基于JVM的测试覆盖率统计方法及系统

基于JVM的测试覆盖率统计方法及系统

阅读:990发布:2020-06-25

专利汇可以提供基于JVM的测试覆盖率统计方法及系统专利检索,专利查询,专利分析的服务。并且本 发明 涉及 软件 测试技术领域,提供了一种基于JVM的测试 覆盖 率统计方法及系统。该方法包括步骤:S1.在JVM启动的同时将需要统计的类名作为参数传入;S2.判断 虚拟机 载入的类是否需要注入,若需要则执行步骤S3,否则直接执行步骤S4;S3.对需要统计的类进行字节码操作并回写入虚拟机;S4.虚拟机正常执行类操作,自动记录执行中的统计信息;S5.在虚拟机退出时,根据统计信息计算覆盖率并输出结果。本发明在不改变原有程序结构的 基础 上进行字节码注入,以 黑盒测试 的方式即可获得代码行级别的测试覆盖率,可对 软件代码 的测试覆盖度进行量化评估,为测试的充分性及测试 用例 的执行效率提供了有 力 的参考指标。,下面是基于JVM的测试覆盖率统计方法及系统专利的具体信息内容。

1.一种基于JVM的测试覆盖率统计方法,其特征在于,所述方法包括步骤:
S1,在JVM启动的同时将需要统计的类名作为参数传入;
S2,判断虚拟机载入的类是否需要注入,若需要则执行步骤S3,否则直接执行步骤S4;
S3,对需要统计的类进行字节码操作并回写入虚拟机;
S4,虚拟机正常执行类操作,自动记录执行中的统计信息;
S5,在虚拟机退出时,根据统计信息计算覆盖率并输出结果。
2.根据权利要求1所述的方法,其特征在于,步骤S5中,如果有多次执行结果,则合并计算多次执行结果后输出。
3.根据权利要求1所述的方法,其特征在于,步骤S1中,所述需要统计的类名以正则表达式的形式作为参数传入。
4.根据权利要求1所述的方法,其特征在于,步骤S2中,通过类名进行比较,判断载入的类是否需要进行字节码操作。
5.根据权利要求1所述的方法,其特征在于,步骤S3中,所述字节码操作包括:对字节码进行解析、注入处理;获得包、类、方法直接的结构关系记录在系统内存中。
6.根据权利要求5所述的方法,其特征在于,
所述对字节码进行解析处理包括:识别类文件字节码中的可执行代码,将代码以行为单位区分;
所述对字节码进行注入处理包括:在识别出的可执行代码的每一行之后插入统计该行代码被执行状况的代码。
7.根据权利要求5所述的方法,其特征在于,步骤S5中,所述根据统计信息计算覆盖率并输出结果的方法为:根据步骤S4记录的统计信息和步骤S3获得的结构关系进行计算,得到覆盖率数据并输出结果。
8.根据权利要求1所述的方法,其特征在于,步骤S4中,在自动记录执行中的统计信息之后,该方法还包括:将执行信息按包、类、方法分层统计记录。
9.一种基于JVM的测试覆盖率统计系统,其特征在于,所述系统包括:
传入模,用于在JVM启动的同时将需要统计的类名作为参数传入;
注入判断模块,用于判断虚拟机载入的类是否需要注入,若需要则交由字节码操作模块处理,否则直接交由执行模块处理;
字节码操作模块,用于对需要统计的类进行字节码操作并回写入虚拟机;
执行模块,用于使虚拟机正常执行类操作,自动记录执行中的统计信息;
计算输出模块,用于在虚拟机退出时,根据统计信息计算覆盖率并输出结果。
10.根据权利要求9所述的系统,其特征在于,所述计算输出模块中还包括:合并计算模块,用于在有多次执行结果时,合并计算多次执行结果后输出。

说明书全文

基于JVM的测试覆盖率统计方法及系统

技术领域

[0001] 本发明涉及软件测试技术领域,特别涉及一种基于JVM的测试覆盖率统计方法及系统。

背景技术

[0002] 计算机软件程序主要由人工开发完成,通常还会由多名开发人员共同完成,不可避免地会存在各类意想不到的错误。因此,软件产品在正式发布前要经过多次测试和修改,软件测试的最根本目的就是在软件产品发布前尽可能多地发现软件中的缺陷,以保证正式产品的质量。其中黑盒测试是从用户度出发,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,对程序的输入输出进行测试,黑盒测试主要针对软件界面和软件功能进行测试,是最实用的软件测试方式之一。
[0003] 现有的软件测试理论已经基本成熟,绝大多数测试方式均可以通过自动手段来实现测试过程,对于黑盒测试来说,如果能为每个测试过程选择适当的测试用例,可有效地设计出高效的自动测试过程。但是,随着待测试软件系统的日益庞大,测试的工作量呈指数级增长,给软件黑盒测试工作带来了很多新的问题。由于黑盒测试只针对需求创建测试用例做外部的覆盖测试,在需求不详细的情况下,有极大可能测试用例无法涵盖全部软件代码,造成测试不完备。在测试不完备的情况下,极易漏检系统BUG,给产品质量带来许多不确定性的隐患。要保证测试的充分性和完备性,只有采取各种措施提高测试用例的代码覆盖率。
[0004] 但现有技术中,黑盒测试并不考虑程序内部结构和内部特性,无法像白盒测试一样直接针对源代码级别进行处理,只能在测试之后根据收集的结果数据进行后验的结果推算,难以直接获得测试的代码覆盖率数据,推算结果也经常存在较大偏差。没有代码覆盖率数据的情况下显然不可能正确评估测试的充分性和完备性,更谈不上对其进行改进。而如果放弃黑盒测试只依赖于白盒测试,又会使测试成本过于昂贵,效率低下。

发明内容

[0005] (一)要解决的技术问题
[0006] 为了解决现有技术中无法直接获得黑盒测试代码覆盖率数据的问题,本发明提供了一种基于JVM的测试覆盖率统计方法及系统。
[0007] (二)技术方案
[0008] 为解决上述技术问题,本发明采用如下的技术方案实施:
[0009] 首先,本发明提供一种基于JVM的测试覆盖率统计方法,所述方法包括步骤:
[0010] S1,在JVM启动的同时将需要统计的类名作为参数传入;
[0011] S2,判断虚拟机载入的类是否需要注入,若需要则执行步骤S3,否则直接执行步骤S4;
[0012] S3,对需要统计的类进行字节码操作并回写入虚拟机;
[0013] S4,虚拟机正常执行类操作,自动记录执行中的统计信息;
[0014] S5,在虚拟机退出时,根据统计信息计算覆盖率并输出结果。
[0015] 优选地,步骤S5中,如果有多次执行结果,则合并计算多次执行结果后输出。
[0016] 优选地,步骤S1中,所述需要统计的类名以正则表达式的形式作为参数传入。
[0017] 优选地,步骤S2中,通过类名进行比较,判断载入的类是否需要进行字节码操作。
[0018] 优选地,步骤S3中,所述字节码操作包括:对字节码进行解析、注入处理;获得包、类、方法直接的结构关系记录在系统内存中。
[0019] 优选地,所述对字节码进行解析处理包括:识别类文件字节码中的可执行代码,将代码以行为单位区分;
[0020] 所述对字节码进行注入处理包括:在识别出的可执行代码的每一行之后插入统计该行代码被执行状况的代码。
[0021] 优选地,步骤S5中,所述根据统计信息计算覆盖率并输出结果的方法为:根据步骤S4记录的统计信息和步骤S3获得的结构关系进行计算,得到覆盖率数据并输出结果。
[0022] 优选地,步骤S4中,在自动记录执行中的统计信息之后,该方法还包括:将执行信息按包、类、方法分层统计记录。
[0023] 另一方面,本发明还同时提供一种基于JVM的测试覆盖率统计系统,所述系统包括:
[0024] 传入模,用于在JVM启动的同时将需要统计的类名作为参数传入;
[0025] 注入判断模块,用于判断虚拟机载入的类是否需要注入,若需要则交由字节码操作模块处理,否则直接交由执行模块处理;
[0026] 字节码操作模块,用于对需要统计的类进行字节码操作并回写入虚拟机;
[0027] 执行模块,用于使虚拟机正常执行类操作,自动记录执行中的统计信息;
[0028] 计算输出模块,用于在虚拟机退出时,根据统计信息计算覆盖率并输出结果。
[0029] 优选地,所述计算输出模块中还包括:合并计算模块,用于在有多次执行结果时,合并计算多次执行结果后输出。
[0030] (三)有益效果
[0031] 在本发明的技术方案中,在不改变原有程序结构的基础上进行字节码注入,执行过程中进行动态统计,以黑盒测试的方式即可获得代码行级别的测试覆盖率,因而可对软件每个版本及整体代码的测试覆盖度进行量化评估,为测试的充分性及测试用例的执行效率提供了有的参考指标。附图说明
[0032] 图1为本发明中基于JVM的测试覆盖率统计方法的流程示意图;
[0033] 图2为本发明的一个实施例中java示例的类代码;
[0034] 图3为本发明的一个实施例中虚拟机执行情况示意图;
[0035] 图4为本发明的一个实施例中XML格式记录的输出结果示意图;
[0036] 图5为本发明的一个实施例中输出结果的HTML文档展示内容示意图。

具体实施方式

[0037] 下面将结合各附图对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0038] 黑盒测试由于自动化程度高,无需人工阅读分析源代码,加上其从用户角度出发进行测试,是相当高效、易理解和实用的测试方式,因而是目前软件测试中必不可少的一种测试方式。但如上所述,黑盒测试也存在着一些明显的缺陷,比如无法获知测试代码覆盖率,不能保证测试的充分性和完备性,在需求不详细的情况下极易漏检系统BUG,更无法有针对性地调整测试用例以提高测试完备性。
[0039] 鉴于上述问题的根源在于现有技术中不存在用于黑盒测试的代码覆盖率统计方案,本发明的首要目的就是提供一种测试覆盖率统计方法,更进一步地,该方法是基于JVM(java虚拟机,在本发明中简称为“虚拟机”)的测试覆盖率统计方法。在本发明的实施例中,如图1所示,该方法具体包括步骤:
[0040] S1,在JVM启动的同时将需要统计的类名作为参数传入;
[0041] S2,判断虚拟机载入的类是否需要注入,若需要则执行步骤S3,否则直接执行步骤S4;
[0042] S3,对需要统计的类进行字节码操作并回写入虚拟机;
[0043] 该步骤中,需要统计的类即为步骤S2中的判断结果为需要注入的类。
[0044] S4,虚拟机正常执行类操作,自动记录执行中的统计信息;
[0045] S5,在虚拟机退出时,根据统计信息计算覆盖率并输出结果。
[0046] 其中,在上述方法的步骤S5中,如果有多次执行结果,即步骤S4中虚拟机正常执行类操作时多次执行某些代码,则在步骤S5中要合并计算多次执行结果后输出。输出结果可以采用XML格式保存,最终的结果以HTML或XML文档形式展示给测试人员。测试人员根据该结果可以对测试效果有一个全局的把控,因而能准确了解测试是否完备,并根据情况进行衡量,判断是否适当补充部分测试用例以改善测试。
[0047] 下面更进一步地以一段java程序为例具体说明本发明方法的各个步骤是如何实现的。如图2所示的是一个基本的HelloWorld类,其中定义了一个布尔值,利用if语句,判断为真的执行一次,判断为假的没有执行;同时采用for语句循环10次。
[0048] 具体地,步骤S1中,本发明提供的方法随JVM一同启动,将需要统计的类名(即上述HelloWorld类)以正则表达式的形式作为参数传入。
[0049] 步骤S2中,判断虚拟机载入的类是否需要注入的方法为:从虚拟机接口获得载入的类,通过类名进行比较,判断虚拟机载入的类是否需要注入,即判断载入的类是否需要进行字节码操作。具体地,依据待测试产品的包名进行判断,来区分是java系统包还是待测试包,如果是待测试包,则其中的载入类需要进行字节码操作,执行步骤S3;如果是java系统包,则其中的载入类无需进行字节码操作,直接执行步骤S4。图2示例的类属于testpackage包,是待测试包,因而需要进行字节码操作。
[0050] 步骤S3中,对需要统计的类所进行的字节码操作包括:获得载入类的字节码;对字节码进行解析、注入处理;获得包、类、方法直接的结构关系记录在系统内存中。上述的对字节码进行解析、注入处理与获得包、类、方法直接的结构关系记录在系统内存中这两种字节码操作可以同时执行,也可以先后执行。然后,将处理好的字节传回虚拟机。
[0051] 具体地,对字节码进行解析处理包括:识别类文件字节码中的可执行代码;将代码以行为单位区分。解析处理可以采用现有的字节码解析工具实现,比如通过对字节码的反编译获得代码的行号。而对字节码进行注入处理则包括:在识别出的可执行代码的每行之后插入统计该行代码被执行状况的代码,比如插入一段计数器代码,在对应的该行代码被执行一次的同时执行该计数器代码,以计数器的累加值来统计该行代码的被执行次数。
[0052] 仍以图2的代码为例,当该类的main方法中System.out.println(“hello world”)这一行代码被反编译后识别出其行号为14时,在其后立刻插入一个预定义的计数器方法_runs,比如_runs(14,main,()V);该方法第一个参数是识别的代码的原行号,第二个是方法名,第三个是形参加返回值。在插入方法代码的同时系统会生成一个数据结构,这样在上述第14行代码(即System.out.println(“hello world”);)被执行的同时该方法也会被调用执行,而每被调用执行一次计数器值加一,同时会自动向数据结构中记录对应的行号、被执行次数和方法名等,便于后续的分层统计。由于这样的代码具有很强的通用性,测试人员只需预先定义需要统计的类,随后在每一行可执行代码后进行自动注入上述计数器方法即可,大大提高了统计效率和测试的自动化程度。
[0053] 步骤S4中,虚拟机正常执行类操作,使程序以原有方式正常运行,在自动记录执行中的统计信息之后,由于测试包的载入类中注入了字节码,在执行字节码时就可以获得代码执行情况的相关信息,即获得执行信息,因此,该步骤还包括:将获得的执行信息按包、类、方法分层统计记录。执行情况的一个示例如图3所示。
[0054] 步骤S5中,在虚拟机退出时,要根据统计信息计算覆盖率并输出结果,这里,根据统计信息计算覆盖率并输出结果的方法可以为:根据步骤S4记录的统计信息和步骤S3获得的结构关系进行计算,得到覆盖率数据并输出结果。更进一步地,代码的结构关系通常逻辑分层为包→类→方法→行,即一个包中有不同的类文件,类文件由方法组成,方法由代码行组成;这样,计算的方法覆盖率即等于方法执行的行/方法总行数,类覆盖率即等于类中所有方法执行的行之和/类中所有方法总行数,包覆盖率即等于包中所有类执行的行之和/包中所有类的总行数。
[0055] XML格式的一个输出结果示例如图4所示,其中,coverage项中,line-rate表示覆盖度、lines-covered表示执行的行数、lines-valid表示有效行、version表示工具版本、timestamp表示生成时间;package项中,name表示包名、line-rate表示覆盖度;class项中,name表示类名、filename表示类所处的文件名、line-rate表示覆盖度;method项中,name表示方法名、signature表示形参加返回值(一个方法的唯一性方法名、形参共同决定)、line-rate表示覆盖度;line项中,number表示文件中的行号、run表示执行的次数。根据图4的结果,生产的HTML文档的展示示例如图5所示,根据该展示,测试人员可以直观地得到测试覆盖率和代码执行情况,从而可以有针对性地进行调整以保证测试的完备性。
[0056] 此外,本领域普通技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,包括上述实施例方法的各步骤,而所述的存储介质可以是:ROM/RAM、磁碟、光盘、存储卡等。因此,与本发明的方法相对应的,本发明还同时包括一种基于JVM的测试覆盖率统计系统,该系统包括:
[0057] 传入模块,用于在JVM启动的同时将需要统计的类名作为参数传入;
[0058] 注入判断模块,用于判断虚拟机载入的类是否需要注入,若需要则交由字节码操作模块处理,否则直接交由执行模块处理;
[0059] 字节码操作模块,用于对需要统计的类进行字节码操作并回写入虚拟机;
[0060] 执行模块,用于使虚拟机正常执行类操作,自动记录执行中的统计信息;
[0061] 计算输出模块,用于在虚拟机退出时,根据统计信息计算覆盖率并输出结果。
[0062] 在本发明提出的基于JVM的测试覆盖率统计系统中,计算输出模块中还可以包括合并计算模块,该合并计算模块用于在有多次执行结果时,合并计算多次执行结果后输出。
[0063] 综上所述,在本发明的技术方案中,在不改变原有程序结构的基础上进行字节码注入,执行过程中进行动态统计,以黑盒测试的方式即可获得代码行级别的测试覆盖率,因而可对软件每个版本及整体代码的测试覆盖度进行量化评估,为测试的充分性及测试用例的执行效率提供了有力的参考指标。此外,本发明对系统的性能影响小,几乎不影响正常测试过程;由于版本更替时不需要做任何额外操作,部署极为方便,具有很强的实用性。
[0064] 以上实施方式仅用于说明本发明,而并非对本发明的限制,有关技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈