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

代码测试方法及装置

文献发布时间:2023-06-19 12:19:35


代码测试方法及装置

技术领域

本说明书涉及软件测试技术领域,特别涉及一种代码测试方法。本说明书同时涉及一种代码测试装置,一种计算设备,以及一种计算机可读存储介质。

背景技术

目前,系统内核广泛部署应用与云计算领域,负责应用的安全稳定运行,其代码质量必须得到保障,因此,需要有效方式方法对操作系统内核进行缺陷测试。内核模糊测试技术作为一种软件测试技术,被广泛应用于内核的缺陷测试过程中。然而,目前模糊测试单纯以最大化整体内核代码覆盖为测试目标,缺乏对待测目标位置的感知能力与重点测试能力,因此,亟需一种解决上述问题的代码测试方法。

发明内容

有鉴于此,本说明书实施例提供了一种代码测试方法。本说明书同时涉及一种代码测试装置,一种计算设备,以及一种计算机可读存储介质,以解决现有技术中存在的技术缺陷。

根据本说明书实施例的第一方面,提供了一种代码测试方法,包括:

按照预设选取规则,从代码池的代码序列中选取目标代码序列,其中,所述代码池根据待测试代码构建得到;

通过执行所述目标代码序列,确定所述目标代码序列在所述待测试代码中覆盖的代码位置;

在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定针对所述目标代码序列的目标变更执行策略,其中,所述已测试位置为执行完成的代码序列在所述待测试代码中覆盖的位置;

通过基于所述目标变更执行策略对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试。

根据本说明书实施例的第二方面,提供了一种代码测试装置,包括:

选取模块,被配置为按照预设选取规则,从代码池的代码序列中选取目标代码序列,其中,所述代码池根据待测试代码构建得到;

确定位置模块,被配置为通过执行所述目标代码序列,确定所述目标代码序列在所述待测试代码中覆盖的代码位置;

确定策略模块,被配置为在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定针对所述目标代码序列的目标变更执行策略,其中,所述已测试位置为执行完成的代码序列在所述待测试代码中覆盖的位置;

执行模块,被配置为通过基于所述目标变更执行策略对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试。

根据本说明书实施例的第三方面,提供了一种计算设备,包括:

存储器和处理器;

所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:

按照预设选取规则,从代码池的代码序列中选取目标代码序列,其中,所述代码池根据待测试代码构建得到;

通过执行所述目标代码序列,确定所述目标代码序列在所述待测试代码中覆盖的代码位置;

在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定针对所述目标代码序列的目标变更执行策略,其中,所述已测试位置为执行完成的代码序列在所述待测试代码中覆盖的位置;

通过基于所述目标变更执行策略对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试。

根据本说明书实施例的第四方面,提供了一种计算机可读存储介质,其存储有计算机可执行指令,该指令被处理器执行时实现任意所述代码测试方法的步骤。

本说明书提供的代码测试方法,按照预设选取规则,从代码池的代码序列中选取目标代码序列,其中,所述代码池根据待测试代码构建得到;通过执行所述目标代码序列,确定所述目标代码序列在所述待测试代码中覆盖的代码位置;在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定针对所述目标代码序列的目标变更执行策略,其中,所述已测试位置为执行完成的代码序列在所述待测试代码中覆盖的位置;通过基于所述目标变更执行策略对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试,实现了针对待测试代码中指定位置(比如需要重点测试的位置)确定针对性的测试策略(目标变更执行策略),并通过针对性的测试策略对目标代码序列进行执行的方式,对待测试代码进行测试,提高了对待测试代码进行测试过程中对代码位置的感知能力,并提高了测试效率以及针对性。

附图说明

图1是本说明书一实施例提供的一种代码测试方法的示意流程图;

图2是本说明书一实施例提供的一种代码测试方法的流程图;

图3是本说明书一实施例提供的一种应用于Linux内核测试的代码测试方法的处理流程图;

图4是本说明书一实施例提供的一种代码测试装置的结构示意图;

图5是本说明书一实施例提供的一种计算设备的结构框图。

具体实施方式

在下面的描述中阐述了很多具体细节以便于充分理解本说明书。但是本说明书能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本说明书内涵的情况下做类似推广,因此本说明书不受下面公开的具体实施的限制。

在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本说明书一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本说明书一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

首先,对本说明书一个或多个实施例涉及的名词术语进行解释。

Linux:是一个一体化内核(Monolithic Kernel)系统。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。设备驱动程序可以完全访问硬件。Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。

FreeBSD:是一种类UNIX操作系统。

系统调用:就是程序进入内核执行任务。程序使用系统调用执行一系列的操作诸如:创建进程,网络和文件I/O等等。

内核:是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。现代操作系统设计中,为减少系统本身的开销,往往将一些与硬件紧密相关的(如中断处理程序、设备驱动程序等)、基本的、公共的、运行频率较高的模块(如时钟管理、进程调度等)以及关键性数据结构独立开来,使之常驻内存,并对他们进行保护。通常把这一部分称之为操作系统的内核。

模糊测试(Fuzzing),是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。

内核模糊测试:一种自动化操作系统内核缺陷测试方法。该方法首先随机生成系统调用序列,然后令操作系统执行随机生成的系统调用序列,以期在系统调用的执行过程中触发操作系统异常,进而发现内核缺陷。

种子:模糊测试过程中使用的测试用例。对于内核模糊测试来说,其种子由系统调用序列以及每个系统调用中的具体参数组成。

种子覆盖:内核执行种子过程中所覆盖内核位置的集合。

语料库:测试过程运行时产生的优质种子的集合,在测试运行开始时被模糊测试工具读取,在测试过程中被模糊测试工具更新。

种子变异执行:模糊测试过程对种子序列顺序、参数等进行变化后交由操作系统执行的过程。其中对种子进行变化的操作叫做种子变异操作。

种子调度方法:确定模糊测试过程中种子参与变异执行顺序、种子变异执行次数、变异操作类型的方法。

实际应用中,测试机制设计中,为了最大化对代码进行测试的比例和程度,图1示出了根据本说明书一实施例提供的一种代码测试方法的示意流程图。

以针对内核的模糊测试机制设计为例,模糊测试过程中主要通过整体内核代码覆盖数量指导测试过程。模糊测试基于“种子在执行过程中是否新增了整体覆盖位置”这一基本原则来评估种子质量与调度种子。模糊测试主要流程具体包括以下步骤:

步骤102:读取语料库。

具体的,在模糊测试开始之后,读取语料库,所述语料库,是指测试过程运行时产生的优质种子的集合,也可以理解为代码池,是根据待测试代码(比如内核)构建得到的,在测试运行开始时被测试程序读取,在测试过程中被测试程序更新。其中,种子:是在测试过程中使用的测试用例,也可以理解为可调用执行的代码或函数组成的代码序列;对于内核模糊测试来说,其种子由系统调用序列以及每个系统调用中的具体参数组成。

步骤104:随机选择语料库中的种子。

具体的,随机选择语料库中的种子的目的是:通过对选取出的种子进行变异执行,以实现对内核代码的测试,而变异执行,可以理解为对选取出的种子进行变更(即变异),并执行变更后(变异后)的种子。

步骤106:执行种子并收集种子执行过程中在内核中的覆盖位置。

具体的,内核,是一个操作系统的核心,这里可以理解为待测试代码,所述覆盖位置,可以理解为种子在执行过程中在内核(待测试代码)中覆盖的内核代码位置。

步骤108:根据执行后种子的覆盖位置进行种子质量评估:判断当前种子是否新增了对内核的整体覆盖位置?

具体的,判断当前种子是否新增了对内核的整体覆盖位置,是判断种子执行过程中是否覆盖到当前语料库中种子未曾覆盖到的内核代码位置(可以理解为已测试代码位置);若种子新增了对内核的整体覆盖,则执行下述步骤110:根据种子调度方法变异执行种子;若种子无新增对内核的整体覆盖位置,则丢弃种子。

步骤110:根据种子调度方法变异执行种子。

其中,该种子调度方法包括:确定种子执行的顺序、次数、和变异操作策略,并基于确定的顺序、次数、和变异操作策略变异执行种子。具体的,该种子调度方法包括:随机选择种子、默认固定值的执行次数并随机选取变异操作策略等,实际应用中,随机选择种子参与变异执行,则语料库中种子参与变异执行的概率相同;而种子调度中的次数采用默认值,即语料库中种子的变异执行次数为固定值。比如若种子新增了对内核的整体覆盖位置,则进行固定100次的种子变异执行,否则进行1次种子变异执行。

步骤112:判定是否结束测试。

具体的,可以根据是否接收到测试结束指令,判定是否需要结束测试,若无接收到测试结束指令,则通过变异后的种子更新语料库,并从语料库中随机选择种子进行下一轮变异执行,若接收到测试结束指令,则测试结束。

根据上述测试流程可以看出,当前种子调度以种子是否新增内核整体覆盖为指导,确定种子参与变异执行的顺序、次数、变异策略。

根据当前的内核测试种子调度设计可以看出,当前调度机制缺乏对目标位置重点测试这一目的的关注与机制设计,导致当前内核测试缺乏针对性,目标覆盖速度与目标相关缺陷的测试能力受限,无法及时发现待测位置相关的内核缺陷。

为了解决上述问题,进一步的,在本说明书中,提供了一种代码测试方法,本说明书同时涉及一种代码测试装置,一种计算设备,以及一种计算机可读存储介质,在下面的实施例中逐一进行详细说明。

图2示出了根据本说明书一实施例提供的一种代码测试方法的流程图,具体包括以下步骤:

步骤202:按照预设选取规则,从代码池的代码序列中选取目标代码序列,其中,所述代码池根据待测试代码构建得到。

具体的,所述预设选取规则,是指预先设置的在代码池中选取待执行的代码序列(即目标代码序列)的规则,该规则,可以是随机选取,也可以是按照代码序列在代码池中的排列顺序进行选取,此外,还可以是其他的选取规则,在此不做限制。

所述代码序列,可以理解为对待测试代码进行测试的测试用例,具体的,可以理解为由待测试代码中随机选取的可执行的调用函数以及调用函数对应的调用参数组成。其中,所述待测试代码,可以是操作系统内核,软件程序等,其中,操作系统内核包括:Linux内核,FreeBSD内核等,在此不做限制;所述代码池是通过在待测试代码中选取的代码序列的集合,而所述目标代码序列,是指在代码池中选取的待执行的代码序列,实际应用中,通过在代码池中选取目标代码序列,并通过对该目标代码序列进行调度对待测试代码进行测试。

步骤204:通过执行所述目标代码序列,确定所述目标代码序列在所述待测试代码中覆盖的代码位置。

其中,所述代码位置,可以理解为目标代码序列在执行过程中所执行的代码在待测试代码中的位置。而通过目标代码序列在待测试代码中覆盖的代码位置,可以明确针对待测试代码中的哪些代码(比如函数名称/函数名称/代码行等)进行了测试,并明确执行过程中测试的函数的数量。具体实施时,所述代码位置,可以是通过对覆盖的代码路径、代码行、函数名称等进行编码,形成的字符串、编码数值等,比如采用64位的二进制编码表示代码位置。

步骤206:在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定针对所述目标代码序列的目标变更执行策略。

其中,所述已测试位置为执行完成的代码序列在所述待测试代码中覆盖的位置。

所述预设目标测试位置,是指预先设置的需要进行重点测试的位置,具体的,该预设目标测试位置,可理解为需要重点测试代码所在的文件夹(也可理解为测试模块),具体的,可通过文件夹名称进行表示,或需要重点测试代码所在的文件,具体的,可通过文件名称进行表示,此外,还可以是需要重点测试代码对应的函数名称等,在此不做限制。

实际应用中,若执行目标代码序列覆盖的代码位置位于已测试位置,表明已经针对该位置进行过测试,而代码位置位于已测试位置并且位于预设目标测试位置,表明在对该位置已经进行过测试的基础上,此位置又为指定的重点测试区域,则需要对该位置进行重点测试,即确定针对重点测试区域进行测试的目标变更执行策略。

相应的,所述变更执行策略,是指如何对目标代码序列进行变更并执行的策略,比如变更方式和/或执行次数等策略,在确定目标变更执行策略的基础上,即可按照目标变更执行策略,对目标代码序列进行变更并执行,以对待测试代码的预设目标测试位置进行重点测试。

具体实施时,在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定对所述目标代码序列进行变更的目标变更类型以及目标变更执行次数;

将所述目标变更类型以及所述目标变更执行次数,作为所述目标变更执行策略。

具体的,变更类型,可以理解为代码序列进行变更的方式,比如粗粒度变更类型或细粒度变更类型;其中,粗粒度变更类型可以理解为对代码序列进行较大变更的变更类型,细粒度变更类型可以理解为对代码序列进行较小变更的变更类型。执行次数,可以理解为对代码序列进行变更并执行的次数,实际应用中,每对代码序列进行一次变更,则执行变更后的代码序列,以便对待测试代码进行测试。

进一步的,目标变更类型,是指在代码位置位于已测试位置,并且位于预设目标测试位置的情况下,对目标代码序列的变更类型,而目标执行次数,是指在代码位置位于已测试位置,并且位于预设目标测试位置的情况下,对目标代码序列进行变更并执行的次数。具体实施时,将所述目标变更类型以及所述目标变更执行次数,作为所述目标变更执行策略,以便指示在代码位置位于已测试位置,并且位于预设目标测试位置的情况下,如何基于目标代码序列对待测试代码进行测试。

再进一步的,所述确定对所述目标代码序列进行变更的目标变更类型以及目标变更执行次数,包括:确定所述目标优先级对应的变更次数算法以及所述目标代码序列的目标变更类型;

基于所述变更次数算法以及所述代码位置,确定所述目标变更执行次数。

其中,所述变更次数算法,是指预设的计算变更次数的算法,实际应用中,根据变更次数算法以及根据代码序列的执行情况(比如执行过程中在待测试代码中覆盖的代码位置、在待测试代码中覆盖的调用函数的数量或第几次命中一个已测试位置等),动态地确定变更执行次数,提高了变更执行目标代码序列的灵活性以及自适应性。

具体实施时,变更次数算法,可以根据代码序列的执行情况计算变更次数,比如,目标变更执行次数=N/目标代码序列的目标覆盖数量,其中,N为最大执行次数,目标代码序列的目标覆盖数量为:执行目标代码序列的过程中针对预设目标测试位置中的某一位置(比如调用函数)的覆盖次数,具体的,目标覆盖数量越多表明预设的重点测试区域中的某一位置被覆盖(测试)的次数越多,则可以减少对该目标代码序列的变更执行次数,反之,目标覆盖数量越少表明预设的重点测试区域中的某一位置被覆盖(测试)的次数越少,则需要增加对目标代码序列的变更执行次数。

此外,还可以预设目标覆盖数量区间与变更次数的对应关系,则在确定目标覆盖数量基础上,根据此对应关系确定目标覆盖数量所在的目标覆盖数量区间,并基于目标覆盖数量区间以及此对应关系,确定针对目标代码序列对应的变更次数。

进一步的,为了加快对待测试代码的测试效率,可以采用多个进程选取待执行的代码序列,并对选取的代码序列进行变更执行,在这种情况下,可以将待执行的代码序列划分执行优先级,以便按照优先级顺序对待执行的代码序列进行变更执行,以便降低对待执行的代码序列进行执行的随机性,也增强了在测试过程中对预设目标测试位置的针对性,本说明书实施例提供的一种可选实施方式中,所述确定针对所述目标代码序列的目标变更执行策略,具体采用如下方式实现:

确定所述目标代码序列对应的执行优先级为目标优先级;

基于所述目标优先级,确定对所述目标代码序列进行变更的目标变更类型以及目标变更执行次数;

将所述目标优先级、所述目标变更类型以及所述目标变更执行次数,作为所述目标变更执行策略。

具体的,目标优先级,可以为中优先级,而目标变更类型,可以为细粒度变更类型,变更执行次数可以为一个针对目标优先级对应的代码序列预设的执行次数,比如一百次,一千次等,在此不做限制。

本说明书实施例,通过对执行过程中在待测试代码中覆盖的代码位置位于已测试位置,并且位于预设目标测试位置的代码序列,确定对应的变更执行策略,以便提高对预先设定的重点位置进行重点测试。

进一步的,在代码位置位于已测试位置,并且位于预设目标测试位置的情况下,还可以通过变更次数算法,并根据代码序列的执行情况,动态地确定变更执行次数,提高了变更执行目标代码序列的灵活性以及自适应性,本说明书实施例提供的一种可选实施方式中,所述基于所述目标优先级,确定对所述目标代码序列进行变更的目标变更类型以及目标变更执行次数,具体采用如下方式实现:

基于所述目标优先级,确定所述目标优先级对应的变更次数算法以及所述目标代码序列的目标变更类型;

基于所述变更次数算法以及所述代码位置,确定所述目标变更执行次数。

具体的,变更次数算法还可以为:目标变更执行次数=10*[目标代码序列的目标覆盖数量/所在队列的代码序列的平均目标覆盖数量],变更次数计算结果向下取整。其中,目标代码序列的目标覆盖数量为:执行目标代码序列的过程中针对预设目标测试位置区域内代码或某一位置(比如调用函数)的覆盖次数,所在队列的代码序列的平均目标覆盖数量为:目标代码序列所在的优先级队列中的代码序列在执行过程中,针对预设目标测试位置区域内代码或某一位置(比如调用函数)的覆盖次数的平均值。

基于此,在目标代码序列的目标覆盖数量为针对预设目标测试位置区域内代码的覆盖次数的情况下,可以基于代码位置在预设目标测试区域对应的位置条目数量进行确定,比如代码位置中包含3个64位的二进制的位置编码,每个位置编码都表示目标代码序列在执行过程中覆盖的其中一个代码位置,其中,有两个位置编码在预设目标测试位置区域内,则目标覆盖数量为2。

具体实施时,还可以针对所述代码位置非位于已测试位置的情况,确定针对目标代码序列对应的执行策略,本说明书实施例提供的一种可选实施方式中,所述确定所述目标代码序列在所述待测试代码中覆盖的代码位置之后,还包括:

在所述代码位置非位于所述已测试位置的情况下,确定所述目标代码序列对应的执行优先级为第一优先级;

基于所述第一优先级,确定对所述目标代码序列进行变更的第一变更类型以及第一变更执行次数;

通过基于所述第一优先级、所述第一变更类型以及所述第一变更执行次数,对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试。

具体的,若代码位置非位于所述已测试位置,表明在对待测试代码进行测试的过程中,没有对代码位置对应的代码进行测试过,则为了提高对待测试代码进行较为全面的测试,将目标代码序列对应的执行优先级确定为高优先级(即第一优先级)。

进一步的,基于第一优先级,确定目标代码序列进行变更的第一变更类型的具体实现是多种多样的,具体的,可以是在预设多种变更类型中随机选择一个变更类型作为第一变更类型,比如,在粗粒度变更类型和细粒度变更类型的随机选择一种变更类型作为第一变更类型;而基于第一优先级,确定目标代码序列进行变更的第一变更执行次数的方式也是多种多样的,具体的,可以是根据第一优先级以及预设的优先级和变更执行次数的对应关系确定的,比如第一优先级在对应关系中对应的执行次数为一百次,则确定第一变更执行次数为一百次,而执行次数为一百次,表明需要对目标代码序列进行一百次变更执行,即需要对目标代码序列进行一百次变更,并对每次变更后的目标代码序列进行执行。

在确定第一优先级、第一变更类型以及第一变更执行次数的基础上,则将第一优先级、第一变更类型以及第一变更执行次数作为针对目标代码序列进行变更执行的执行策略,以便基于该执行策略执行目标代码序列,对待测试代码进行测试,实现了针对待测试代码中未测试过的代码,确定对应的测试策略,从而针对未测试过的代码进行针对性地测试。

此外,还可以针对代码位置位于已测试位置,并且非位于预设目标测试位置的情况,确定针对目标代码序列对应的执行策略,本说明书实施例提供的一种可选实施方式中,所述确定所述目标代码序列在所述待测试代码中覆盖的代码位置之后,还包括:

在所述代码位置位于所述已测试位置,并且非位于所述预设目标测试位置的情况下,确定所述目标代码序列对应的执行优先级为第二优先级;

基于所述第二优先级,确定对所述目标代码序列进行变更的第二变更类型以及第二变更执行次数;

通过基于所述第二优先级、所述第二变更类型以及所述第二变更执行次数,对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试。

具体的,若代码位置位于所述已测试位置,表明在对待测试代码进行测试的过程中,已经对代码位置对应的代码进行测试过,而代码位置非位于预设目标测试位置,表明代码位置不是指定的重点测试位置,则将目标代码序列对应的执行优先级确定为低优先级(即第二优先级)。

进一步的,基于第二优先级,确定目标代码序列进行变更的第二变更类型的具体实现是多种多样的,具体的,可以是在预设多种变更类型中随机选择一个变更类型作为第二变更类型,比如,在粗粒度变更类型和细粒度变更类型的随机选择一种变更类型作为第二变更类型;此外,也可以直接确定第二变更类型为粗粒度变更类型;而基于第二优先级,确定目标代码序列进行变更的第二变更执行次数的方式也是多种多样的,具体的,可以是根据第二优先级以及预设的优先级和变更执行次数的对应关系确定的,比如第二优先级在对应关系中对应的执行次数为1次,则确定第二变更执行次数为1次。

在确定第二优先级、第二变更类型以及第二变更执行次数的基础上,则将第二优先级、第二变更类型以及第二变更执行次数作为针对目标代码序列进行变更执行的执行策略,以便基于该执行策略执行目标代码序列,对待测试代码进行测试,实现了针对待测试代码中已经测试过的代码,但非指定位置区域内的代码确定对应的测试策略,从而针对这些代码进行针对性地测试。

步骤208:通过基于所述目标变更执行策略对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试。

具体的,基于所述目标变更执行策略对所述目标代码序列进行变更执行,是指基于目标变更执行策略,对目标代码序列进行变更并执行。

具体实施时,基于目标变更执行策略对目标代码序列进行变更执行,可以通过上述确定的目标优先级、目标变更类型以及所述目标变更执行次数对目标代码序列进行变更执行,以实现对预设目标测试位置区域的代码进行重点测试,在本说明书实施例提供的一种可选实施方式中,所述基于所述目标变更执行策略对所述目标代码序列进行变更执行,包括:

将所述目标代码序列添加至所述目标优先级对应的目标优先级队列;

按照每个优先级队列对应的优先级从高到低的顺序,从所述每个优先级队列获取待执行的代码序列,其中所述优先级队列包括:目标优先级队列,所述待执行的代码序列包括:目标代码序列;

在获取的待执行的代码序列为目标代码序列的基础上,根据所述目标变更类型以及所述目标变更执行次数,确定每次对所述目标代码序列进行变更的变更操作;

基于所述变更操作,对所述目标代码序列进行变更,并执行变更后的目标代码序。

实际应用中,每种执行优先级存在对应的优先级队列,而目标优先级对应目标优先级队列,在确定目标代码序列的对应的优先级为目标优先级的基础上,将目标代码序列添加至目标优先级对应的目标优先级队列,比如目标优先级为中优先级,则将目标代码序列添加至中优先级对应的中优先级队列中。

具体实施时,在存在多个优先级队列的情况下,比如除了中优先级队列之外,还存在高优先级队列、低优先级队列,其中,高优先级队列对应高优先级,低优先级队列对应低优先级,则按照每个优先级队列对应的优先级从高到低的顺序,依次从各个优先级队列获取待执行的代码序列并执行,其中,待执行的代码序列包括目标代码序列,在获取到目标代码序列的情况下,根据预先针对目标代码序列确定的目标变更类型,从中选取对应的变更操作,比如,粗粒度变更类型对应的变更操作包括:调整序列中调用函数的顺序,在代码序列中新增调用函数,在代码序列中删除调用函数等,细粒度变更类型对应的变更操作包括:改变调用函数的调用参数等;

进一步的,根据所述目标变更类型以及所述目标变更执行次数,确定每次对所述目标代码序列进行变更的变更操作,可以理解为在目标变更执行次数中每次根据目标变更类型,确定对目标代码序列进行变更的变更操作,并基于变更操作对目标代码序列进行变更,并执行变更后的目标代码序列。

具体实施时,在对目标代码序列进行变更执行的过程中,还可以根据变更后的待测试代码的执行情况,对代码池进行更新,提高了代码池中代码序列的测试质量,本说明书实施例提供的一种可选实施方式中,所述代码测试方法,还包括:

确定执行变更后的目标代码序列在所述待测试代码中覆盖的第二代码位置;

基于所述第二代码位置,对所述变更后的目标代码序列进行评估;

在评估结果满足预设条件的情况下,根据所述变更后的目标代码序列更新所述代码池。

具体实施时,通过执行变更后的目标代码序列,确定执行变更后的目标代码序列在待测试代码中覆盖的代码位置,即第二代码位置,并基于第二代码位置,对变更后的目标代码序列进行评估,具体的,可以将第二代码位置与已测试位置进行对比的方式,对更新后的目标代码序列的新增覆盖的位置数量进行评估,获得的评估结果为执行更新后的目标代码序列所新增覆盖的位置数量,若该新增覆盖的位置数量大于预设数量,表明更新后的目标代码序列的质量较高,即对待测试代码进行测试的帮助较大,则将变更后的目标代码序列添加至代码池。

此外,还可以基于第二代码位置,对更新后的目标代码序列在待测试代码中覆盖的位置数量进行评估,若覆盖的位置数量大于预设数量,表明更新后的目标代码序列的质量较高,即对待测试代码进行测试的帮助较大,则将更新后的目标代码序列添加至代码池,此外,还可以采用其他评估方式,在此不做限制。

相应的,所述预设条件,是基于上述采用的评估方式确定的,具体的,可以是新增覆盖的位置数量大于预设数量,此外,也可以是覆盖数量大于预设数量等,在此不做限制。

在对更新后的目标代码序列进行评估的基础上,还存在评估结果不满足预设条件的情况,在本说明书实施例提供的一种可选实施方式中,所述对所述变更后的目标代码序列进行评估之后,还包括:

在评估结果不满足预设条件的情况下,删除所述变更后的目标代码序列。

具体的,在评估结果不满足预设条件的情况下,表明更新后的目标代码序列的质量较低,即对待测试代码进行测试的帮助不大,则无需保留变更后的目标代码序列,将变更后的目标代码序列进行删除,避免了浪费存储。

进一步的,在对待测试代码进行测试的基础上,还可以结束对待测试代码的测试,实际应用中,结束对待测试代码进行测试的原因是多种多样,在本说明书实施例提供的一种可选实施方式中,所述对所述待测试代码进行测试之后,还包括:

接收用户针对所述待测试代码提交的测试结束指令;

基于所述测试结束指令,结束针对所述待测试代码的测试。

具体的,所述用户,可以为待测试代码的测试人员,在此不做限制,所述测试结束指令,是指示结束对待测试代码进行测试的指令,本说明书实施例,通过用户手动提交测试结束指令,结束针对待测试代码的测试,增加了针对待测试代码结束测试的灵活性。

除上述结束对待测试代码进行测试的方法之外,在本说明书实施例提供的一种可选实施方式中,所述对所述待测试代码进行测试之后,还包括:

在监测到满足预设的测试结束条件的情况下,结束针对所述待测试代码的测试。

其中,所述测试结束条件,是指预先设置的结束测试的条件,具体的,可以是测试时间到达100小时、设置的测试代码位置已经全部测试完成或测试完成80%等,在此不做限制。

本说明书实施例,通过预先设置测试结束条件,在监测到满足测试结束条件的基础上,结束针对待测试代码的测试,实现了根据测试情况自动对待测试代码结束测试,即在满足测试目标的情况下,结束测试,增加了测试效率并避免了浪费测试资源。

综上所述,本说明书提供的代码测试方法,按照预设选取规则,从代码池的代码序列中选取目标代码序列,其中,所述代码池根据待测试代码构建得到;通过执行所述目标代码序列,确定所述目标代码序列在所述待测试代码中覆盖的代码位置;在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定针对所述目标代码序列的目标变更执行策略,其中,所述已测试位置为执行完成的代码序列在所述待测试代码中覆盖的位置;通过基于所述目标变更执行策略对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试,实现了针对待测试代码中指定位置(比如需要重点测试的位置)确定针对性的测试策略(目标变更执行策略),并通过针对性的测试策略对目标代码序列进行执行的方式,对待测试代码进行测试,提高了测试过程中对位置的感知,并提高了测试效率以及针对性。

下述结合附图3,以本说明书提供的代码测试方法在Linux内核测试的应用为例,对所述代码测试方法进行进一步说明。其中,图3示出了本说明书一实施例提供的一种应用于Linux内核测试的代码测试方法的处理流程图,具体包括以下步骤:

步骤302:读取语料库与目标位置。

在测试开始之后,读取语料库,其中,语料库,可以理解为上述实施例中的代码池,具体的,为在Linux内核中按照选取规则(比如随机)选取的系统调用组成的系统调用序列的集合,所述目标位置,可以理解为上述实施例中的预设目标测试位置,即预设的待测位置列表,而待测位置列表中的待测位置可由目标模块名(文件夹名)、文件名、函数名、代码所在行数表示。

步骤304:从语料库中随机选择种子参与变异执行。

具体的,选择的种子可以理解为上述实施例中的目标代码序列,变异执行,可以理解为上述实施例中的变更执行。

步骤306:执行种子并收集种子覆盖。

其中,种子覆盖,可以理解为上述实施例中的代码位置,即内核执行种子过程中在内核代码中所覆盖的内核代码位置的集合。

步骤308:种子覆盖与当前语料库分布对比。

其中,所述种子覆盖与当前语料库分布对比,可以理解为将种子覆盖与当前语料库中已执行的种子的覆盖情况进行分布对比,即位置对比。

步骤310:根据靶向优先级排序算法确定种子优先级。

其中,靶向优先级排序算法,可以理解为基于种子覆盖情况确定种子优先级排序的算法,具体实施时,通过比较种子覆盖与预设的目标位置(可理解为上述实施例中的预设目标测试位置),以及比较种子覆盖于语料库中其他种子覆盖情况(已测试位置),构建种子靶向调度队列,其中,种子靶向调度队列分为高中低三个优先级。具体测试过程中,根据种子是否新增了对内核的整体覆盖位置与覆盖了目标位置确定种子进入的靶向调度队列类型,即靶向优先级排序算法:若种子新增了对内核的整体覆盖位置,则进入高优先级队列;若种子无新增对内核的整体覆盖位置但覆盖了目标位置,则进入中优先级队列;否则进入低优先级队列。测试过程中,先后从高中低优先级队列中选择种子进行变异执行,同优先级队列内种子按先入先出规则被选择进行变异执行。

步骤312:种子靶向变异次数判定算法确定变异次数。

具体的,种子靶向变异次数判定算法,可以理解为针对执行种子过程中覆盖的代码位置的变异次数判定算法,而种子靶向变异次数判定算法,包括上述实施例中的变更次数算法;实际应用中,根据种子靶向变异次数判定算法确定种子变异次数,可以是:将高优先级队列中的种子被选择后固定执行100次变异执行;将中优先级队列中的种子被选择后执行10*[目标代码序列的目标覆盖数量/所在队列的代码序列的平均目标覆盖数量]次变异执行;将低优先级队列中的种子被选择后执行1次变异执行。

步骤314:根据种子靶向变异策略确定种子变异策略。

具体的,种子靶向变异策略,可以理解为上述实施例中的变更类型(变异类型),所述种子变异策略,可以理解为上述实施例中的变更操作(即变异操作),实际应用中,将变异操作分为细粒度与粗粒度两种变异类型,并根据种子所在队列进行偏向性变异策略选择,使得覆盖目标位置的种子更多采用细粒度变异,未覆盖目标位置的种子更多采用粗粒度变异。其中,粗粒度变异操作包括序列交叉拼接、增删系统调用,该类操作会较大程度上改变种子覆盖位置;细粒度变异操作包括调用参数修改,该类操作会较小程度上改变种子种子覆盖位置。种子变异策略选择时,高优先级队列种子采用粗粒度与细粒度变异策略的概率相等;中优先级队列种子采用细粒度变异策略;低优先级队列种子采用粗粒度变异策略。

步骤316:判断是否结束测试。

具体的,可以根据是否接收到测试结束指令判断是否结束测试。若有,则结束测试;若无,则执行下述步骤318。

步骤318:基于优先级队列的种子选择。

具体的,基于优先级队列的种子选择是从靶向优先级队列中按优先级选择种子参与下一轮的变异执行。

综上所述,本说明书提供的代码测试方法,按照预设选取规则,从代码池的代码序列中选取目标代码序列,其中,所述代码池根据待测试代码构建得到;通过执行所述目标代码序列,确定所述目标代码序列在所述待测试代码中覆盖的代码位置;在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定针对所述目标代码序列的目标变更执行策略,其中,所述已测试位置为执行完成的代码序列在所述待测试代码中覆盖的位置;通过基于所述目标变更执行策略对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试,实现了针对待测试代码中指定位置(比如需要重点测试的位置)确定针对性的测试策略(目标变更执行策略),并通过针对性的测试策略对目标代码序列进行执行的方式,对待测试代码进行测试,提高了对待测试代码进行测试过程中对代码位置的感知能力,并提高了测试效率以及针对性。

与上述方法实施例相对应,本说明书还提供了代码测试装置实施例,图4示出了本说明书一实施例提供的一种代码测试装置的结构示意图。如图4所示,该装置包括:

选取模块402,被配置为按照预设选取规则,从代码池的代码序列中选取目标代码序列,其中,所述代码池根据待测试代码构建得到;

确定位置模块404,被配置为通过执行所述目标代码序列,确定所述目标代码序列在所述待测试代码中覆盖的代码位置;

确定策略模块406,被配置为在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定针对所述目标代码序列的目标变更执行策略,其中,所述已测试位置为执行完成的代码序列在所述待测试代码中覆盖的位置;

执行模块408,被配置为通过基于所述目标变更执行策略对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试。

可选的,所述确定策略模块406,进一步被配置为:

确定对所述目标代码序列进行变更的目标变更类型以及目标变更执行次数;

将所述目标变更类型以及所述目标变更执行次数,作为所述目标变更执行策略。

可选的,所述确定策略模块406,进一步被配置为:

所述确定对所述目标代码序列进行变更的目标变更类型以及目标变更执行次数,包括:确定所述目标优先级对应的变更次数算法以及所述目标代码序列的目标变更类型;

基于所述变更次数算法以及所述代码位置,确定所述目标变更执行次数。

可选的,所述确定策略模块406,进一步被配置为:

确定所述目标代码序列对应的执行优先级为目标优先级;

基于所述目标优先级,确定对所述目标代码序列进行变更的目标变更类型以及目标变更执行次数;

将所述目标优先级、所述目标变更类型以及所述目标变更执行次数,作为所述目标变更执行策略。

可选的,所述确定策略模块406,进一步被配置为:

基于所述目标优先级,确定所述目标优先级对应的变更次数算法以及所述目标代码序列的目标变更类型;

基于所述变更次数算法以及所述代码位置,确定所述目标变更执行次数。

可选的,所述执行模块408,进一步被配置为:

将所述目标代码序列添加至所述目标优先级对应的目标优先级队列;

按照每个优先级队列对应的优先级从高到低的顺序,从所述每个优先级队列获取待执行的代码序列,其中所述优先级队列包括:目标优先级队列,所述待执行的代码序列包括:目标代码序列;

在获取的待执行的代码序列为目标代码序列的基础上,根据所述目标变更类型以及所述目标变更执行次数,确定每次对所述目标代码序列进行变更的变更操作;

基于所述变更操作,对所述目标代码序列进行变更,并执行变更后的目标代码序。

可选的,所述代码测试装置,还包括:

第一确定优先级模块,被配置为在所述代码位置非位于所述已测试位置的情况下,确定所述目标代码序列对应的执行优先级为第一优先级;

第一确定次数模块,被配置为基于所述第一优先级,确定对所述目标代码序列进行变更的第一变更类型以及第一变更执行次数;

第一执行模块,被配置为通过基于所述第一优先级、所述第一变更类型以及所述第一变更执行次数,对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试。

可选的,所述代码测试装置,还包括:

第二确定优先级模块,被配置为在所述代码位置位于所述已测试位置,并且非位于所述预设目标测试位置的情况下,确定所述目标代码序列对应的执行优先级为第二优先级;

第二确定次数模块,被配置为基于所述第二优先级,确定对所述目标代码序列进行变更的第二变更类型以及第二变更执行次数;

第二执行模块,被配置为通过基于所述第二优先级、所述第二变更类型以及所述第二变更执行次数,对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试。

可选的,所述代码测试装置,还包括:

接收模块,被配置为接收用户针对所述待测试代码提交的测试结束指令;

第一结束模块,被配置为基于所述测试结束指令,结束针对所述待测试代码的测试。

可选的,所述代码测试装置,还包括:

第二结束模块,被配置为在监测到满足预设的测试结束条件的情况下,结束针对所述待测试代码的测试。

可选的,所述代码测试装置,还包括:

第二确定位置模块,被配置为确定执行变更后的目标代码序列在所述待测试代码中覆盖的第二代码位置;

评估模块,被配置为基于所述第二代码位置,对所述变更后的目标代码序列进行评估;

更新模块,被配置为在评估结果满足预设条件的情况下,根据所述变更后的目标代码序列更新所述代码池。

可选的,所述代码测试装置,还包括:

删除模块,被配置为在评估结果不满足预设条件的情况下,删除所述变更后的目标代码序列。

综上所述,本说明书提供的代码测试装置,按照预设选取规则,从代码池的代码序列中选取目标代码序列,其中,所述代码池根据待测试代码构建得到;通过执行所述目标代码序列,确定所述目标代码序列在所述待测试代码中覆盖的代码位置;在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定针对所述目标代码序列的目标变更执行策略,其中,所述已测试位置为执行完成的代码序列在所述待测试代码中覆盖的位置;通过基于所述目标变更执行策略对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试,实现了针对待测试代码中指定位置(比如需要重点测试的位置)确定针对性的测试策略(目标变更执行策略),并通过针对性的测试策略对目标代码序列进行执行的方式,对待测试代码进行测试,提高了对待测试代码进行测试过程中对代码位置的感知能力,并提高了测试效率以及针对性。

上述为本实施例的一种代码测试装置的示意性方案。需要说明的是,该代码测试装置的技术方案与上述的代码测试方法的技术方案属于同一构思,代码测试装置的技术方案未详细描述的细节内容,均可以参见上述代码测试方法的技术方案的描述。

图5示出了根据本说明书一个实施例提供的一种计算设备500的结构框图。该计算设备500的部件包括但不限于存储器510和处理器520。处理器520与存储器510通过总线530相连接,数据库550用于保存数据。

计算设备500还包括接入设备540,接入设备540使得计算设备500能够经由一个或多个网络560通信。这些网络的示例包括公用交换电话网(PSTN)、局域网(LAN)、广域网(WAN)、个域网(PAN)或诸如因特网的通信网络的组合。接入设备540可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(NIC))中的一个或多个,诸如IEEE802.11无线局域网(WLAN)无线接口、全球微波互联接入(Wi-MAX)接口、以太网接口、通用串行总线(USB)接口、蜂窝网络接口、蓝牙接口、近场通信(NFC)接口,等等。

在本说明书的一个实施例中,计算设备500的上述部件以及图5中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图5所示的计算设备结构框图仅仅是出于示例的目的,而不是对本说明书范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。

计算设备500可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或PC的静止计算设备。计算设备500还可以是移动式或静止式的服务器。

其中,处理器520用于执行如下计算机可执行指令:

按照预设选取规则,从代码池的代码序列中选取目标代码序列,其中,所述代码池根据待测试代码构建得到;

通过执行所述目标代码序列,确定所述目标代码序列在所述待测试代码中覆盖的代码位置;

在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定针对所述目标代码序列的目标变更执行策略,其中,所述已测试位置为执行完成的代码序列在所述待测试代码中覆盖的位置;

通过基于所述目标变更执行策略对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试。

上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技术方案与上述的代码测试方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述代码测试方法的技术方案的描述。

本说明书一实施例还提供一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时以用于:

按照预设选取规则,从代码池的代码序列中选取目标代码序列,其中,所述代码池根据待测试代码构建得到;

通过执行所述目标代码序列,确定所述目标代码序列在所述待测试代码中覆盖的代码位置;

在所述代码位置位于已测试位置,并且位于预设目标测试位置的情况下,确定针对所述目标代码序列的目标变更执行策略,其中,所述已测试位置为执行完成的代码序列在所述待测试代码中覆盖的位置;

通过基于所述目标变更执行策略对所述目标代码序列进行变更执行的方式,对所述待测试代码进行测试。

上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的代码测试方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述代码测试方法的技术方案的描述。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

所述计算机指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。

需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本说明书并不受所描述的动作顺序的限制,因为依据本说明书,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本说明书所必须的。

在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。

以上公开的本说明书优选实施例只是用于帮助阐述本说明书。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本说明书的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本说明书。本说明书仅受权利要求书及其全部范围和等效物的限制。

相关技术
  • 代码测试方法、代码测试装置及代码测试系统
  • 代码测试方法及代码测试系统
技术分类

06120113255933