一种确定代码执行覆盖率的方法和装置制造方法

文档序号:6491759阅读:229来源:国知局
一种确定代码执行覆盖率的方法和装置制造方法
【专利摘要】本发明提供了一种确定代码执行覆盖率的方法和装置,其中方法包括:S1、通过对被测脚本程序的解析确定可执行代码以及可执行代码的位置信息,利用可执行代码的位置信息生成key写入数据库;S2、在所述被测脚本程序的执行过程中,将执行代码的执行状况信息在所述数据库中针对执行代码对应的key进行标注;S3、利用所述数据库中的执行代码数量和可执行代码数量的比值确定所述被测脚本程序的执行覆盖率。本发明能够提高所统计的被测脚本程序的执行覆盖状况的准确性。
【专利说明】一种确定代码执行覆盖率的方法和装置
【【技术领域】】
[0001]本发明涉及计算机应用中的软件测试【技术领域】,特别涉及一种确定代码执行覆盖率的方法和装置。
【【背景技术】】
[0002]Shell脚本指放在一个文件中的一系列Linux命令和实用程序,在shell脚本的测试过程中,代码的行覆盖率是评价测试活动覆盖产品代码的一项重要指标,体现了代码执行覆盖状况。
[0003]现有确定shell脚本程序的代码执行覆盖状况的方式主要是通过系统的执行日志来判断代码的行覆盖率,诸如Shcov工具。然而现有这种通过分析执行日志来统计行覆盖率的方式,由于忽略了被测脚本程序执行的细节,并不能真实反映程序的执行情况,尤其是在被测脚本程序出现命令跨行、文件重名时不能正确的确定被测脚本程序的执行覆盖状况,准确性较差,并且被测脚本程序使用诸如awk等处理命令时,awk内部的代码无法统计行覆盖率。

【发明内容】

[0004]有鉴于此,本发明提供了一种确定代码执行覆盖率的方法和装置,以便于提高所统计的被测脚本程序 的执行覆盖状况的准确性。
[0005]具体技术方案如下:
[0006]一种确定代码执行覆盖率的方法,该方法包括:
[0007]S1、通过对被测脚本程序的解析确定可执行代码以及可执行代码的位置信息,利用可执行代码的位置信息生成key写入数据库;
[0008]S2、在所述被测脚本程序的执行过程中,将执行代码的执行状况信息在所述数据库中针对执行代码对应的key进行标注;
[0009]S3、利用所述数据库中的执行代码数量和可执行代码数量的比值确定所述被测脚本程序的执行覆盖率。
[0010]根据本发明一优选实施例,所述步骤SI具体包括:
[0011]S11、从解析器对被测脚本程序的解析结果中获取可执行代码;
[0012]S12、计算各可执行代码的签名并作为对应可执行代码的key写入数据库,其中所述可执行代码的签名由可执行代码所属的文件标识和可执行代码在被测脚本程序中的位置信息计算得到。
[0013]根据本发明一优选实施例,所述步骤S2具体包括:
[0014]S21、在代码执行装置执行被测脚本程序过程中获取执行代码;
[0015]S22、依据执行代码所属的文件标识和执行代码在被测脚本程序中的位置信息计算签名,针对所述数据库中该签名对应的key标注执行代码状态。
[0016]根据本发明一优选实施例,所述在被测脚本程序中的位置信息包括行号和行内偏移。
[0017]根据本发明一优选实施例,通过在所述解析器增加插件的方式使得所述解析器在针对被测脚本程序生成语法树的过程中对每个节点注入标识信息,所述标识信息包括每个节点的文件标识和在被测脚本程序中的位置信息,所述语法树的节点为可执行代码;通过在所述代码执行装置中增加插件的方式使得所述代码执行装置在执行到解析器生成的语法树的节点时,发送被执行节点的信息;
[0018]在所述步骤Sll中,从所述语法树中获取可执行代码;
[0019]在所述步骤S21中,从所述代码执行装置发送的被执行节点的信息获取执行代码。
[0020]根据本发明一优选实施例,在所述步骤S2中在所述数据库中针对执行代码对应的key进一步标注执行次数,在向测试人员反馈所述执行覆盖率时,进一步反馈各执行代码的执行次数。
[0021]一种确定代码执行覆盖率的装置,该装置包括:
[0022]解析信息标注单元,用于通过对被测脚本程序的解析确定可执行代码以及可执行代码的位置信息,利用可执行代码的位置信息生成key写入数据库;
[0023]执行信息标注单元,用于在所述被测脚本程序的执行过程中,将执行代码的执行状况信息在所述数据库中针对执行代码对应的key进行标注;
[0024]标注信息解析单元,用于利用所述数据库中的执行代码数量和可执行代码数量的比值确定所述被测脚本程序的执行覆盖率。
[0025]根据本发明一优选实施例,所述解析信息标注单元具体包括:
[0026]第一代码获取模块,用于从解析器对被测脚本程序的解析结果中获取可执行代码;
[0027]第一信息标注模块,用于计算各可执行代码的签名并作为对应可执行代码的key写入数据库,其中所述可执行代码的签名由可执行代码所属的文件标识和可执行代码在被测脚本程序中的位置信息计算得到。
[0028]根据本发明一优选实施例,所述执行信息标注单元具体包括:
[0029]第二代码获取模块,用于在代码执行装置执行被测脚本程序过程中获取执行代码;
[0030]第二信息标注模块,用于依据执行代码所属的文件标识和执行代码在被测脚本程序中的位置信息计算签名,针对所述数据库中该签名对应的key标注执行代码状态。
[0031]根据本发明一优选实施例,所述在被测脚本程序中的位置信息包括行号和行内偏移。
[0032]根据本发明一优选实施例,该装置还包括:
[0033]安装在解析器中的插件,用于在所述解析器针对被测脚本程序生成语法树的过程中对每个节点注入标识信息,所述标识信息包括每个节点的文件标识和在被测脚本程序中的位置信息,所述语法树的节点为可执行代码;
[0034]安装在代码执行装置中的插件,用于在所述代码执行装置执行到解析器生成的语法树的节点时,发送被执行节点的信息;
[0035]所述第一代码获取模块从所述语法树中获取可执行代码;[0036]所述第二代码获取模块从所述被执行节点的信息获取执行代码。
[0037]根据本发明一优选实施例,所述执行信息标注单元在所述数据库中针对执行代码对应的key进一步标注执行次数;
[0038]所述标注信息解析单元在向测试人员反馈所述执行覆盖率时,进一步反馈各执行代码的执行次数。
[0039]由以上技术方案可以看出,本发明通过可执行代码的位置信息唯一标识可执行代码,基于此对执行代码的执行状况在数据库中进行标注,进一步利用所述数据库中的执行代码数量和可执行代码数量的比值确定被测脚本程序的执行覆盖率,从而实现了基于执行代码的代码覆盖状况确定,即便存在命令跨行、文件重名等状况仍能够准确地确定被测脚本程序的执行覆盖状况,相比较现有行覆盖率的统计方法准确性更高。
【【专利附图】

【附图说明】】
[0040]图1为本发明实施例一提供的确定代码执行覆盖率的方法流程图;
[0041]图2为本发明实施例二提供的确定代码执行覆盖率的装置结构图。
【【具体实施方式】】
[0042]为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。
[0043]本发明主要通过三个主要过程来完成代码执行覆盖率的确定,即代码解析信息标注过程、代码执行信息标注过程和标注信息解析过程。在代码解析信息标注过程中主要通过对被测脚本程序的解析确定可执行代码以及可执行代码的位置信息,并利用可执行代码的位置信息生成key写入数据库。代码执行信息标注过程主要是在被测脚本程序的执行过程中对执行代码在数据库中进行标注。标注信息解析过程主要是利用数据库中的执行代码数量和可执行代码数量确定被测脚本程序的执行覆盖率。下面通过实施例一对该方法中的三个过程进行详细描述。
[0044]实施例一、
[0045]图1为本发明实施例一提供的确定代码执行覆盖率的方法流程图,如图1所示,该方法包括以下步骤:
[0046]步骤101:从解析器对被测脚本程序的解析结果中获取可执行代码。
[0047]解析器对被测脚本程序进行的解析实际上是将被测脚本程序通过词法分析后,得到一系列的单词或特殊字符,然后再经过语法解析将上述单词和特殊字符识别为关键字、修饰符和命令等,然后将识别出的可执行命令生成可执行的语法树。该语法树的每个节点都可以理解为一个可执行命令。后续代码执行装置会获取该语法树进行执行。该解析器可以是一个单独的装置,也可以是代码执行装置中的解析器,即代码执行装置在执行被测脚本程序过程中,解析器会将被测脚本程序解析为一系列可执行代码,再对这些可执行代码进行执行。
[0048]在本步骤中可以通过在解析器增加插件的方式,解析器在生成语法树的过程中,会对每个节点注入标识信息,记录每个节点的文件标识和在被测脚本程序中的位置信息,即本发明实施例中修改了语法树的结构体。[0049]在本发明实施例中以文件为单位对可执行代码进行区分,即可执行代码对应唯一的文件标识,采用这种文件标识的方式可以区分不同目录文件下的可执行代码,注入语法树的文件标识可以计算签名后将文件标识的签名进行注入。对于各可执行代码而言其在被测脚本程序中具有唯一的位置信息,该位置信息表现为在被测脚本程序中的行号和起始位置中的至少一种,行号能够对属于不同代码行的可执行代码进行区分,起始位置能够对属于同一行的可执行代码进行区分,可以表现为行内偏移。当同时采用行号和起始位置时就能够唯一标识给定被测脚本程序中的可执行代码,再结合文件标识就能够唯一标识可执行代码。
[0050]步骤102:依据各可执行代码文件标识和在被测脚本程序中的位置信息计算签名,将计算得到的各签名分别作为对应可执行代码的key写入数据库。
[0051]从解析器生成的语法树的各节点能够得到被测脚本程序的可执行代码,从各节点的标识信息能够获取文件标识和各可执行代码在被测脚本程序中的位置信息。
[0052]在数据库中采用key的形式唯一标识各可执行代码,以便后续在数据库中进一步对执行代码的执行状况进行记录和区分。这里各可执行代码对应的key是由对应可执行代码的文件标识和位置信息计算签名得到的。这里计算签名的方式可以包括但不限于MD5、DSA等算法,本发明对签名的具体计算方式并不加以限制。
[0053]上述两个步骤是代码解析信息标注过程,此时的数据库中建立了各可执行代码的key并可以记录对应可执行代码的位置信息。
[0054]步骤103:在代码执行装置执行被测脚本程序过程中获取执行代码。
[0055]在本发明实施例中可以通过在代码执行装置中增加插件的方式,使得代码执行装置在执行到解析器生成的语法树的节点时,发送被执行节点的信息,这些被执行节点就是执行代码,相应地,被执行节点的信息就包括:执行代码和执行代码的位置信息,具体包括执行代码的文件标识和执行代码在被测脚本程序中的位置信息。
[0056]步骤104:依据执行代码的文件标识和在被测脚本程序中的位置信息计算签名,针对数据库中该签名对应的key标注执行代码状态。
[0057]这里执行代码在被测脚本程序中的位置信息同样可以表现为在被测脚本程序中的行号和起始位置中的至少一种,采用和步骤102中所述相同的方式计算签名,将得到的签名在数据库中进行查询,确定匹配的key,说明该key标识的可执行代码和该执行代码是同一个代码。在数据库中针对匹配得到的key标注执行代码状态,该执行代码状态就是标识该代码被执行,例如在步骤102将各key写入数据库时,默认所有状态用“O”标识未执行,在步骤104时对执行代码的签名匹配得到的key,将对应的状态修改为“I”标识已执行,当然还可以采用其他标识方式,在此不再一一举例。
[0058]另外,还可以进一步统计代码执行装置对各执行代码的执行次数,并在数据库中针对对应的key标注执行次数。
[0059]上述步骤103和步骤104是代码执行信息标注过程,此时的数据库中存在各key对应的可执行代码的执行状态信息,还可能进一步包含执行次数信息。
[0060]步骤105:对数据库中的执行代码数量和可执行代码数量进行统计。
[0061]数据库中所有签名所形成key的数量就是可执行代码数量,标注执行代码状态的key的数量就是执行代码数量。[0062]步骤106:将执行代码数量与可执行代码数量的比值确定为被测脚本程序的执行
覆盖率。
[0063]本发明实施例中被测脚本程序的执行覆盖率不同于通常所说的行覆盖率,行覆盖率以行为单位体现被测脚本程序的执行覆盖状况,粒度太大,忽略执行细节,对于命令跨行、文件重名时统计的准确率较差,而执行覆盖率则以可执行代码为单位体现被测脚本程序的执行覆盖状况,且以文件标识和可执行代码的位置信息唯一标识各可执行代码,从而准确地体现执行覆盖状况。
[0064]上述步骤105和步骤106是标注彳目息解析过程。
[0065]步骤107:将被测脚本程序的执行覆盖率反馈给测试人员,还可以进一步反馈各执行代码的执行次数。
[0066]如果测试人员想得到行覆盖率,则本发明实施例还可以进一步依据数据库中的信息确定行覆盖率,即首先确定被测脚本程序的总代码行数,再从数据库中确定执行代码覆盖的所有行数,利用执行代码覆盖的所有行数与总代码行数的比值得到被测脚本程序的行
覆盖率。
[0067]以上是对本发明所提供的方法进行的描述,下面通过实施例二对本发明提供的装置进行详细描述。
[0068]实施例二、
[0069]图2为本发明实施例二提供的确定代码执行覆盖率的装置结构图,如图2所示,该装置包括:解析信息标注单元210、执行信息标注单元220和标注信息解析单元230。
[0070]首先,解析信息标注单元210通过对被测脚本程序的解析确定可执行代码以及可执行代码的位置信息,利用可执行代码的位置信息生成key写入数据库。
[0071 ] 具体地,解析信息标注单元210可以包括:第一代码获取模块211和第一信息标注模块212。
[0072]第一代码获取模块211从解析器对被测脚本程序的解析结果中获取可执行代码。具体可以通过在解析器增加插件的方式。
[0073]安装在解析器中的插件在解析器针对被测脚本程序生成语法树的过程中对每个节点注入标识信息,该标识信息包括每个节点的文件标识和在被测脚本程序中的位置信息,其中语法树的节点为可执行代码。第一代码获取模块211从上述语法树中获取可执行代码。
[0074]该解析器可以是一个单独的装置,也可以是代码执行装置中的解析器,即代码执行装置在执行被测脚本程序过程中,解析器会将被测脚本程序解析为一系列可执行代码,再对这些可执行代码进行执行。
[0075]第一信息标注模块212计算各可执行代码的签名并作为对应可执行代码的key写入数据库,其中可执行代码的签名由可执行代码所属的文件标识和可执行代码在被测脚本程序中的位置信息计算得到。此时的数据库中建立了各可执行代码的key并可以记录对应可执行代码的位置信息。
[0076]在可执行代码在被测脚本程序中的位置信息可以包括可执行代码的行号和行内偏移,从而结合文件标识唯一标识可执行代码。计算签名的方式可以包括但不限于MD5、DSA
等算法。[0077]然后,执行信息标注单元220在被测脚本程序的执行过程中,将执行代码的执行状况信息在数据库中针对执行代码对应的key进行标注。
[0078]具体地,执行信息标注单元220可以包括:第二代码获取模块221和第二信息标注模块222。
[0079]其中第二代码获取模块221在代码执行装置执行被测脚本程序过程中获取执行代码。在获取执行代码时也可以通过在代码执行装置中增加插件的方式实现。即安装在代码执行装置中的插件在代码执行装置执行到解析器生成的语法树的节点时,发送被执行节点的信息。第二代码获取模块221从该发送的被执行节点的信息就可以获取到执行代码。
[0080]第二信息标注模块222依据执行代码所属的文件标识和执行代码在被测脚本程序中的位置信息计算签名,针对数据库中该签名对应的key标注执行代码状态。此时的数据库中存在各key对应的可执行代码的执行状态信息。
[0081]在执行代码在被测脚本程序中的位置信息可以包括执行代码的行号和行内偏移,从而结合文件标识唯一标识可执行代码。计算签名的方式可以包括但不限于MD5、DSA等算法。
[0082]执行代码的状态就是标识可执行代码是否被执行,例如可以在第一信息标注模块212将各key写入数据库时,默认所有状态用“O”标识未执行,在第二信息标注模块222对执行代码的签名匹配得到key,将对应的状态修改为“I”标识已执行。
[0083]标注信息解析单元230,用于利用数据库中的执行代码数量和可执行代码数量的比值确定被测脚本程序的执行覆盖率。
[0084]另外,执行信息标注单元220在数据库中可以针对执行代码对应的key进一步标注执行次数。标注信息解析单元230可以向测试人员反馈被测脚本程序的执行覆盖率,在向测试人员反馈执行覆盖率时,可以进一步反馈各执行代码的执行次数供测试人员参考。
[0085]如果测试人员想得到行覆盖率,则标注信息解析单元230还可以进一步依据数据库中的信息确定行覆盖率,即首先确定被测脚本程序的总代码行数,再从数据库中确定执行代码覆盖的所有行数,利用执行代码覆盖的所有行数与总代码行数的比值得到被测脚本程序的行覆盖率。
[0086]由以上描述可知,本发明提供的方法和装置具备以下优点:
[0087]I)相比较现有行覆盖率的统计方法,本发明确定出的执行覆盖率能够更加准确地体现被测脚本程序的执行覆盖状况。
[0088]2)也无需对被测脚本程序进行修改,消除了修改代码带来的运行和统计风险。
[0089]以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
【权利要求】
1.一种确定代码执行覆盖率的方法,其特征在于,该方法包括: S1、通过对被测脚本程序的解析确定可执行代码以及可执行代码的位置信息,利用可执行代码的位置信息生成key写入数据库; S2、在所述被测脚本程序的执行过程中,将执行代码的执行状况信息在所述数据库中针对执行代码对应的key进行标注; S3、利用所述数据库中的执行代码数量和可执行代码数量的比值确定所述被测脚本程序的执行覆盖率。
2.根据权利要求1所述的方法,其特征在于,所述步骤SI具体包括: S11、从解析器对被测脚本程序的解析结果中获取可执行代码; S12、计算各可执行代码的签名并作为对应可执行代码的key写入数据库,其中所述可执行代码的签名由可执行代码所属的文件标识和可执行代码在被测脚本程序中的位置信息计算得到。
3.根据权利要求2所述的方法,其特征在于,所述步骤S2具体包括: S21、在代码执行装置执行被测脚本程序过程中获取执行代码; S22、依据执行代码所属的文件标识和执行代码在被测脚本程序中的位置信息计算签名,针对所述数据库中该签名对应的key标注执行代码状态。
4.根据权利要求2或3所述的方法,其特征在于,所述在被测脚本程序中的位置信息包括行号和行内偏移。
5.根据权利要求3所述的方法,其特征在于,该方法还包括:通过在所述解析器增加插件的方式使得所述解析器在针对被测脚本程序生成语法树的过程中对每个节点注入标识信息,所述标识信息包括每个节点的文件标识和在被测脚本程序中的位置信息,所述语法树的节点为可执行代码;通过在所述代码执行装置中增加插件的方式使得所述代码执行装置在执行到所述语法树的节点时,发送被执行节点的信息; 在所述步骤Sll中,从所述语法树中获取可执行代码; 在所述步骤S21中,从所述代码执行装置发送的被执行节点的信息获取执行代码。
6.根据权利要求1或3所述的方法,其特征在于,在所述步骤S2中在所述数据库中针对执行代码对应的key进一步标注执行次数,在向测试人员反馈所述执行覆盖率时,进一步反馈各执行代码的执行次数。
7.一种确定代码执行覆盖率的装置,其特征在于,该装置包括: 解析信息标注单元,用于通过对被测脚本程序的解析确定可执行代码以及可执行代码的位置信息,利用可执行代码的位置信息生成key写入数据库; 执行信息标注单元,用于在所述被测脚本程序的执行过程中,将执行代码的执行状况信息在所述数据库中针对执行代码对应的key进行标注; 标注信息解析单元,用于利用所述数据库中的执行代码数量和可执行代码数量的比值确定所述被测脚本程序的执行覆盖率。
8.根据权利要求7所述的装置,其特征在于,所述解析信息标注单元具体包括: 第一代码获取模块,用于从解析器对被测脚本程序的解析结果中获取可执行代码; 第一信息标注模块,用于计算各可执行代码的签名并作为对应可执行代码的key写入数据库,其中所述可执行代码的签名由可执行代码所属的文件标识和可执行代码在被测脚本程序中的位置信息计算得到。
9.根据权利要求8所述的装置,其特征在于,所述执行信息标注单元具体包括: 第二代码获取模块,用于在代码执行装置执行被测脚本程序过程中获取执行代码; 第二信息标注模块,用于依据执行代码所属的文件标识和执行代码在被测脚本程序中的位置信息计算签名,针对所述数据库中该签名对应的key标注执行代码状态。
10.根据权利要求8或9所述的装置,其特征在于,所述在被测脚本程序中的位置信息包括行号和行内偏移。
11.根据权利要求9所述的装置,其特征在于,该装置还包括: 安装在解析器中的插件,用于在所述解析器针对被测脚本程序生成语法树的过程中对每个节点注入标识信息,所述标识信息包括每个节点的文件标识和在被测脚本程序中的位置信息,所述语法树的节点为可执行代码; 安装在代码执行装置中的插件,用于在所述代码执行装置执行到解析器生成的语法树的节点时,发送被执行节点的信息; 所述第一代码获取模块从所述语法树中获取可执行代码; 所述第二代码获取模块 从所述被执行节点的信息获取执行代码。
12.根据权利要求7或9所述的装置,其特征在于,所述执行信息标注单元在所述数据库中针对执行代码对应的key进一步标注执行次数; 所述标注信息解析单元在向测试人员反馈所述执行覆盖率时,进一步反馈各执行代码的执行次数。
【文档编号】G06F11/36GK103838666SQ201210489469
【公开日】2014年6月4日 申请日期:2012年11月27日 优先权日:2012年11月27日
【发明者】赵辉, 王昭, 徐建, 李正文, 刘哲文 申请人:百度在线网络技术(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1