掌桥专利:专业的专利平台
掌桥专利
首页

程序测试方法、装置、计算机设备和存储介质

文献发布时间:2023-06-19 19:28:50


程序测试方法、装置、计算机设备和存储介质

技术领域

本申请涉及软件测试技术领域,特别是涉及一种程序测试方法、装置、计算机设备、存储介质和计算机程序产品。

背景技术

自动化测试是当前软件测试技术领域中主流的测试方法,通过计算机生成大量的测试用例,以根据测试用例对Web应用程序、环境变量和网络协议等测试对象进行测试,以记录并解决测试对象中的异常。

传统技术中,常通过随机生成的测试用例对测试对象进行测试,但是随机生成的测试用例具有极大的随机性,导致这种方式难以覆盖复杂的测试路径。

发明内容

基于此,有必要针对上述技术问题,提供一种能够提高对测试程序的路径覆盖率的程序测试方法、装置、计算机设备、计算机可读存储介质和计算机程序产品。

第一方面,本申请提供了一种程序测试方法。所述方法包括:

根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例;

根据所述变异测试用例,对待测试程序进行测试,得到所述待测试程序的当前路径覆盖信息;

根据所述当前路径覆盖信息,对所述测试用例的字节权重进行更新,并跳转至所述根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例的步骤,直到满足所述待测试程序的预设测试终止条件。

在其中一个实施例中,根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例,包括:

根据所述目标测试用例队列中的测试用例的各个字节的字节权重,从所述测试用例的各个字节中确定出目标变异字节;

对所述测试用例中的所述目标变异字节进行变异处理,得到所述测试用例的变异测试用例。

在其中一个实施例中,根据所述当前路径覆盖信息,对所述测试用例的字节权重进行更新,包括:

在所述待测试程序未触发崩溃,且所述当前路径覆盖信息中携带有新路径覆盖信息的情况下,对所述测试用例的目标变异字节的字节权重进行增加;

在所述待测试程序未触发崩溃,且所述当前路径覆盖信息中未携带有所述新路径覆盖信息的情况下,对所述测试用例的目标变异字节的字节权重进行减少。

在其中一个实施例中,在所述待测试程序未触发崩溃,且所述当前路径覆盖信息中未携带有所述新路径覆盖信息的情况下,对所述测试用例的目标变异字节的字节权重进行减少之后,还包括:

获取所述待测试程序的历史路径覆盖信息;

根据所述当前路径覆盖信息和所述历史路径覆盖信息之间的差异,确定所述待测试程序的路径覆盖变化率;

在所述路径覆盖变化率不满足预设变化率阈值的情况下,对所述待测试程序的路径约束信息进行符号执行,得到所述待测试程序的实际用例,并将所述实际用例作为测试用例存储至所述目标测试用例队列中;

在所述路径覆盖变化率满足预设变化率阈值的情况下,跳转至所述根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例的步骤。

在其中一个实施例中,在所述目标测试用例队列中的测试用例为空的情况下,所述待测试程序的当前路径覆盖信息通过下述方式得到:

对候选测试用例队列中的候选测试用例的字节进行变异处理,得到所述候选测试用例的变异候选测试用例;

根据所述变异候选测试用例,对所述待测试程序进行测试,得到所述待测试程序的当前路径覆盖信息。

在其中一个实施例中,候选测试用例队列通过如下方式得到:

确定所述目标测试用例队列中的测试用例的变异测试用例对应的各个当前路径覆盖信息;

在各个所述当前路径覆盖信息中未携带新路径覆盖信息的次数满足预设次数阈值的情况下,将所述测试用例作为候选测试用例,并将所述候选测试用例存储至所述候选测试用例队列。

在其中一个实施例中,候选测试用例队列还通过如下方式得到:

从所述目标测试用例队列中,筛选出每个字节权重均为0或者负数的测试用例,作为候选测试用例;

将所述候选测试用例存储至所述候选测试用例队列。

第二方面,本申请还提供了一种程序测试装置。所述装置包括:

字节变异模块,用于根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例;

用例测试模块,用于根据所述变异测试用例,对待测试程序进行测试,得到所述待测试程序的当前路径覆盖信息;

权重更新模块,用于根据所述当前路径覆盖信息,对所述测试用例的字节权重进行更新,并跳转至所述根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例的步骤,直到满足所述待测试程序的预设测试终止条件。

第三方面,本申请还提供了一种计算机设备。所述计算机设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:

根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例;

根据所述变异测试用例,对待测试程序进行测试,得到所述待测试程序的当前路径覆盖信息;

根据所述当前路径覆盖信息,对所述测试用例的字节权重进行更新,并跳转至所述根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例的步骤,直到满足所述待测试程序的预设测试终止条件。

第四方面,本申请还提供了一种计算机可读存储介质。所述计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:

根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例;

根据所述变异测试用例,对待测试程序进行测试,得到所述待测试程序的当前路径覆盖信息;

根据所述当前路径覆盖信息,对所述测试用例的字节权重进行更新,并跳转至所述根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例的步骤,直到满足所述待测试程序的预设测试终止条件。

第五方面,本申请还提供了一种计算机程序产品。所述计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:

根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例;

根据所述变异测试用例,对待测试程序进行测试,得到所述待测试程序的当前路径覆盖信息;

根据所述当前路径覆盖信息,对所述测试用例的字节权重进行更新,并跳转至所述根据目标测试用例队列中的测试用例的字节权重,对所述测试用例的字节进行变异处理,得到所述测试用例的变异测试用例的步骤,直到满足所述待测试程序的预设测试终止条件。

上述程序测试方法、装置、计算机设备、存储介质和计算机程序产品,根据目标测试用例队列中的测试用例的字节权重,对测试用例的字节进行变异处理,得到测试用例的变异测试用例;根据变异测试用例,对待测试程序进行测试,得到待测试程序的当前路径覆盖信息;根据当前路径覆盖信息,对测试用例的字节权重进行更新,并跳转至根据目标测试用例队列中的测试用例的字节权重,对测试用例的字节进行变异处理,得到测试用例的变异测试用例的步骤,直到满足待测试程序的预设测试终止条件。采用本方法,通过测试用例的字节权重来确定字节的变异方向,并通过待测试程序的当前路径覆盖信息对测试用例的字节权重不断进行更新,从而使得测试用例能够向触发更多路径覆盖的方向进行字节变异,实现了对测试用例的变异策略的优化,不仅提高了对待测试程序的路径覆盖率,还能够让目标测试用例队列中的测试用例维持在质量较高的水平,从而大大提高了对待测试程序的测试效果。

附图说明

图1为一个实施例中程序测试方法的流程示意图;

图2为一个实施例中得到测试用例的变异测试用例步骤的流程示意图;

图3为另一个实施例中程序测试方法的流程示意图;

图4为又一个实施例中程序测试方法的原理示意图;

图5为一个实施例中程序测试装置的结构框图;

图6为一个实施例中计算机设备的内部结构图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。

需要说明的是,本申请提供的程序测试方法、装置可用于软件测试领域,以提升对测试程序的路径覆盖率,也可以用于除软件测试领域之外的任意领域在程序测试方面的应用,例如金融领域,本申请的程序测试方法、装置的应用领域不做限定。

在一个实施例中,如图1所示,提供了一种程序测试方法,本实施例以该方法应用于终端进行举例说明,可以理解的是,该方法也可以应用于服务器,还可以应用于包括终端和服务器的系统,并通过终端和服务器的交互实现。本实施例中,该方法包括以下步骤:

步骤S101,根据目标测试用例队列中的测试用例的字节权重,对测试用例的字节进行变异处理,得到测试用例的变异测试用例。

其中,目标测试队列是指存储有多个能够大概率触发待测试程序的新路径的测试用例的集合。相较于候选测试用例队列中的候选测试用例,目标测试队列中的测试用例具有更高概率触发测试程序的新路径覆盖。

其中,测试用例,也叫种子,是指针对待测试程序进行测试任务而编写的测试输入、执行条件和预期结果等信息。变异测试用例是指对测试用例中的部分字节进行变换后得到的测试数据。

具体地,在初始时,可以为目标测试队列中的每个测试用例的每个字节设置一个基础值作为字节权重。在进行字节的变异处理时,终端可以对目标测试用例队列中的测试用例的字节进行遍历,得到该测试用例的字节长度和字节权重;然后终端对测试用例的字节进行变异处理,可以是选取测试用例中字节权重最高的字节进行变异处理,还可以是按照字节顺序依次对测试用例中字节权重为整数的字节进行变异处理,进而终端得到测试用例的变异测试用例。

举例说明,终端对目标测试用例队列中的测试用例的字节进行遍历,得到该测试用例的字节长度和字节权重。终端可以将该测试用例的字节长度和字节权重存储在map(一种依照键值对形式存储值的容器)中,得到bit_weight_map[n],其中n表示字节长度。bit_weight_map[n]如表1所示:

表1

其中,m表示为测试用例的每个字节设置的基础值。经过多轮更新后,测试用例中部分(或全部)字节的字节权重会发生变化,例如第n个字节的字节权重增加到了m+2,而第2个字节的字节权重减少到了m-1。

步骤S102,根据变异测试用例,对待测试程序进行测试,得到待测试程序的当前路径覆盖信息。

其中,当前路径覆盖信息是指在当前测试中触发待测试用例的路径覆盖情况的信息。当前路径覆盖信息包括但不限于是当前路径覆盖率和新路径覆盖信息。

其中,待测试程序是指需要进行软件测试的程序。待测试程序可以是无源代码的二进制文件,也可以是其他程序。

具体地,终端获取初始测试程序,对初始测试程序进行反汇编处理,例如可以是将初始测试程序加载至二进制程序分析工具中进行反汇编处理,则终端得到初始测试程序的汇编代码。终端根据初始测试程序的汇编代码,生成初始测试程序的控制流程图和VEX语言;进而终端根据初始测试程序的控制流程图和VEX语言,对初始测试程序进行插桩预处理,得到待测试程序;其中待测试程序中设置有插桩函数,插桩函数用于收集待测试程序的路径约束信息。可以理解的是,待测试程序的获取过程可以发生在步骤S101之前,也可以发生在步骤S102,再此对获取待测试程序的先后顺序不进行限定。

进一步地,终端将变异测试用例作为待测试程序的输入,以供待测试程序执行变异测试用例;在执行完成之后,终端采集待测试程序本次的当前路径覆盖信息。

步骤S103,根据当前路径覆盖信息,对测试用例的字节权重进行更新,并跳转至根据目标测试用例队列中的测试用例的字节权重,对测试用例的字节进行变异处理,得到测试用例的变异测试用例的步骤,直到满足待测试程序的预设测试终止条件。

其中,字节权重用于度量字节能够触发待测试程序的新路径覆盖的概率。字节权重越高,表示该字节触发待测试程序的新路径的概率越大。

其中,预设测试终止条件是指针对待测试程序的测试过程设置的判定条件。

具体地,在上述步骤S102中,终端根据变异测试用例对待测试程序进行测试的过程中,若待测试程序触发了崩溃,则将该变异测试用例存储在崩溃记录集中,并对待测试程序的崩溃次数加一。终端还可以将待测试程序的预设测试终止条件设置为崩溃次数超过预设崩溃阈值,则当崩溃次数超过预设崩溃阈值时,终端终止对待测试程序的测试,并将待测试程序相关的测试信息(例如测试用例、字节权重、变异测试用例和当前路径覆盖信息等)进行展示,以供测试人员对待测试程序的崩溃进行研究分析,从而能够确定待测试程序的崩溃是否为真实崩溃。

若待测试程序在执行变异测试用例后并未触发崩溃,则终端根据当前路径覆盖信息,对目标测试队列中的测试用例的字节权重进行更新;然后再次执行上述步骤S101至S103,直至满足待测试程序的预设测试终止条件为止。

上述程序测试方法中,根据目标测试用例队列中的测试用例的字节权重,对测试用例的字节进行变异处理,得到测试用例的变异测试用例;根据变异测试用例,对待测试程序进行测试,得到待测试程序的当前路径覆盖信息;根据当前路径覆盖信息,对测试用例的字节权重进行更新,并跳转至根据目标测试用例队列中的测试用例的字节权重,对测试用例的字节进行变异处理,得到测试用例的变异测试用例的步骤,直到满足待测试程序的预设测试终止条件。采用本方法,通过测试用例的字节权重来确定字节的变异方向,并通过待测试程序的当前路径覆盖信息对测试用例的字节权重不断进行更新,从而使得测试用例能够向触发更多路径覆盖的方向进行字节变异,实现了对测试用例的变异策略的优化,不仅提高了对待测试程序的路径覆盖率,还能够让目标测试用例队列中的测试用例维持在质量较高的水平,从而大大提高了对待测试程序的测试效果。

在一个实施例中,如图2所示,步骤S101,根据目标测试用例队列中的测试用例的字节权重,对测试用例的字节进行变异处理,得到测试用例的变异测试用例,具体包括如下内容:

步骤S201,根据目标测试用例队列中的测试用例的各个字节的字节权重,从测试用例的各个字节中确定出目标变异字节。

步骤S202,对测试用例中的目标变异字节进行变异处理,得到测试用例的变异测试用例。

其中,目标变异字节是指需要进行变换的字节数据。

具体地,终端从目标测试用例队列中获取测试用例;进而根据测试用例的各个字节的字节权重,确定出测试用例中的目标变异字节,可以是依次判断各个字节的字节权重是否为正数;在检测到当前字节的字节权重为正数的情况下,将当前字节作为目标变异字节,对测试用例中的目标变异字节进行变异处理,可以是利用模糊测试工具例如AFL(American Fuzzy Lop)对目标变异字节进行havoc变异,则终端得到测试用例的变异测试用例。在检测到当前字节的字节权重为负数或者0的情况下,则跳过当前字节,获取当前字节的下一个字节,并检测下一个字节的字节权重是否为正数,若检测到下一个字节的字节权重为负数或者0的情况下,继续获取再下一个字节,直到确定出目标变异字节或者测试用例中所有的字节均被检测到为负数或者0为止。可以理解的是,终端是对测试用例中的单个字节(即目标变异细节)进行变异处理,而非对测试用例中的多个字节进行变异处理,以避免测试用例中的多个字节的字节权重同时增加或者同时减少,从而无法有效确定出能够使待测试程序触发的新路径覆盖信息的字节,进而无法实现提高对待测试程序的路径覆盖率的技术效果。

本实施例中,通过根据目标测试用例队列中的测试用例的各个字节的字节权重,从测试用例的各个字节中确定出目标变异字节;对测试用例中的目标变异字节进行变异处理,得到测试用例的变异测试用例,实现了利用字节的字节权重来控制测试用例的变异方向,以避免随机变异时测试用例的字节朝着不会触发新路径的方向进行变异,不仅提高了变异处理得到的变异测试用例对待测试程序的新路径的覆盖率,还减少测试用例中对触发新路径覆盖无帮助(即字节权重为负数或者0)的字节的变异,解决了传统的模糊测试技术中随机生成的种子中有超过六成的变异测试用例无法触发新路径覆盖信息的缺陷,在提高了变异处理得到的变异测试用例对待测试程序的测试效果的同时,还提高了对待测试程序的测试效率。

在一个实施例中,上述步骤S103,根据当前路径覆盖信息,对测试用例的字节权重进行更新,具体包括如下内容:在待测试程序未触发崩溃,且当前路径覆盖信息中携带有新路径覆盖信息的情况下,对测试用例的目标变异字节的字节权重进行增加;在待测试程序未触发崩溃,且当前路径覆盖信息中未携带有新路径覆盖信息的情况下,对测试用例的目标变异字节的字节权重进行减少。

其中,新路径覆盖信息用于表征本次测试是否有覆盖新的路径。

具体地,在待测试程序未触发崩溃的情况下,终端检测当前路径覆盖信息中是否携带有新路径覆盖信息,在检测到当前路径覆盖信息中携带有新路径覆盖信息的情况下,将目标测试用例队列中的测试用例的目标变异字节的字节权重增加预设权重,还可以将触发新路径覆盖信息的该变异测试用例作为测试用例存储在目标测试用例队列中;然后终端继续获取从目标测试用例队列中获取下一个测试用例进行变异处理,即跳转到上述步骤S101。在检测到当前路径覆盖信息中未携带有新路径覆盖信息的情况下,将测试用例的目标变异字节的字节权重减少预设权重。在实际应用中,预设权重可以设置为1,2,3等数值。

在本实施例中,在待测试程序未触发崩溃的情况下,根据当前路径覆盖信息中是否携带有新路径覆盖信息,对测试用例的目标变异字节的字节权重进行增加或减少,从而实现了对测试用例的字节权重的更新;通过对触发了新路径覆盖信息的目标变异字节的字节权重进行奖励,对未触发新路径覆盖信息的目标变异字节的字节权重进行惩罚,还能够使测试用例向触发更多路径覆盖的方向进行字节变异,从而提高了对待测试程序的路径覆盖率。

在一个实施例中,在待测试程序未触发崩溃,且当前路径覆盖信息中未携带有新路径覆盖信息的情况下,对测试用例的目标变异字节的字节权重进行减少之后,还包括:获取待测试程序的历史路径覆盖信息;根据当前路径覆盖信息和历史路径覆盖信息之间的差异,确定待测试程序的路径覆盖变化率;在路径覆盖变化率不满足预设变化率阈值的情况下,对待测试程序的路径约束信息进行符号执行,得到待测试程序的实际用例,并将实际用例作为测试用例存储至目标测试用例队列中;在路径覆盖变化率满足预设变化率阈值的情况下,跳转至根据目标测试用例队列中的测试用例的字节权重,对测试用例的字节进行变异处理,得到测试用例的变异测试用例的步骤。

其中,历史路径覆盖信息是指在上一轮测试中待测试用例触发的路径覆盖情况的信息。例如,历史路径覆盖信息可以是上一轮测试中待测试用例触发的路径覆盖率,即历史路径覆盖率。

其中,预设变化率阈值为针对路径变化率设置的阈值条件,用于检测待测试程序的路径覆盖的变化情况。符号执行是一种程序分析技术,通过模拟程序运行的方式得到特定的输入(实际用例);其原理是使用符号值作为输入,而非使用具体值作为输入,在达到待测试程序时获取对应的路径约束信息,再通过约束求解器得到具体的实际用例。

具体地,终端获取待测试程序的历史路径覆盖信息、历史执行时间和当前执行时间;其中,历史执行时间是指上一轮测试中待测试用例开始执行变异测试用例的时间;当前执行时间是指本轮测试中待测试用例开始执行变异测试用例的时间。进而终端可以将当前路径覆盖信息和历史路径覆盖信息之间的差异,以及当前执行时间和历史执行时间的差异,输入如下所示的公式(1)中,则终端得到待测试程序的路径覆盖变化率Cp。

式中,C

在获取到待测试程序的路径覆盖变化率之后,终端还可以判断待测试程序的路径覆盖率是否预设变化率阈值。具体地,在路径覆盖变化率不满足预设变化率阈值的情况下,例如路径覆盖变化率低于预设变化率阈值,则终端可以获取待测试程序中设置的插桩函数收集的路径约束信息,进而对待测试程序的路径约束信息进行符号执行,可以是将待测试程序的路径约束信息输入约束求解器中,通过约束求解器对路径约束信息进行约束求解,得到路径约束信息对应的实际用例,并将实际用例作为测试用例存储至目标测试用例队列中,然后跳转到上述步骤S101。此外,若通过约束求解器对路径约束信息进行约束求解后,无法得到路径约束信息对应的实际用例,则终端可以忽略该实际用例的获取,直接跳转到上述步骤S101。可以理解的是,本方案中的约束求解器是指能够收集待测试程序中的符号路径约束与符号状态,并进行求解的一个执行器,可以理解为一种具有数据处理能力的计算机资源,并不是广义上数学领域中的约束条件的求解。其中,符号路径约束是指符号表达式上无量词的一阶公式;符号状态是指符号执行维护一个符号状态,将变量映射到符号表达式。

进一步地,在路径覆盖变化率满足预设变化率阈值的情况下,例如路径覆盖变化率高于预设变化率阈值,则跳转至上述步骤S101,循环执行上述步骤直到满足待测试程序的预设测试终止条件。

在本实施例中,通过待测试程序的当前路径覆盖信息和历史路径覆盖信息之间的差异,确定待测试程序的路径覆盖变化率;在路径覆盖变化率不满足预设变化率阈值的情况下,对待测试程序的路径约束信息进行符号执行,得到待测试程序的实际用例,并将实际用例作为测试用例存储至目标测试用例队列中,能够通过符号执行来获取新的测试用例,并通过新的测试用例使待测试程序触发的新路径覆盖信息,以解决当前路径覆盖信息中未携带有新路径覆盖信息的技术问题,从而提高了对待测试程序的路径覆盖率,进而提高了对待测试程序的测试效果。

在一个实施例中,在目标测试用例队列中的测试用例为空的情况下,待测试程序的当前路径覆盖信息通过下述方式得到:对候选测试用例队列中的候选测试用例的字节进行变异处理,得到候选测试用例的变异候选测试用例;根据变异候选测试用例,对待测试程序进行测试,得到待测试程序的当前路径覆盖信息。

其中,候选测试用例队列是指存储有多个候选测试用例的集合;候选测试用例触发待测试程序的新路径的概率小于目标测试队列中的测试用例。因此,本实施例中的候选测试用例队列的测试优先级小于目标测试队列。

具体地,在目标测试用例队列中的测试用例为空的情况下,若当前仍未满足待测试程序的预设测试终止条件,则终端可以终止对待测试程序的测试,当然终端还可以继续从候选测试用例队列中获取候选测试用例;然后对候选测试用例的字节进行变异处理,得到候选测试用例的变异候选测试用例;根据变异候选测试用例,对待测试程序进行测试,得到待测试程序的当前路径覆盖信息,进而继续跳转到从候选测试用例队列中获取候选测试用例的步骤,知道满足待测试程序的预设测试终止条件。

在本实施例中,在目标测试用例队列中的测试用例为空的情况下,通过候选测试用例队列中的候选测试用例变异得到的变异候选测试用例,对待测试程序进行测试,得到待测试程序的当前路径覆盖信息,能够利用变异候选测试用例对待测试程序触发的当前路径覆盖信息进行查漏补缺,而且优先使用触发新路径概率更大的目标测试队列中的测试用例获取当前路径覆盖信息,能够减少触发新路径概率更小的候选测试用例在测试过程中的占比,从而有效地提升了对待测试程序的测试效率。

在一个实施例中,候选测试用例队列通过如下方式得到:确定目标测试用例队列中的测试用例对应的多个当前路径覆盖信息;在多个当前路径覆盖信息中未携带新路径覆盖信息的次数满足预设次数阈值的情况下,将测试用例作为候选测试用例,并将候选测试用例存储至候选测试用例队列。

具体地,针对目标测试用例队列中的每个测试用例,获取测试用例对应的多个当前路径覆盖信息,可以是测试用例在多轮测试中,通过其变异测试用例对待测试程序进行测试得到的多个当前路径覆盖信息;若多个当前路径信息中未携带新路径覆盖信息的次数满足预设次数阈值,即该测试用例在多轮变异处理中得到的变异测试用例,对待测试程序触发的新路径覆盖信息没有满足预设次数阈值,则终端将该测试用例作为候选测试用例存储至候选测试用例队列,并从目标测试用例队列中剔除该测试用例。

在本实施例中,通过确定目标测试用例队列中的测试用例对应的多个当前路径覆盖信息;在多个当前路径覆盖信息中未携带新路径覆盖信息的次数满足预设次数阈值的情况下,将测试用例作为候选测试用例,并将候选测试用例存储至候选测试用例队列,实现了候选测试用例队列的合理获取,以便利用候选测试用例生成变异候选测试用例对待测试程序触发的当前路径覆盖信息进行查漏补缺,提高了对待测试程序的测试效果。

在一个实施例中,候选测试用例队列还通过如下方式得到:从目标测试用例队列中,筛选出每个字节权重均为0或者负数的测试用例,作为候选测试用例;将候选测试用例存储至候选测试用例队列。

具体地,若目标测试用例队列中的测试用例的每个字节权重均为0或者负数,则将该测试用例作为候选测试用例,并将候选测试用例存储至候选测试用例队列,并从目标测试用例队列中剔除该测试用例。此外,终端还可以通过随机生成候选测试用例的方式,来构建候选测试用例队列。

在本实施例中,通过字节权重,对目标测试用例队列中的测试用例进行淘汰,并将淘汰的测试用例作为候选测试用例存储至候选测试用例队列中,不仅实现了候选测试用例队列的合理获取,还能够让目标测试用例队列中的测试用例维持在质量较高的水平,以提高目标测试用例队列中的测试用例对待测试程序的测试效果。

在一个实施例中,如图3所示,提供了另一种程序测试方法,以该方法应用于终端为例进行说明,包括以下步骤:

步骤S301,根据目标测试用例队列中的测试用例的各个字节的字节权重,从测试用例的各个字节中确定出目标变异字节。

步骤S302,对测试用例中的目标变异字节进行变异处理,得到测试用例的变异测试用例。

步骤S303,根据变异测试用例,对待测试程序进行测试,得到待测试程序的当前路径覆盖信息。

步骤S304,在待测试程序未触发崩溃,且当前路径覆盖信息中携带有新路径覆盖信息的情况下,对测试用例的目标变异字节的字节权重进行增加;跳转至上述步骤S301,直到满足待测试程序的预设测试终止条件。

步骤S305,在待测试程序未触发崩溃,且当前路径覆盖信息中未携带有新路径覆盖信息的情况下,对测试用例的目标变异字节的字节权重进行减少。

步骤S306,获取待测试程序的历史路径覆盖信息;根据当前路径覆盖信息和历史路径覆盖信息之间的差异,确定待测试程序的路径覆盖变化率。

可以理解的是,在步骤S304和步骤S305之前可以对是否满足待测试程序的预设终止条件,以及当前路径覆盖信息中是否携带有新路径覆盖信息进行判断,从而根据判断结果确定执行步骤S304或步骤S305。

步骤S307,在路径覆盖变化率不满足预设变化率阈值的情况下,对待测试程序的路径约束信息进行符号执行,得到待测试程序的实际用例,并将实际用例作为测试用例存储至目标测试用例队列中;跳转至上述步骤S301,直到满足待测试程序的预设测试终止条件。

步骤S308,在路径覆盖变化率满足预设变化率阈值的情况下,跳转至上述步骤S301,直到满足待测试程序的预设测试终止条件。

可以理解的是,在步骤S307和步骤S308之前可以对路径覆盖变化率是否满足预设变化率阈值进行判断,从而根据判断结果确定执行步骤S307或步骤S308。

上述程序测试方法,能够实现以下有益效果:通过测试用例的字节权重来确定字节的变异方向,并通过待测试程序的当前路径覆盖信息对测试用例的字节权重不断进行更新,从而使得测试用例能够向触发更多路径覆盖的方向进行字节变异,实现了对测试用例的变异策略的优化,不仅提高了对待测试程序的路径覆盖率,还能够让目标测试用例队列中的测试用例维持在质量较高的水平,从而大大提高了对待测试程序的测试效果。

为了更清晰阐明本公开实施例提供的程序测试方法,以下以一个具体的实施例对上述程序测试方法进行具体说明。如图4所示,提供了又一种程序测试方法,可以应用于终端,具体包括如下内容:

步骤S401:初始化:获取初始种子作为测试用例存储至目标测试用例队列。

步骤S402:程序预处理:对初始测试程序进行反汇编、插桩等预处理,得到待测试程序。

步骤S403:获取输入和队列维护:维护目标测试用例队列和候选测试用例队列,优先从目标测试用例队列中获取测试用例,在目标测试用例队列中的测试用例为空的情况下,从候选测试用例队列中获取候选测试用例。

步骤S404:种子变异:根据测试用例的各个字节的字节权重,确定出测试用例中的目标变异字节,利用模糊测试工具例如AFL(American Fuzzy Lop)对目标变异字节进行havoc变异,则终端得到测试用例的变异测试用例。

步骤S405:程序执行:将变异测试用例作为输入在待测试程序中执行。

步骤S405-1:若待测试程序执行变异测试用例的过程中触发了崩溃,将该变异测试用例记录至崩溃记录集,且对崩溃次数加一。若崩溃次数达到预设崩溃阈值,则结束对待测试程序的测试,进而分析这些崩溃是否为真实崩溃。

步骤S405-2:在待测试程序执行变异测试用例完成后,若待测试程序未触发崩溃且该变异测试用例覆盖了新路径,则将该变异测试用例作为一个新的测试用例存储至目标测试用例队列,并更新目标测试用例队列中该变异测试用例对应的测试用例中的字节权重,即对字节权重加一。返回上述步骤S403获取下一个输入。

步骤S405-3:若在待测试程序执行变异测试用例完成后,若待测试程序未触发崩溃且该变异测试用例未覆盖新路径,则更新目标测试用例队列中该变异测试用例对应的测试用例中的字节权重,即对字节权重减一。

步骤S406:监测待测试程序的路径覆盖变化率。

步骤S406-1:若路径覆盖变化率高于预设变化率阈值,则返回上述步骤S403。

步骤S406-2:若路径覆盖变化率低于预设变化率阈值,则执行步骤S407。

步骤S407:符号执行:获取待测试程序中设置的插桩函数收集的路径约束信息,进而对待测试程序的路径约束信息进行符号执行,可以是将待测试程序的路径约束信息输入约束求解器中,通过约束求解器对路径约束信息进行约束求解。

步骤S407-1:若通过约束求解器对路径约束信息进行约束求解后,得到路径约束信息对应的实际用例,则将实际用例作为测试用例存储至目标测试用例队列;返回上述步骤S403。

步骤S407-2:若通过约束求解器对路径约束信息进行约束求解后,无法得到路径约束信息对应的实际用例,则直接跳过,返回上述步骤S403。

在本实施例中,一方面,通过测试用例的字节权重来确定字节的变异方向,并通过待测试程序的当前路径覆盖信息对测试用例的字节权重不断进行更新,从而使得测试用例能够向触发更多路径覆盖的方向进行字节变异,实现了对测试用例的变异策略的优化,不仅提高了对待测试程序的路径覆盖率,还能够让目标测试用例队列中的测试用例维持在质量较高的水平,提高了对待测试程序的测试效果。另一方面,通过符号执行来获取新的测试用例,并通过新的测试用例使待测试程序触发的新路径覆盖信息,以解决当前路径覆盖信息中未携带有新路径覆盖信息的技术问题,从而进一步提高了对待测试程序的路径覆盖率,大大提高了对待测试程序的测试效果。

应该理解的是,虽然如上所述的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上所述的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。

基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的程序测试方法的程序测试装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个程序测试装置实施例中的具体限定可以参见上文中对于程序测试方法的限定,在此不再赘述。

在一个实施例中,如图5所示,提供了一种程序测试装置500,包括:字节变异模块501、用例测试模块502和权重更新模块503,其中:

字节变异模块501,用于根据目标测试用例队列中的测试用例的字节权重,对测试用例的字节进行变异处理,得到测试用例的变异测试用例。

用例测试模块502,用于根据变异测试用例,对待测试程序进行测试,得到待测试程序的当前路径覆盖信息。

权重更新模块503,用于根据当前路径覆盖信息,对测试用例的字节权重进行更新,并跳转至根据目标测试用例队列中的测试用例的字节权重,对测试用例的字节进行变异处理,得到测试用例的变异测试用例的步骤,直到满足待测试程序的预设测试终止条件。

在一个实施例中,字节变异模块501,还用于根据目标测试用例队列中的测试用例的各个字节的字节权重,从测试用例的各个字节中确定出目标变异字节;对测试用例中的目标变异字节进行变异处理,得到测试用例的变异测试用例。

在一个实施例中,权重更新模块503,还用于在待测试程序未触发崩溃,且当前路径覆盖信息中携带有新路径覆盖信息的情况下,对测试用例的目标变异字节的字节权重进行增加;在待测试程序未触发崩溃,且当前路径覆盖信息中未携带有新路径覆盖信息的情况下,对测试用例的目标变异字节的字节权重进行减少。

在一个实施例中,程序测试装置500还包括符号执行模块,用于获取待测试程序的历史路径覆盖信息;根据当前路径覆盖信息和历史路径覆盖信息之间的差异,确定待测试程序的路径覆盖变化率;在路径覆盖变化率不满足预设变化率阈值的情况下,对待测试程序的路径约束信息进行符号执行,得到待测试程序的实际用例,并将实际用例作为测试用例存储至目标测试用例队列中;在路径覆盖变化率满足预设变化率阈值的情况下,跳转至根据目标测试用例队列中的测试用例的字节权重,对测试用例的字节进行变异处理,得到测试用例的变异测试用例的步骤。

在一个实施例中,程序测试装置500还包括候选测试模块,用于对候选测试用例队列中的候选测试用例的字节进行变异处理,得到候选测试用例的变异候选测试用例;根据变异候选测试用例,对待测试程序进行测试,得到待测试程序的当前路径覆盖信息。

在一个实施例中,程序测试装置500还包括第一用例更新模块,用于确定目标测试用例队列中的测试用例对应的多个当前路径覆盖信息;在多个当前路径覆盖信息中未携带新路径覆盖信息的次数满足预设次数阈值的情况下,将测试用例作为候选测试用例,并将候选测试用例存储至候选测试用例队列。

在一个实施例中,程序测试装置500还包括第二用例更新模块,用于从目标测试用例队列中,筛选出每个字节权重均为0或者负数的测试用例,作为候选测试用例;将候选测试用例存储至候选测试用例队列。

上述程序测试装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。

在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图6所示。该计算机设备包括处理器、存储器、输入/输出接口、通信接口、显示单元和输入装置。其中,处理器、存储器和输入/输出接口通过系统总线连接,通信接口、显示单元和输入装置通过输入/输出接口连接到系统总线。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质和内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的输入/输出接口用于处理器与外部设备之间交换信息。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过WIFI、移动蜂窝网络、NFC(近场通信)或其他技术实现。该计算机程序被处理器执行时以实现一种程序测试方法。

本领域技术人员可以理解,图6中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。

在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。

在一个实施例中,提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。

需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。

以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。

相关技术
  • 打印程序测试方法、装置、计算机设备和存储介质
  • 测试方法、装置、计算机可读存储介质和计算机设备
  • 一种应用程序的测试方法、装置、电子设备及存储介质
  • 软件测试方法、装置、计算机设备和可读存储介质
  • 分组测试方法、装置、计算机设备及存储介质
  • 业务测试方法、计算机设备、存储介质和计算机程序产品
  • 一种应用程序测试方法、装置、存储介质和计算机设备
技术分类

06120115925143