具体实施方式
以下描述中,为了说明而不是为了限定,提出了诸如特定***结构、技术之类的具体细节,以便透彻理解本申请实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本申请。在其它情况中,省略对众所周知的***、装置、电路以及方法的详细说明,以免不必要的细节妨碍本申请的描述。
应当理解,当在本申请说明书和所附权利要求书中使用时,术语“包括”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
还应当理解,在本申请说明书和所附权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
如在本申请说明书和所附权利要求书中所使用的那样,术语“如果”可以依据上下文被解释为“当...时”或“一旦”或“响应于确定”或“响应于检测到”。类似地,短语“如果确定”或“如果检测到[所描述条件或事件]”可以依据上下文被解释为意指“一旦确定”或“响应于确定”或“一旦检测到[所描述条件或事件]”或“响应于检测到[所描述条件或事件]”。
另外,在本申请说明书和所附权利要求书的描述中,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
在本申请说明书中描述的参考“一个实施例”或“一些实施例”等意味着在本申请的一个或多个实施例中包括结合该实施例描述的特定特征、结构或特点。由此,在本说明书中的不同之处出现的语句“在一个实施例中”、“在一些实施例中”、“在其他一些实施例中”、“在另外一些实施例中”等不是必然都参考相同的实施例,而是意味着“一个或多个但不是所有的实施例”,除非是以其他方式另外特别强调。术语“包括”、“包含”、“具有”及它们的变形都意味着“包括但不限于”,除非是以其他方式另外特别强调。
参见图1,图1是本申请实施例一提供的一种程序测试方法的流程图。本实施例中程序测试方法的执行主体为具有程序测试功能的装置,包括但不限于计算机、服务器、平板电脑或者终端等装置。如图所示的程序测试方法可以包括以下步骤:
S101:获取待测程序及其程序信息;所述程序信息包括所述待测程序的数据结构信息和数据关系信息。
随着计算机科学技术和互联网技术飞速发展,软件安全问题层出不穷,软件安全一直备受关注。在信息安全对抗过程中,防守方会采取各种产品和策略对威胁进行防护,例如杀毒软件、入侵检测设备等,这些措施尽管能在一定程度上减轻攻击所带来的损失,但这仅是一种被动的防御方法,且仅当恶意代码被公开以后才能够进行阻断,因此并不是防御的最好方式。我们要能在被动防御的同时,主动找出软件中存在的未知安全漏洞,全面保护信息***的安全。为此,人们在不断尝试着利用各种方法找出软件安全问题并对它们及时进行修复以阻止恶意攻击者利用漏洞进行攻击。在进行漏洞挖掘时,模糊测试技术是一种快速并且有效的方式。其在早期可以分为黑盒测试、白盒测试以及灰盒测试。在当前的商业软件中,软件提供商一般不会给出软件的源代码,因此多数情况下模糊测试主要面向黑盒以及灰盒,其基本思想是利用半合法测试例对软件进行面向安全的测试。通过在测试过程中监视软件对于测试例的响应可以对潜在安全漏洞进行有效地发现和定位。其不需要任何关于软件或协议的先验知识,且测试过程简单、高效,自动化程度高。但由于测试用例生成策略的限制,模糊测试存在一定的局限性。其生成的测试用例具有单一性,多个用例往往覆盖程序的同一条路径,无法保证测试的代码覆盖率,致使测试过程不全面。
由于自动化测试工作中代码覆盖率较低。根据模糊测试的特点,对于样本例不能达到的代码部分,模糊测试框架是无法对这些代码进行检测的。针对此问题,一些人工智能算法被应用来解决此问题,例如基因生成算法。虽然这类算法在理论上确实能够有效增加测试过程中的代码覆盖率,但是在实际应用过程中是否有效仍值得深人研究。同时,由单一因素引起的漏洞越来越少,目前的安全漏洞多数都是由多种因素共同影响而产生的。而传统模糊测试中每次仅对单一元素进行数据变换,这样的后果就是无法发现多因素共同作用下产生的安全漏洞。但是若要进行多因素测试则又会引发测试用例数量***的问题,因此这类由多因素引起的漏洞自动化挖掘也是模糊测试过程中面临的障碍。目前的模糊测试框架每次仅对一个测试例进行测试,而未能将测试例的测试结果考虑到下一次测试过程中。也就是说每一次测试过程都是独立不相关的,这样的测试方式必然会带来一些弊端。
本实施例中通过获取待测程序及其程序信息,以根据待测程序的程序信息确定待测程序对应的测试用例。本实施例中的程序信息可以包括待测程序的数据结构信息和数据关系信息。其中,数据结构信息带有结构特性的数据元素的集合,包括待测程序的数据的逻辑结构和数据的物理结构;数据关系信息包括待测程序的数据的逻辑结构与物理结构之间的相互关系。在实际应用中通过对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。本实施例中的程序信息是相互之间存在一种或多种特定关系的数据元素的集合,即带结构的数据元素的集合,即程序信息就是指数据元素之间存在的关系,分为逻辑结构和存储结构。数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构。
S102:根据所述程序信息构建所述待测程序对应的测试用例的生成方式,根据所述生成方式生成所述测试用例。
在获取到待测程序及其程序信息之后,根据程序信息构建待测程序对应的测试用例的生成方式,以根据生成方式生成用来测试待测程序的测试用例。本实施例中的生成方式包括测试用例的生成规则、生成条件等。具体的,在构建待测程序对应的测试用例的生成方式时,先根据程序信息分析待测程序中输入数据的基本结构信息,程序输入包括命令行参数、文件、网络数据包、环境变量等,再依据待测目标程序和输入数据的基本结构信息的不同,确定待测程序对应的测试用例生成方式。
在根据程序信息构建待测程序对应的测试用例的生成方式时,首先对待测程序中对应的程序信息,比如协议知识进行人为学习,之后利用学习的协议知识对生成的测试用例进行约束限制,从而满足尽可能多的约束条件,使测试能够更为深入。对于一些没有公开协议或文档信息的被测试用例,只能通过逆向工程与模糊测试技术相结合的方式进行漏洞挖掘。本实施例中将逆向工程与模糊测试相结合,首先利用反汇编工具将测试用例进行解析,根据其指令代码进行人工分析,得到程序对文件的处理流程并推测出相应的文件结构;接下来根据推断的文件结构信息,构建模糊测试所需要的测试用例生成规则,并将其应用于实际的测试;最后在测试过程中需要不断的观察和完善生成规则以使其更加准确。测试人员对目标测试例的协议结构进行学习和了解,在此基础上构造出基本符合协议要求的测试用例。依据此种思想生成的测试用例能够对目标程序进行更深层的测试。
可选的,本实施例中可以通过优化后的模糊测试框架Peach测试框架构建待测程序对应的测试用例的生成方式,并根据生成方式生成测试用例。具体的,Peach测试框架采用了当前主要的两种数据生成方式:基于数据变异的生成方式和基于数据生成的方式。其中,基于变异的测试方式则是在事先有一定数量样本的前提下对这些样本进行随机变异后进行测试;基于生成的模糊测试方式类似于上述事前有一定的关于测试用例的结构知识,并以这些知识为基础生成测试例。基于生成的测试方式能够有效地提高代码覆盖率,达到更好的测试效果,但是事先需要人工对测试用例的协议或结构进行学习。基于变异的测试方式则不需要对测试用例的结构进行学习,只需要找到一定数量的初始样本便可以进行模糊,但是所能达到的代码覆盖率取决于初始样本的种类和数量。
本实施例中基于模糊测试框架Peach将二者有机结合,将测试用例的知识形成相应的模糊测试文件Pit文件,之后根据Pit文件生成测试用例,并以此为基础对测试例进行变异,变异的约束则是根据协议或文件结构知识实现。因此只要对相应的Pit文件设置合理,相较于两种测试方法,单独使用peach的测试框架会比传统方法,单纯用基于生成的测试方式或基于变异的测试方法,能够大幅度提高测试过程中的代码覆盖率。
进一步的,步骤S102包括:根据所述程序信息生成所述生成方式的数据结构文件;所述数据结构文件包括所述测试用例对应的配置信息、数据模型信息、数据收发方式信息、数据处理代理信息以及测试配置信息;根据所述数据结构文件生成所述测试用例。
具体的,本实施例中的Peach适用于软件测试人员企业的安全保证团队,以及测试实验室用来自动的发现软件的脆弱性和软件的突变的应对方法。Peach所使用的Pit文件包含了以下5个信息模块:配置信息模块、数据模型信息模块、数据收发方式信息模块、数据处理代理信息模块以及测试配置信息模块。本实施例中的根据生成方式生成测试用例的方式具体如下:
步骤1.配置信息模块是Pit文件的第一部分,用来定义基本配置信息。具体来说,包括三种元素:包含导入元素、导出元素以及路径元素。其中,导入元素用于表示所包含的其他Pit文件;导出元素用于表示要导入的python库;路径元素用于表示要添加的python库的路径。需要注意的是,本实施例中所有的Pit文件都要包含default.xml这个文件,其中包括了基本配置信息中的一些默认信息。
步骤2.数据模型信息模块用来定义数据模型,包括数据结构和数据关系等。一个Pit文件中需要包含一个或者多个数据模型数据模型,数据模型可以定义的几种常用的数据类型,例如、字符串型、数据型,除此之外还有无具体数据类型以及用于对数据进行分组等。
步骤3.数据收发方式信息模块用于描述如何向目标程序发送或者接收数据。数据模型信息模块由至少一个状态组成,并且用初始状态指定第一个;每个由至少一个行为组成,行为用于定义数据模型信息模块中的各种动作,动作类型由类型来指定。行为支持的动作类型包括开始、停止、开启、关闭、输入、输出以及通话等。
步骤4.数据处理代理信息模块用于定义代理和监视器,可以用来调用调试器来监控程序运行的错误信息等。一个Pit文件可以定义多个代理,每个代理下可以定义多个监视器。
步骤5.在Pit文件中,测试配置信息模块包括测试和运行两个元素。测试元素用来定义一个测试的配置,包括一个数据模型信息模块和一个发布者,以及导入、导出、代理信息等。其中数据模型信息模块和发布者是必须定义的,其他是可选定义的我们所用的peach-pit文件是helloworld.xml文件,它在打印输出hello world字符串之后会自动的生成很多的变种字符串,包括超长串和缺失的非法串等,几乎只要是可以造成程序出错的串都会涉及到,然后运行以上pit文件,便可根据生成方式生成测试用例。
S103:根据所述程序信息对所述测试用例进行变异处理,得到多个变异用例。
相比基于生成的测试模型,其最大不同就是模型在初始状态下需要有一定的正常样本,并对这些样本内容进行随机改变。这种模型能否成功的关键在于是否选取了足够多的样本,同时用这种测试方式生成测试例的有效性要略低于基于生成的测试模型。因此,本实施例中在生成测试用例之后,根据程序信息对测试用例进行变异处理,得到多个变异用例。本实施例中的变异处理用于表示对原始的测试用例中的测试逻辑进行改变的处理。
示例性地,例如以下代码片段:if(a&&b)c=1;else c=0;若对其进行变异处理,则将条件运算符用||来替换&&,就会产生以下变异:if(a||b)c=1;else c=0。通过这种变异处理测试用例得到多个变异用例的方式,可以增加本实施例中参与程序测试的测试用例基数,以在较多测试用例基数的基础上,确定与待测程序对应的目标测试用例。
S104:从所有所述变异用例中选出用于测试所述待测程序的目标变异用例。
在对测试用例进行变异处理,得到多个变异用例之后,从变异用例中选出用于测试该待测程序的目标变异用例。本实施例中选择目标变异用例的方式可以是根据各个变异用例在测试待测程序时,对待测程序的测试完成率来衡量,当测试完成率越高时,则表示该变异用例越适用于待测程序。
进一步的,步骤S104可以具体包括S1041~S1042:
S1041:计算每个所述变异用例的用例覆盖率;所述用例覆盖率用于表示根据所述变异用例测试所述待测程序时的测试完成程度。
本实施例通过计算每个变异用例的用例覆盖率,作为衡量变异用例在测试待测程序时的测试完成程序。覆盖率是软件测试中的一种度量,描述程式中源代码被测试的比例和程度。代码覆盖率常常被拿来作为衡量测试用例好坏的指标,所以提高代码覆盖率是提高模糊测试效率的一种有效方式。同时,如果在构建测试用例时不知道这些测试用例的代码覆盖率,则很难判断测试的完成情况,更不清楚是否发现了软件中的所有漏洞。可以通过引入遗传算法达到提高代码覆盖率的目的,也可以在模糊测试工具中集成代码覆盖率计算工具,实现实时监测当前代码覆盖率的功能。
进一步的,步骤S1041包括:识别所述变异用例在测试所述待测程序时对应的测试范围;计算所述测试范围占所述待测程序的程序范围的比例,得到所述用例覆盖率。
在确定用例覆盖率时,通过识别变异用例在测试该待测程序时对应的测试范围来确定。本实施例中的测试范围用于表示变异用例在待测程序中可测试的程序功能或者可测试的程序长度,此处不做限定。通过识别出变异用例在待测程序中对应的程序功能之后,则计算该程序功能在待测程序中所有功能中的占比,将此占比作为用例覆盖率。或者,在识别出变异用例在待测程序中对应的可测试的程序长度之后,则计算该程序长度在待测程序中总长度中的占比,将此占比作为用例覆盖率。
S1042:将所述用例覆盖率最高的变异用例识别为所述目标变异用例。
在计算得到变异用例对应用例覆盖率之后,将用例覆盖率最高的变异用例识别为目标变异用例。通过识别出覆盖率最高的变异用例为目标变异用例,以保证最后参与测试的用例可以较高范围的测试待测程序。
进一步的,步骤S104包括:识别所述变异用例中的等价用例;所述的等价用例用于表示测试范围相同的测试用例;删除重复的等价用例,从剩余的所述变异用例中选出所述目标变异用例。
具体的,由于变异用例是根据测试用例变异得到的,因此,很容易出现等级的变异用例,即测试范围或者测试对象相同的测试用例,针对这种情况,本实施例中将重复的变异用例删除,以从剩余的变异用例中选出目标变异用例。
S105:根据所述目标变异用例对所述待测程序进行测试,得到测试结果。
在确定了目标变异用例之后,根据目标变异用例对待测程序进行测试,得到测试结果。
除此之外,还可以将用例覆盖率大于预设阈值的变异用例作为目标变异用例,在进行测试时,将引起待测程序异常的测试用例和***状态进行记录,进一步分析***异常原因,确定该异常信息是否可被进一步利用。
上述方案,通过获取待测程序及其程序信息;所述程序信息包括所述待测程序的数据结构信息和数据关系信息;根据所述程序信息构建所述待测程序对应的测试用例的生成方式,根据所述生成方式生成所述测试用例;根据所述程序信息对所述测试用例进行变异处理,得到多个变异用例;从所有所述变异用例中选出用于测试所述待测程序的目标变异用例;根据所述目标变异用例对所述待测程序进行测试,得到测试结果。通过根据待测程序的程序信息生成待测程序对应的测试用例,在对测试用例进行变异得到多个变异用例,从中确定出用例覆盖率最高的变异用例作为目标变异用例以对待测程序进行测试,有效提高测试待测程序时的代码覆盖率,保证了测试过程和测试结果的全面性。
参见图2,图2是本申请实施例二提供的一种程序测试方法的流程图。本实施例中程序测试方法的执行主体为具有程序测试功能的装置,包括但不限于计算机、服务器、平板电脑或者终端等装置。如图所示的程序测试方法可以包括以下步骤:
S201:获取待测程序及其程序信息;所述程序信息包括所述待测程序的数据结构信息和数据关系信息。
在本实施例中S201与图1对应的实施例中S101的实现方式完全相同,具体可参考图1对应的实施例中的S101的相关描述,在此不再赘述。
S202:根据所述程序信息构建所述待测程序对应的测试用例的生成方式,根据所述生成方式生成所述测试用例。
在本实施例中S202与图1对应的实施例中S101的实现方式完全相同,具体可参考图1对应的实施例中的S101的相关描述,在此不再赘述。
S203:根据所述程序信息对所述测试用例进行变异处理,得到由多个变异用例组成的变异集合。
本实施例中根据程序信息对测试用例进行变异处理的方式与实施例一中步骤S103中的变异处理方式相同,具体请参考S103中的描述,此处不做赘述。
进一步的,由于变异用例是根据测试用例变异得到的,因此,很容易出现等级的变异用例,即测试范围或者测试对象相同的测试用例,针对这种情况,本实施例中将重复的变异用例删除,以从剩余的变异用例中选出目标变异用例。
进一步的,本实施例中最后得到的是由多个变异用例组成的变异集合,本实施例中的变异集合中包括了至少两个变异用例,其产生方式与步骤S103中的方式相同。变异用例组合变异集合的方式可以是随机组合生成变异集合方式,也可以是在生成所有的变异用例之后,将所有的变异用例进行平均分配的方式;还可以是根据每个变异用例所对应的测试功能,分别在一个组合中安排不同测试功能对应的变异用例的方式,以保证一个变异集合中所有的变异用例所测试的功能可以尽可能大覆盖待测程序的功能。
S204:从所有所述变异集合中选出目标集合;所述目标集合包括用于测试所述待测程序的目标变异用例。
在对测试用例进行变异处理,得到多个变异用例组成的变异集合之后,从变异集合中选出用于测试该待测程序的目标集合。本实施例中选择目标集合的方式可以是根据各个变异用例集合中所有的目标变异用例在测试待测程序时,对待测程序的测试完成率来衡量,当测试完成率越高时,则标表示该变异用例集合越适用于待测程序。
需要说明的是,本实施例中变异集合中的变异用例,在对待测程序进行测试时,是一个变异集合中的所有变异用例都参与待测程序的测试,以保证一个变异集合中所有的变异用例所测试的功能可以尽可能大覆盖待测程序的功能。
进一步的,步骤S204可以具体包括:计算每个所述变异集合中的每个变异用例的用例覆盖率;根据每个所述变异集合中的所有变异用例的用例覆盖率,计算所述每个变异集合对应的集合覆盖率;所述集合覆盖率用于表示通过所述变异集合中所有所述变异用例测试所述待测程序时的测试完成程度;将所述集合覆盖率最高的变异集合识别为所述目标集合。
具体的,在确定用例覆盖率时,通过识别变异用例在测试该待测程序时对应的测试范围来确定,本实施例中的集合覆盖率用于表示通过变异集合中所有变异用例测试待测程序时的测试完成程度。本实施例中的测试范围用于表示变异用例在待测程序中可测试的程序功能或者可测试的程序长度,此处不做限定。通过识别出变异用例在待测程序中对应的程序功能之后,则计算该程序功能在待测程序中所有功能中的占比,将此占比作为测试完成程度,即用例覆盖率。或者,在识别出变异用例在待测程序中对应的可测试的程序长度之后,则计算该程序长度在待测程序中总长度中的占比,将此占比作为测试完成程度,即用例覆盖率。根据每个变异集合中的所有变异用例的用例覆盖率,计算所述每个变异集合对应的集合覆盖率。具体的集合覆盖率的计算方式可以是通过计算一个变异集合中所有变异用例的用例覆盖率的平均值来计算,此处不做限定。在计算得到变异集合对应集合覆盖率之后,将集合覆盖率最高的变异集合识别为目标集合。通过识别出覆盖率最高的变异集合为目标集合,以保证最后参与测试的目标变异结合中的目标变异用例可以测试较高测试范围对应的待测程序,提高测试待测程序的效率。
S205:根据所述目标集合中的所有目标变异用例对所述待测程序进行测试,得到所述测试结果。
在得到目标结合之后,根据目标集合中所有目标变异用例,对待测程序进行测试,得到测试结果。需要说明的是,本实施例中变异集合中的变异用例,在对待测程序进行测试时,是一个变异集合中的所有变异用例都参与待测程序的测试,以保证一个变异集合中所有的变异用例所测试的功能可以尽可能大覆盖待测程序的功能。
上述方案,通过获取待测程序及其程序信息;所述程序信息包括所述待测程序的数据结构信息和数据关系信息;根据所述程序信息构建所述待测程序对应的测试用例的生成方式,根据所述生成方式生成所述测试用例;根据所述程序信息对所述测试用例进行变异处理,得到由多个变异用例组成的变异集合;从所有所述变异集合中选出目标集合;所述目标集合包括用于测试所述待测程序的目标变异用例;根据所述目标集合中的所有目标变异用例对所述待测程序进行测试,得到所述测试结果。通过根据待测程序的程序信息生成待测程序对应的测试用例,在对测试用例进行变异得到多个变异用例组成的变异集合,从中确定出用例覆盖率最高的变异集合作为目标集合,以根据该目标集合中所有的变异用例对待测程序进行测试,有效提高测试待测程序时的代码覆盖率,保证了测试过程和测试结果的全面性。
参见图3,图3是本申请实施例三提供的一种程序测试装置的示意图。程序测试装置300可以为计算机、服务器、平板电脑或者终端等装置。本实施例的程序测试装置300包括的各单元用于执行图1对应的实施例中的各步骤,具体请参阅图1及图1对应的实施例中的相关描述,此处不赘述。本实施例的程序测试装置300包括:
获取单元301,用于获取待测程序及其程序信息;所述程序信息包括所述待测程序的数据结构信息和数据关系信息;
生成单元302,用于根据所述程序信息构建所述待测程序对应的测试用例的生成方式,根据所述生成方式生成所述测试用例;
变异单元303,用于根据所述程序信息对所述测试用例进行变异处理,得到多个变异用例;
选择单元304,用于从所有所述变异用例中选出用于测试所述待测程序的目标变异用例;
测试单元305,用于根据所述目标变异用例对所述待测程序进行测试,得到测试结果。
进一步的,所述程序测试装置300还包括:
集合变异单元,用于根据所述程序信息对所述测试用例进行变异处理,得到由多个变异用例组成的变异集合;
集合选择单元,用于从所有所述变异集合中选出目标集合;所述目标集合包括用于测试所述待测程序的目标变异用例;
集合测试单元,用于根据所述目标集合中的所有目标变异用例对所述待测程序进行测试,得到所述测试结果。
进一步的,所述选择单元304包括:
第一计算单元,用于计算每个所述变异用例的用例覆盖率;所述用例覆盖率用于表示根据所述变异用例测试所述待测程序时的测试完成程度;
第一识别单元,用于将所述用例覆盖率最高的变异用例识别为所述目标变异用例。
进一步的,所述集合选择单元包括:
第二计算单元,用于计算每个所述变异集合中的每个变异用例的用例覆盖率;
第三计算单元,用于根据每个所述变异集合中的所有变异用例的用例覆盖率,计算所述每个变异集合对应的集合覆盖率;所述集合覆盖率用于表示通过所述变异集合中所有所述变异用例测试所述待测程序时的测试完成程度;
第二识别单元,用于将所述集合覆盖率最高的变异集合识别为所述目标集合。
进一步的,所述生成单元302包括:
第一生成单元,用于根据所述程序信息生成所述生成方式的数据结构文件;所述数据结构文件包括所述测试用例对应的配置信息、数据模型信息、数据收发方式信息、数据处理代理信息以及测试配置信息;
第二生成单元,用于根据所述数据结构文件生成所述测试用例。
进一步的,所述变异单元303包括:
第四识别单元,用于识别所述变异用例中的等价用例;所述的等价用例用于表示测试范围相同的测试用例;
删除单元,用于删除重复的等价用例,从剩余的所述变异用例中选出所述目标变异用例。
进一步的,所述计算单元包括:
第五识别单元,用于识别所述变异用例在测试所述待测程序时对应的测试范围;
第四计算单元,用于计算所述测试范围占所述待测程序的程序范围的比例,得到所述用例覆盖率。
上述方案,通过获取待测程序及其程序信息;所述程序信息包括所述待测程序的数据结构信息和数据关系信息;根据所述程序信息构建所述待测程序对应的测试用例的生成方式,根据所述生成方式生成所述测试用例;根据所述程序信息对所述测试用例进行变异处理,得到多个变异用例;从所有所述变异用例中选出用于测试所述待测程序的目标变异用例;根据所述目标变异用例对所述待测程序进行测试,得到测试结果。通过根据待测程序的程序信息生成待测程序对应的测试用例,在对测试用例进行变异得到多个变异用例,从中确定出用例覆盖率最高的变异用例作为目标变异用例以对待测程序进行测试,有效提高测试待测程序时的代码覆盖率,保证了测试过程和测试结果的全面性。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
参见图4,图4是本申请实施例四提供的一种程序测试装置的示意图。如图4所示的本实施例中的程序测试装置400可以包括:处理器401、存储器402以及存储在存储器402中并可在处理器401上运行的计算机程序403。处理器401执行计算机程序403时实现上述各个程序测试方法实施例中的步骤。存储器402用于存储计算机程序,所述计算机程序包括程序指令。处理器401用于执行存储器402存储的程序指令。其中,处理器401被配置用于调用所述程序指令执行以下操作:
处理器401用于:
获取待测程序及其程序信息;所述程序信息包括所述待测程序的数据结构信息和数据关系信息;
根据所述程序信息构建所述待测程序对应的测试用例的生成方式,根据所述生成方式生成所述测试用例;
根据所述程序信息对所述测试用例进行变异处理,得到多个变异用例;
从所有所述变异用例中选出用于测试所述待测程序的目标变异用例;
根据所述目标变异用例对所述待测程序进行测试,得到测试结果。
进一步的,处理器401具体用于:
根据所述程序信息对所述测试用例进行变异处理,得到由多个变异用例组成的变异集合;
从所有所述变异集合中选出目标集合;所述目标集合包括用于测试所述待测程序的目标变异用例;
根据所述目标集合中的所有目标变异用例对所述待测程序进行测试,得到所述测试结果。
进一步的,处理器401具体用于:
计算每个所述变异用例的用例覆盖率;所述用例覆盖率用于表示根据所述变异用例测试所述待测程序时的测试完成程度;
将所述用例覆盖率最高的变异用例识别为所述目标变异用例。
进一步的,处理器401具体用于:
计算每个所述变异集合中的每个变异用例的用例覆盖率;
根据每个所述变异集合中的所有变异用例的用例覆盖率,计算所述每个变异集合对应的集合覆盖率;所述集合覆盖率用于表示通过所述变异集合中所有所述变异用例测试所述待测程序时的测试完成程度;
将所述集合覆盖率最高的变异集合识别为所述目标集合。
进一步的,处理器401具体用于:
根据所述程序信息生成所述生成方式的数据结构文件;所述数据结构文件包括所述测试用例对应的配置信息、数据模型信息、数据收发方式信息、数据处理代理信息以及测试配置信息;
根据所述数据结构文件生成所述测试用例。
进一步的,处理器401具体用于:
识别所述变异用例中的等价用例;所述的等价用例用于表示测试范围相同的测试用例;
删除重复的等价用例,从剩余的所述变异用例中选出所述目标变异用例。
进一步的,处理器401具体用于:
识别所述变异用例在测试所述待测程序时对应的测试范围;
计算所述测试范围占所述待测程序的程序范围的比例,得到所述用例覆盖率。
上述方案,通过获取待测程序及其程序信息;所述程序信息包括所述待测程序的数据结构信息和数据关系信息;根据所述程序信息构建所述待测程序对应的测试用例的生成方式,根据所述生成方式生成所述测试用例;根据所述程序信息对所述测试用例进行变异处理,得到多个变异用例;从所有所述变异用例中选出用于测试所述待测程序的目标变异用例;根据所述目标变异用例对所述待测程序进行测试,得到测试结果。通过根据待测程序的程序信息生成待测程序对应的测试用例,在对测试用例进行变异得到多个变异用例,从中确定出用例覆盖率最高的变异用例作为目标变异用例以对待测程序进行测试,有效提高测试待测程序时的代码覆盖率,保证了测试过程和测试结果的全面性。
应当理解,在本申请实施例中,所称处理器401可以是中央处理单元(CentralProcessing Unit,CPU),该处理器还可以是其他通用处理器、数字信号处理器(DigitalSignal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
该存储器402可以包括只读存储器和随机存取存储器,并向处理器401提供指令和数据。存储器402的一部分还可以包括非易失性随机存取存储器。例如,存储器402还可以存储设备类型的信息。
具体实现中,本申请实施例中所描述的处理器401、存储器402、计算机程序403可执行本申请实施例提供的程序测试方法的第一实施例和第二实施例中所描述的实现方式,也可执行本申请实施例所描述的终端的实现方式,在此不再赘述。
在本申请的另一实施例中提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令被处理器执行时实现:
获取待测程序及其程序信息;所述程序信息包括所述待测程序的数据结构信息和数据关系信息;
根据所述程序信息构建所述待测程序对应的测试用例的生成方式,根据所述生成方式生成所述测试用例;
根据所述程序信息对所述测试用例进行变异处理,得到多个变异用例;
从所有所述变异用例中选出用于测试所述待测程序的目标变异用例;
根据所述目标变异用例对所述待测程序进行测试,得到测试结果。
进一步的,所述计算机程序被处理器执行时还实现:
根据所述程序信息对所述测试用例进行变异处理,得到由多个变异用例组成的变异集合;
从所有所述变异集合中选出目标集合;所述目标集合包括用于测试所述待测程序的目标变异用例;
根据所述目标集合中的所有目标变异用例对所述待测程序进行测试,得到所述测试结果。
进一步的,所述计算机程序被处理器执行时还实现:
计算每个所述变异用例的用例覆盖率;所述用例覆盖率用于表示根据所述变异用例测试所述待测程序时的测试完成程度;
将所述用例覆盖率最高的变异用例识别为所述目标变异用例。
进一步的,所述计算机程序被处理器执行时还实现:
计算每个所述变异集合中的每个变异用例的用例覆盖率;
根据每个所述变异集合中的所有变异用例的用例覆盖率,计算所述每个变异集合对应的集合覆盖率;所述集合覆盖率用于表示通过所述变异集合中所有所述变异用例测试所述待测程序时的测试完成程度;
将所述集合覆盖率最高的变异集合识别为所述目标集合。
进一步的,所述计算机程序被处理器执行时还实现:
根据所述程序信息生成所述生成方式的数据结构文件;所述数据结构文件包括所述测试用例对应的配置信息、数据模型信息、数据收发方式信息、数据处理代理信息以及测试配置信息;
根据所述数据结构文件生成所述测试用例。
进一步的,所述计算机程序被处理器执行时还实现:
识别所述变异用例中的等价用例;所述的等价用例用于表示测试范围相同的测试用例;
删除重复的等价用例,从剩余的所述变异用例中选出所述目标变异用例。
进一步的,所述计算机程序被处理器执行时还实现:
识别所述变异用例在测试所述待测程序时对应的测试范围;
计算所述测试范围占所述待测程序的程序范围的比例,得到所述用例覆盖率。
上述方案,通过获取待测程序及其程序信息;所述程序信息包括所述待测程序的数据结构信息和数据关系信息;根据所述程序信息构建所述待测程序对应的测试用例的生成方式,根据所述生成方式生成所述测试用例;根据所述程序信息对所述测试用例进行变异处理,得到多个变异用例;从所有所述变异用例中选出用于测试所述待测程序的目标变异用例;根据所述目标变异用例对所述待测程序进行测试,得到测试结果。通过根据待测程序的程序信息生成待测程序对应的测试用例,在对测试用例进行变异得到多个变异用例,从中确定出用例覆盖率最高的变异用例作为目标变异用例以对待测程序进行测试,有效提高测试待测程序时的代码覆盖率,保证了测试过程和测试结果的全面性。
所述计算机可读存储介质可以是前述任一实施例所述的终端的内部存储单元,例如终端的硬盘或内存。所述计算机可读存储介质也可以是所述终端的外部存储设备,例如所述终端上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(SecureDigital,SD)卡,闪存卡(Flash Card)等。进一步地,所述计算机可读存储介质还可以既包括所述终端的内部存储单元也包括外部存储设备。所述计算机可读存储介质用于存储所述计算机程序及所述终端所需的其他程序和数据。所述计算机可读存储介质还可以用于暂时地存储已经输出或者将要输出的数据。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,上述描述的终端和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的终端和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另外,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口、装置或单元的间接耦合或通信连接,也可以是电的,机械的或其它的形式连接。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本申请实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以是两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。