一种基于粒子群算法的深度学习库接口测试方法转让专利

申请号 : CN202211462877.3

文献号 : CN115617693B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 单纯廖书妍钟晨闫憬睿韩瑾锐

申请人 : 北京理工大学

摘要 :

一种基于粒子群算法的深度学习库接口测试方法,把测试样本的生成过程抽象成粒子寻找最优位置的过程,通过对粒子前进方向和前进距离的选择,使生成的测试样本能尽可能暴露深度学习库接口缺陷。该方法能够有效减少测试所需的测试样本数量,提高了测试效率,同时基于对测试预言问题解决方案的定义,提高了对深度学习库缺陷检测的准确性,降低了误报。

权利要求 :

1.一种基于粒子群算法的深度学习库接口测试方法,包括以下步骤:步骤S1,定义变异策略,用于随机选择种子样本中指定数量的参数执行变异策略来生成新测试样本;

步骤S2,定义测试预言问题解决方案,用于判断待测深度学习库接口在给定测试样本下的执行结果是否符合预期要求;

步骤S3,初始化粒子群,以种子测试样本作为粒子群中粒子的初始位置;

步骤S4,确定粒子的前进方向和前进距离;

所述步骤S4中,确定粒子前进方向的方法包括:

S41,按粒子群的迭代阶段来计算变异策略的得分:迭代初期,对指定的变异策略,以 来计

算其得分;

迭代中期,对指定的变异策略,使用 来计算其得分;

迭代后期,对指定的变异策略,以 来计算其得分;

S42,基于Metropolis算法为粒子选择变异策略:设粒子当前选择的变异策略为stra1,随机从四种变异策略中选择一种变异策略记为stra2;对随机选择的变异策略的接受概率按式(1)计算:(1)

其中,p表示从四种变异策略中选择一种变异策略的概率, rank(stra1)、rank(stra2)表示按照S41中的步骤来计算变异策略stra1和stra2的得分;

S43,在[0,1]之间生成一个随机数αt,

若αt<=α,则说明随机选择的变异策略stra2是可接受的,它将作为粒子下一次的前进方向;

若αt>α,则重新随机选择变异策略,并按照上述方法评估,直到产生可以被接受的变异策略;

所述步骤S4中,使用下式(4)确定粒子每次变异中前进的距离:(4)

其中:  (2)

(3)

其中,distance即为粒子变异中前进的距离,wmax表示惯性权重的上界,wmin表示惯性权重的下界,index表示当前迭代代数,iter_num表示总的迭代次数,cmin表示认知因子的下界,cmax表示认知因子的上界,particle表示粒子,particle_group表示粒子群,particle.distance指粒子上一次前进的距离,particle_group.avg_distance指整个种群中所有粒子上一次前进距离的平均值;

步骤S5,根据选定的前进方向和前进距离,变异粒子,产生新的测试样本;

步骤S6,定义适应度值计算方法,对粒子前进方向和前进距离的正确与否进行评估;

所述步骤S6中,使用定义的测试预言解决方案的运行结果来计算适应度值,如式(5)所示:(5)

式中,fitness表示适应度值,API表示待测的深度学习库接口,particle表示粒子;

OracleCuda函数接收待测的深度学习库接口和粒子,在函数内部依次执行超时缺陷判断、错误计算缺陷判断和类型不匹配缺陷判断,倘若在运行过程中检测出接口潜在缺陷,则返回1,否则返回0;

OracleCrash函数接收待测的深度学习库接口和粒子,该函数内部依次执行的是超时缺陷判断、崩溃缺陷判断和类型不匹配缺陷判断,倘若在运行过程中检测出接口潜在缺陷,则返回1,否则返回0;

步骤S7,更新粒子信息;

粒子满足一定条件时,则结束算法,返回粒子群最好的适应度值和最优的变异策略;否则,粒子将回到步骤S4,重新选择前进方向和前进距离,重复执行后续步骤来产生新的测试样本;

其中,当粒子满足如下条件时,则结束算法:群体中有个体的适应度值等于1/3,或当前迭代次数超过规定的迭代代数。

2.根据权利要求1所述的方法,其特征在于,所述变异策略包括随机值变异、数据库值变异、类型变异以及边界值变异,其中边界值变异是指:若选中的参数是整型、浮点型或字符串型,则随机从该参数的边界值中取一个进行赋值,其中:n n n n n n

对于整型参数,边界值的取值范围包括[2 ,2‑1,2 +1,‑(2),‑(2 ‑1),‑(2 +1)],n∈n n n n n[0, 64];对于浮点型参数,边界值的取值范围包括[2.0 ,2.0‑1,2.0 +1,‑(2.0),‑(2.0 ‑n

1),‑(2.0 +1)],n∈[0, 64];对于字符串型参数,边界值的取值范围包括接口文档中,除待测接口外,其他包含字符串型参数的接口的取值,以及随机生成的字符串;

若选中的参数是列表或元组类型,且列表或元组中的元素是整型、浮点型或字符串型,则对该参数中的元素执行上述边界值变异;

对于其他类型的参数不进行改变。

3.根据权利要求1所述的方法,其特征在于,所述测试预言问题解决方案包括:错误计算缺陷判断,崩溃缺陷判断,超时缺陷判断,类型不匹配缺陷判断;其中:超时缺陷判断,指接口运行单个测试样本的时间超过阈值却没有返回结果;

类型不匹配缺陷判断,指新生成的测试样本中的某个参数类型与生成该测试样本的种子测试样本的参数类型不一致,但测试过程中没有报错。

说明书 :

一种基于粒子群算法的深度学习库接口测试方法

技术领域

[0001] 本发明涉及计算机技术领域,特别涉及一种基于粒子群算法的深度学习库接口测试方法。

背景技术

[0002] 当前已经开展了一些工作来对深度学习库进行测试。这些工作大致可以分为两大类。一类是从模型的角度出发开展的测试工作。模型的搭建、训练和推理过程都是基于深度学习库开展的,可以说模型是深度学习库的重要产物。如果对模型进行测试发现了缺陷,那么可以推出深度学习库是存在缺陷的。基于模型的测试方法,需要一系列的模型以及这些模型的输入数据,将这些模型运行在不同的深度学习库中,根据运行的结果来间接判断深度学习库是否存在缺陷。另一类则是从深度学习库的接口出发开展测试工作。深度学习库对用户暴露的是一个个已经封装完善的接口,倘若这些接口中存在缺陷,那么使用这些接口构建的模型也可能存在缺陷。
[0003] 基于接口的测试方法,无需模型的辅助,只需要测试样本,并根据测试样本的运行结果就能直接判断深度学习库是否存在缺陷。但已有的基于接口的深度学习库测试方法的测试效率不高,每个接口需要大量的测试样本才能暴露深度学习库代码存在的缺陷,且对待测接口在给定测试样本下的执行结果是否符合预期的判断不够准确。

发明内容

[0004] 本公开提供一种基于粒子群算法的深度学习库接口测试方法,其能够实现一方面使测试样本的生成尽可能暴露深度学习库接口的缺陷,从而减少所需的测试样本数量,提高测试效率;另一方面提出新的方法来解决测试预言问题,提高对测试结果判断的准确性。
[0005] 本公开提供的基于粒子群算法的深度学习库接口测试方法,包括以下步骤:
[0006] 步骤S1,定义变异策略,用于随机选择种子样本中指定数量的参数执行变异策略来生成新测试样本;
[0007] 步骤S2,定义测试预言问题解决方案,用于判断待测深度学习库接口在给定测试样本下的执行结果是否符合预期要求;
[0008] 步骤S3,初始化粒子群,以种子测试样本作为粒子群中粒子的初始位置;
[0009] 步骤S4,确定粒子的前进方向和前进距离;
[0010] 步骤S5,根据选定的前进方向和前进距离,变异粒子,产生新的测试样本;
[0011] 步骤S6,定义适应度值计算方法,对粒子前进方向和前进距离的正确与否进行评估;
[0012] 步骤S7,更新粒子信息;
[0013] 粒子满足一定条件时,则结束算法,返回粒子群最好的适应度值和最优的变异策略;否则,粒子将回到步骤S4,重新选择前进方向和前进距离,重复执行后续步骤来产生新的测试样本。
[0014] 进一步地,所述变异策略包括随机值变异、数据库值变异、类型变异以及边界值变异,其中边界值变异是指:
[0015] 若选中的参数是整型、浮点型或字符串型,则随机从该参数的边界值中取一个进行赋值,其中:
[0016] 对于整型参数,边界值的取值范围包括,n∈[0,64];对于浮点型参数,边界值的取值范围包括[
],n∈[0, 64];对于字符串型参数,边界
值的取值范围包括接口文档中,除待测接口外,其他包含字符串型参数的接口的取值,以及随机生成的字符串;
[0017] 若选中的参数是列表或元组类型,且列表或元组中的元素是整型、浮点型或字符串型,则对该参数中的元素执行上述边界值变异;
[0018] 对于其他类型的参数不进行改变。
[0019] 进一步地,所述测试预言问题解决方案包括:错误计算缺陷判断,崩溃缺陷判断,超时缺陷判断,类型不匹配缺陷判断;其中:
[0020] 超时缺陷判断,指接口运行单个测试样本的时间超过阈值却没有返回结果;
[0021] 类型不匹配缺陷判断,指新生成的测试样本中的某个参数类型与生成该测试样本的种子测试样本的参数类型不一致,但测试过程中没有报错。
[0022] 进一步地,所述步骤S4中,确定粒子前进方向的方法包括:
[0023] S41,按粒子群的迭代阶段来计算变异策略的得分:
[0024] 迭代初期,对指定的变异策略,以 来计算其得分;
[0025] 迭代中期,对指定的变异策略,使用 来计算其得分;
[0026] 迭代后期,对指定的变异策略,以 来计算变异策略的得分,使用次数较多的变异策略,优先级较高;
[0027] S42,基于Metropolis算法为粒子选择变异策略:设粒子当前选择的变异策略为stra1,随机从四种变异策略中选择一种变异策略记为stra2;对随机选择的变异策略的接受概率按式(1)计算:
[0028] (1)
[0029] 其中,p表示从四种变异策略中选择一种变异策略的概率, rank(stra1)、rank(stra2)表示按照S41中的步骤来计算变异策略stra1和stra2的得分;
[0030] S43,在[0,1]之间生成一个随机数αt,
[0031] 若αt<=α,则说明随机选择的变异策略stra2是可接受的,它将作为粒子下一次的前进方向;
[0032] 若αt>α,则重新随机选择变异策略,并按照上述方法评估,直到产生可以被接受的变异策略。
[0033] 进一步地,所述步骤S4中,使用下式确定粒子每次变异中前进的距离:
[0034] (2)
[0035] (3)
[0036] (4)
[0037] 其中,distance即为粒子变异中前进的距离,wmax表示惯性权重的上界,wmin表示惯性权重的下界,index表示当前迭代代数,iter_num表示总的迭代次数,cmin表示认知因子的下界,cmax表示认知因子的上界,particle表示粒子,particle_group表示粒子群,particle.distance指粒子上一次前进的距离,particle_group.avg_distance指整个种群中所有粒子上一次前进距离的平均值。
[0038] 进一步地,所述步骤S6中,使用定义的测试预言解决方案的运行结果来计算适应度值,如式(5)所示:
[0039] (5)
[0040] 式中,fitness表示适应度值,API表示待测的深度学习库接口,particle表示粒子;OracleCuda函数接收待测的深度学习库接口和粒子,在函数内部依次执行超时缺陷判断、错误计算缺陷判断和类型不匹配缺陷判断,倘若在运行过程中检测出接口潜在缺陷,则返回1,否则返回0;
[0041] OracleCrash函数同理,但是该函数内部依次执行的是超时缺陷判断、崩溃缺陷判断和类型不匹配缺陷判断。
[0042] 进一步地,当粒子满足如下条件时,则结束算法:粒子群中有个体的适应度值等于1/3,或当前迭代次数超过规定的迭代次数。
[0043] 与现有技术相比,本公开的有益效果是:(1)通过对粒子前进方向和前进距离的选择来指导测试样本的生成,而现有技术随机选择变异策略来生成测试样本,这种方法生成的测试样本指向性不明确,测试效率较低;(2)粒子前进方向和前进距离的选择策略均使生成的测试样本能尽可能暴露深度学习库接口缺陷,减少需要的测试样本数,提高测试效率;(3)现有技术中提出的测试预言问题解决方案判定方法与机器硬件条件有关,容易产生误报,本公开提出了两条新的测试预言问题解决方案,这两条新的解决方案在CPU和GPU的环境下均能运行,不受硬件条件限制,能提高对测试结果判断的准确性,减少误报;(4)基于不断的评估进行粒子的下一步变异策略的选择。

附图说明

[0044] 通过结合附图对本公开示例性实施例进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施例方式中,相同的参考标号通常代表相同部件。
[0045] 图1为根据本公开的示例性实施例流程图;
[0046] 图2为本公开中的粒子寻优示意图。

具体实施方式

[0047] 下面将参照附图更详细地描述本公开的优选实施例。虽然附图中显示了本公开的优选实施例,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
[0048] 本公开提供了一种基于粒子群算法的深度学习库接口测试方法,示例性实施例的流程图如附图1所示,包括以下步骤:
[0049] 步骤1,定义变异策略。由于需要从种子测试样本中生成新的测试样本,故需要定义一些变异策略来指导新测试样本的生成。每个种子测试样本中有多个参数,本公开中通过随机选择指定数量的参数执行变异策略来生成新测试样本。
[0050] 本实施例中优选的变异策略主要包括:
[0051] 随机值变异:针对python的基础数据类型整型、浮点型、字符串型和布尔型,若选中的参数取值类型属于这些基础类型中的一种,则随机生成同类型的数据代替种子测试样本中的数据以此来生成新的测试样本。若选中的参数取值是张量特有类型,如八位有符号整型、十六位浮点型等,则随机从这些张量类型中选取一种来赋予该参数。若选中的参数取值是张量,则根据该张量的类型,取两个随机值分别覆盖该张量原有的最大值和最小值。若选中的参数是可遍历的列表或元组类型,则根据列表或元组中元素的类型继续进行随机值变异。
[0052] 数据库值变异:由于深度学习库中很多接口具有相似的功能,这些接口的区别仅仅在于参数的维数和类型有差异。也就是说,在一组相似的接口中,一个接口的参数值很有可能是同组其他相似接口的潜在合理值。基于此种思想,在数据库值变异中,对于选中需要变异的参数,从同组其他接口中随机选择一个接口,将该接口的同一个参数的参数值赋予被选中的参数。
[0053] 类型变异:若选中的参数取值是张量,则随机选择如下方式对张量的维数进行变异:增加维数、减少维数或修改维数的取值。例如,选中参数的取值是维数为[1, 2, 3]的张量,对其进行类型变异后,该张量的维数可能变成[1, 2, 3, 4]、[1, 2]或[1,2, 5]中的任意一种。若选中的参数取值是除张量外的其他类型的数据,则将该参数的值变异为除本类型外的任意一种类型。
[0054] 边界值变异:在传统软件测试中,边界测试方法主要用于测试当变量取边界值时代码的运行情况。借鉴传统软件测试的思想,收集了可能的边界值。对于整型,边界值有可n n‑1 n+1 n n‑1 n+1能的取值是[2 ,2 ,2 ,‑(2),‑(2 ),‑(2 )],其中n∈[0, 64]。对于浮点型,边界值有n n‑1 n+1 n n‑1 n+1
可能的取值是[2.0 ,2.0 ,2.0 ,‑(2.0),‑(2.0 ),‑(2.0 )],其中n∈[0, 64]。对于字符串型,首先获得接口文档中,除待测接口外,其他包含字符串型参数的接口的取值,而后随机生成字符串,将这两部分的值作为边界值有可能的取值。在边界值变异中,若选中的参数是整型、浮点型或字符串型,则随机从相应类型的边界值中取一个值对该参数进行赋值。
若选中的参数是列表或元组类型,且列表或元组中的元素是整型、浮点型或字符串型,则对该参数中的元素执行上述边界值变异。对于其他类型的参数不进行改变。
[0055] 步骤2,定义测试预言问题解决方案。在测试时,需要判断待测深度学习库接口在给定测试输入下的执行结果是否符合预期要求,本实施例中定义了4条测试预言问题解决方案,其中:
[0056] 错误计算缺陷判断:在同一个测试样本下,将每个接口在CPU和GPU上分别运行,比较这两个端的运行结果。若运行结果不同,则表明此接口在CPU和GPU上的实现不同,可能存在缺陷。
[0057] 崩溃缺陷判断:若将合法测试样本输入接口,但接口抛出异常,则被认为是崩溃缺陷。
[0058] 超时缺陷判断:接口运行单个测试样本的时间是极短的,在某些边界测试样本下的运行时间可能较长,但是不应该超过预设阈值。若接口运行时长超过预设阈值但是没有返回结果,则认为是超时缺陷。
[0059] 类型不匹配缺陷判断:若在测试过程中,程序运行不报错并且返回了运算结果,则进行类型不匹配缺陷判断。具体来说,倘若新生成的测试样本的某个参数类型与生成该测试样本的种子测试样本中的参数类型不同,但在测试中不报错,则说明该接口的代码中可能没有进行类型检查,有可能存在缺陷。例如,对于接口tf.config.list_logical_devices的参数‘device_type’而言,其在文档中指明必须为字符串类型,但是在测试中却发现当该参数取值为整型、浮点型、列表或其他类型时,也能输出结果,程序不报错,这与文档描述不一致,可能存在缺陷。
[0060] 步骤3,初始化粒子群。在这个步骤中需要设定粒子群大小、粒子群迭代次数、惯性权重参数、认知因子、粒子属性、粒子最优变异策略、粒子群最优变异策略的初始值、粒子群最优适应度值。本公开中,粒子的属性有位置position、速度velocity以及适应度值fitness,其中速度又取决于前进方向direction和前进距离distance。将粒子的初始位置设为种子测试样本,前进方向和前进距离初始时设为空,适应度值初始时设为1。粒子使用变异策略使自己到达新位置的过程就是生成新测试样本的过程。为了便于后续步骤4的进行,此处还需初始化每种变异策略的使用次数和变异成功次数,初始值均为0。
[0061] 步骤4是确定粒子的前进方向。
[0062] 本公开中,为了使种子测试样本经过变异得到最有可能暴露深度学习库接口缺陷的测试样本,把寻找最有可能暴露接口缺陷的测试样本的过程抽象成粒子经过搜索找到最优位置的过程,以下结合图2进行说明。图中,实心圆圈表示粒子当前位置,方块表示粒子最优位置。粒子在搜索过程中,为了到达最优位置,可以选择多个方向前进,图2中箭头所示方向均为可能的搜前进方向。粒子属性中的位置代表测试样本,故可以把粒子可能的前进方向抽象成测试样本可以选择的变异策略。本公开中,使用Metropolis方法来确定粒子的前进方向。仅仅确定粒子前进方向还不够,本公开中还进一步确定了在该前进方向上前进的距离。因为如果前进距离过短,则可能导致搜索过程漫长,在迭代次数内无法到达最优位置;如果前进距离过长,则可能直接跳过粒子的最优位置。为解决这个问题,本公开根据粒子上一次前进的距离和粒子群上一次前进距离的平均值来动态调整粒子在每次迭代中前进的距离。在确定了粒子的前进方向和前进距离之后,就能引导测试样本选择合适的变异策略来生成新测试样本。
[0063] 本公开中,将粒子对于前进方向的选择等同于测试样本对变异策略的选择。不同的变异策略对测试样本暴露接口缺陷的程度可能有不同的效果。为了给测试样本选择合适的变异策略,首先计算每个变异策略的得分。粒子群算法收敛速度快,但容易陷入局部极值、搜索精度低等问题,为了克服这些问题,将按迭代阶段来计算变异策略的得分。具体来说,将整个粒子群迭代分为三个阶段:
[0064] 第一阶段是迭代初期,粒子应该尽可能扩大搜索范围,避免陷入局部最优解。在这一阶段,对于粒子有可能的前进方向都应该尽可能地去尝试,所以对整个粒子群而言,每条变异策略都应该尽可能使用。但是在迭代初期,粒子不可能马上找到最优位置,所以此时很可能不存在粒子最优位置和粒子群最优位置。因此,对指定的变异策略,使用来计算其得分,用于评价其优先级。那些使用次数较低的变异策略,将被赋予更高的优先级,以提高被选择的概率,从而扩大搜索范围。
[0065] 第二阶段是迭代中期,属于平稳过渡时期,既不能无限扩大搜索范围,也不能太过集中地使用某一种变异策略。经过第一阶段的尝试,此时极有可能出现粒子最优位置和粒子群最优位置,故应该尽可能锁定能检测出接口缺陷的变异策略,从而提高缺陷检测成功率。对此,对指定的变异策略,使用 来计算其优先级得分,变异成功率高的变异策略排名靠前。
[0066] 第三阶段是迭代后期,粒子群中的个体通过前两个阶段的交流和选择,每条变异策略的优劣已经凸显,此时对于众多粒子选择的策略应该尽可能使用。故对指定的变异策略,以 来计算变异策略的得分。对于使用次数占比高的变异策略赋予较前的排名。
[0067] 在这三个阶段中,变异策略的排序结果是根据粒子历史选择以及变异策略的历史效果得到的,也就是说粒子在某次迭代之前的所有粒子信息和粒子群信息都已经体现在粒子当前的位置上了,所以基于粒子当前的位置就可以预测出粒子下一个位置,这等价于基于当前测试样本可以预测出下一个测试样本,符合马尔科夫链的特征。
[0068] 基于以上分析,在本步骤中将采用Metropolis算法来指导测试样本对于变异策略的选择。为简化问题,此处概率分布服从几何分布。设测试样本当前选择的变异策略为stra1,随机从四种变异策略中选择一条记为stra2。对随机选择的变异策略的接受概率计算方式如式(1)所示:
[0069] (1)
[0070] 其中,p表示从四种变异策略中选择一种变异策略的概率, rank(stra1)、rank(stra2)表示按照S41中的步骤来计算变异策略stra1和stra2的得分。
[0071] 而后在[0,1]之间生成一个随机数αt,若αt<=α,则说明随机选择的变异策略是可接受的,它将作为粒子下一次前进的方向。若αt>α,则说明拒绝该变异策略,将重新随机选择变异策略,并按照上述方法评估,直到产生可以被接受的变异策略。由于变异策略的选择是随机的,所以提案分布是形式较为简单的对称分布,满足Metropolis采样的基本要求。
[0072] 步骤5,确定粒子前进的距离。使用式(2)‑(4)确定粒子在每次变异中前进的距离。
[0073] (2)
[0074] (3)
[0075] (4)
[0076] 其中,distance即为粒子变异中前进的距离,wmax表示惯性权重的上界,wmin表示惯性权重的下界,index表示当前迭代代数,iter_num表示总的迭代次数,cmin表示认知因子的下界,cmax表示认知因子的上界,particle表示粒子,particle_group表示粒子群,particle.distance指粒子上一次前进的距离,particle_group.avg_distance指整个种群中所有粒子上一次前进距离的平均值。式(4)的第一项表示惯性部分,说明的是粒子对自身上一次前进距离的信任程度;第二项表示社会认知,说明的是粒子对粒子群上一次前进距离的平均值的信任程度。式(2)表明惯性权重随迭代次数的增加而减少,式(3)表明社会认知随迭代次数的增加而上升,两式存在反差的原因在于,随着迭代次数的增加,粒子群内粒子信息共享程度逐渐提高,粒子应该从信任自身判断逐渐转变为信任群体判断,这样才能使测试样本的生成朝着暴露接口缺陷的方向发展。
[0077] 步骤6,变异粒子。根据步骤1定义的变异策略,以及步骤4和5确定的粒子前进方向和前进距离将粒子迁移到新的位置,从而产生新的测试样本。
[0078] 步骤7,定义适应度值计算方法。粒子变异后,对于粒子前进方向和前进距离的正确与否的判断需要通过适应度值来衡量。在本公开中,适应度值低的个体更有利于找到接口的潜在缺陷。此处使用步骤2定义的测试预言问题解决方案的运行结果来计算适应度值,如式(5)所示。
[0079] (5)
[0080] 式中,fitness表示适应度值,API表示待测的深度学习库接口,particle表示粒子。OracleCuda函数接收待测的深度学习库接口和粒子,在函数内部依次执行超时缺陷判断、错误计算缺陷判断和类型不匹配缺陷判断,倘若在运行过程中检测出接口潜在缺陷,则返回1,否则返回0。OracleCrash函数同理,但是该函数内部依次执行的是超时缺陷判断、崩溃缺陷判断和类型不匹配缺陷判断。适应度值由OracleCuda和OracleCrash两个函数共同决定,适应度值低的粒子的前进方向和前进距离更有利于粒子群找到接口的潜在缺陷。
[0081] 步骤8,更新粒子信息。根据步骤7计算的适应度值来更新粒子最优位置、粒子群最优位置、粒子适应度值、粒子群适应度值以及修改变异策略的使用次数。若经过变异,粒子的适应度值小于1,则说明找到了接口的潜在缺陷,那么所选的变异策略是变异成功的,需要修改变异策略使用成功的次数。
[0082] 对于整个粒子群而言,按照式(5)的计算方式,它所能达到的最优的适应度值就是1/3,也就是有粒子发现了至少两种不符合测试预言问题解决方案的运行结果。所以整个算法的停止条件是,粒子群中有粒子的适应度值等于1/3,或当前迭代次数超过初始化中设定的迭代次数。当算法结束后,将返回粒子群最好的适应度值和最优的变异策略。若当前粒子无法满足停止条件,则粒子将回到步骤4,重新选择前进方向和前进距离,重复执行后续步骤来产生新的测试样本。
[0083] 上述技术方案只是本发明的示例性实施例,对于本领域内的技术人员而言,在本发明公开了应用方法和原理的基础上,很容易做出各种类型的改进或变形,而不仅限于本发明上述具体实施例所描述的方法,因此前面描述的方式只是优选的,而并不具有限制性的意义。