改进个体信息共享的多目标路径覆盖测试方法及实现***
技术领域
本发明涉及软件开发技术领域,具体涉及一种改进个体信息共享的多目标路径覆盖测试方法及实现***。
背景技术
测试数据生成在软件测试中受到广泛的关注,到目前为止,出现了较多针对路径覆盖问题的测试数据生成方法。虽然针对路径覆盖测试数据生成问题的研究有很多,从不同方面解决存在的各种问题,使测试覆盖效率得到了很大的提升,但从某种程度上说测试数据的生成效率依旧是不足的。原因在于这些算法针对的目标都是单目标路径,传统软件或许足以满足要求,而现今的软件结构复杂度和体量都很难估量,需要测试的目标路径非常多。当目标路径较少时,可通过手动编辑目标路径,多次执行算法程序的方式进行检测。一旦目标路径多达成百上千条时,所需的工作量将非常大,效率不高。实际上,可以考虑关于一次执行算法程序生成多个目标路径的测试用例,这样既可大大减少花费的成本,也可大幅度地提升测试用例生成的效率。
遗传算法因其自身独特的优势,在处理路径覆盖问题时表现出非常好的效果。多种群遗传算法作为多目标路径覆盖研究中常用的算法,已成为许多测试工程师的重要选择,但已有的个体信息共享策略在多种群遗传算法运用中存在一些不足之处。
发明内容
有鉴于此,有必要提供一种覆盖率和准确率更高、效率更高、减少子种群计算量的改进个体信息共享的多目标路径覆盖测试方法及其实现***。
一种改进个体信息共享的多目标路径覆盖测试方法,包括以下步骤:
步骤一,以融合个体信息共享改进方法,构建一个多路径覆盖问题的数学模型;
最终的数学模型由n个子函数max(F i )构成,每个子函数对应一个优化问题,每个优化问题对应一个覆盖目标路径的测试数据;每个子函数分别对应一条具体的目标路径,通过对各个子函数求解,找到对应每个子函数的解,形成一个包含多个解的解集合;
步骤二,改进遗传算法生成多目标路径覆盖测试用例;
种群集POP={pop 1 , pop 2 , ..., pop i , …, pop n } (i = 1, 2, …, n)中包括多个子种群pop i ,对其中任意一个子种群pop i 中的个体,首先判定该子种群pop i 个体是否是子函数max(F i )的最优解,然后判定子函数max(F i )的最优解是否是其它种群对应的子函数max(F k ) (k≠i)的最优解,以实现每个子种群分别被判定用于全部n个子函数的求解,生成多目标路径覆盖测试用例;
针对第i个子种群的第j个个体e ij 为子函数max(F i ) (k≠i)的最优解的判定条件是:比较该个体的覆盖路径p(e ij )是否和目标路径p k 一致;当比较结果一致时,个体e ij 就是第k个优化函数的最优解;当比较结果不一致时,个体e ij 不参与k种群进化过程,不计算在第k条目标路径上的适应度函数值;
利用步骤二进行多路径覆盖测试遗传算法包括如下具体步骤:
step 1,对被测程序进行插桩处理,初始化参数:
设定算法执行时的参数,包括种群数n,种群中个体数m,目标路径集中目标路径数n,种群进化需要的选择、交叉和变异概率值;
step 2,种群初始化:
路径集P={p 1 , p 2 , p 3 , ...,p i , …, p n } (i = 1, 2, …, n),对任意属于P的目标路径p i ,随机生成个体数为n的子种群pop i ;
step 3,编码个体,执行插桩后的程序(不执行进化操作):
采用二进制编码格式,执行程序获取各种群尝试覆盖的目标路径集中路径的效果;
step 4,收集各子种群覆盖目标路径集的结果,并对各子种群进行排序:
根据获得的各种群覆盖的数据结果,对种群集中各种群按覆盖路径的数量排序,并按照排序后的种群次序执行;
step 5,计算种群个体的适应度值,并判断是否为最优解:
对第i个子种群pop i ,计算该子种群pop i 中个体覆盖第i条路径的适应度值的最大值max(F i (in i ));如果存在个体的适应度值达到最大值,说明该个体覆盖目标路径p i ,将p i 从目标路径集中移除,否则转向step 9;
step 6,判断pop i 是否移除:
当i≠n时,pop i 需要对第i+1到n条目标路径尝试覆盖,如果找到覆盖第j(j>i)条路径的个体,将pop j 移除,直到完成尝试对第n条路径覆盖后,终止pop i 的执行;
step 7,通过信息共享覆盖:
pop i 中个体除了判定是否是y i = max(F i (in i ))的最优解,还需要判定是否是y k (k≠i)的最优解,如果pop i 中个体能够覆盖第k条目标路径,则pop k 终止;
step 8,判断算法是否终止:
若目标路径P被全部覆盖,则表明算法完成任务,终止程序执行,或种群进化代数超出阈值,转向step 10;
step 9,种群进化:
对该子种群pop i 执行轮盘赌进行选择算子、交叉算子和变异算子的遗传操作,执行完后转向step 5;
step 10,程序执行结束。
进一步地,步骤一中构建一个多路径覆盖问题的数学模型包括如下具体步骤:
输入向量为in =(i 1 , i 2 , i 3 , …, i m ),其中i k (1≤k≤m)是路径中的节点,值为0或1,代表该节点是否被执行,0代表不执行,1代表执行,目标路径集P=(p 1 , p 2 , p 3, …, p n ),其中p j (1≤ j ≤n)表示第j个目标路径;以找到覆盖路径集P的测试用例集C=(c 1 , c 2 , c 3 ,..., c n ),其中c j 是覆盖第j条路径对应的输入向量;
将个体的染色体解码,单个个体解码后的向量为in i ,将该向量作为输入,执行被测程序后计算的适应度值达到了覆盖路径p i 的适应度值,说明该个体成功覆盖目标路径p i ,将in i 加入到测试用例集中;
假定目标路径集P中包含n条路径,对每条路径p j (j=1, 2, …, n),当in j =(i j1 ,i j2 , i j3 , ..., i jn )作为输入数据覆盖路径p j 时,目标函数y j =F(in j )取得最大值;则覆盖目标路径集P的问题将转化成求解目标函数y 1 , y2, …,y n 最大值的优化问题,则所提问题的最终问题数学模型以公式表示为:
进一步地,步骤二中的遗传算法包括,在一个子种群覆盖对应目标路径后,继续尝试覆盖其它目标路径,寻找当前子种群适合覆盖的其它目标路径,从而最大化利用当前子种群。
进一步地,步骤二中改进遗传算法生成多目标路径覆盖测试用例包括如下步骤:
步骤一得到的数学模型的子问题的求解过程同时用于解决对应的目标路径和覆盖其它子问题的目标路径;子问题取得最优解的条件是,当且仅当该子种群覆盖对应目标路径时适应度值取得最大值;适应度函数的定义如式(2)所示,适应度函数的设计是根据接触式层接近度结合分支条件相似度进行定义的,其中接触式层接近度是通过接触向量与执行的路径进行加权计算得到的,计算公式如下:
其中R aim 表示目标路径,R j 表示当前的路径第j个节点,ρ j 是第j个节点的接触度,N c 表示目标路径覆盖的条件分支的数目,n c 表示当前路径与目标路径覆盖的条件分支相同的数目,公式中n c /N c 代表当前路径执行的条件分支占相同目标路径条件分支的比例,取值范围为[0, 1]内。
进一步地,步骤二还包括改进个体信息共享的路径覆盖策略,具体如下:
先确定第i(i≤n,n是子种群数)个子种群覆盖第i条目标路径,在第i个子种群覆盖第i个目标路径后继续执行,直到匹配完最后一条目标路径为止,找到第i个子种群能覆盖的全部目标路径;被覆盖的全部目标路径从目标路径集中移除,同时,与被覆盖目标路径相对应的子种群从子种群集中移除;使目标路径和子种群数目在执行过程中逐渐减少,加速算法执行进程。
进一步地,步骤二还包括对种群集中的各种群按覆盖效果进行排序,具体如下:
初始化种群集,随机产生各子种群,对种群集中各子种群按照覆盖效果进行排序处理,覆盖效果更好的子种群优先级更高,让覆盖效果好的子种群优先执行。
进一步地,还包括通过个体关系矩阵的比较法减少难覆盖路径的计算量,具体如下:
首先,将子种群中待测试的个体的染色体解码后的参数之间的关系保存为个体关系矩阵,该关系矩阵保存的信息是各个参数与其它参数之间的大小关系;其次,搜索已覆盖了难覆盖路径的个体,然后对该个体染色体解码,计算获取解码后参数之间的大小关系并保存为目标个体关系矩阵;最后,将子种群选择覆盖难覆盖路径个体的过程转化为个体关系矩阵与目标个体关系矩阵之间的比较,符合比较结果的个体跳过计算适应度函数值的过程。
以及,一种改进个体信息共享的多目标路径覆盖测试方法的实现***,其用于实现如上述任一项所述的改进个体信息共享的多目标路径覆盖测试方法,该***包括:
目标路径模块,包含需要测试用例覆盖的全部路径;
数学模型构建模块,用于构建数学模型,针对每条路径p j (j=1, 2, …, n),当in j =(i j1 , i j2 , i j3 , ..., i jn )作为输入数据覆盖路径p j 时,目标函数y j =F(in j )取得最大值;将覆盖目标路径集P的问题将转化成求解y 1 , y 2 , ..., y n 最大值的优化问题;
测试用例模块,包括覆盖目标路径对应的全部输入向量;
多路径覆盖测试用例生成遗传算法单元,用于生成针对多个目标路径的覆盖测试用例;
测试用例生成插件单元,用于根据指定目标路径集和种群数来获取测试用例。
进一步地,还包括难覆盖路径处理模块,用于根据已产生的数据信息,提取能覆盖难覆盖路径个体的染色体特征,将覆盖问题转化为对染色体特征的对比筛选问题。
本发明主要有以下几个方面的贡献:
1) 将单目标的接触式层接近度方法借鉴到多种群遗传算法中,提出多目标的路径覆盖测试数据生成方法,极大地提升了测试数据的生成效率。
2) 针对种群集中各子种群随机产生,致使覆盖多目标路径效率不稳定的问题,提出了按照各子种群的覆盖效果对其进行排序的方法,旨在让更优的子种群优先执行,提升种群覆盖效率。
3) 在多种群遗传算法中应用了种群间个体信息共享的策略,对信息共享的过程做了改进,即当某子种群寻找到覆盖对应目标路径后,该种群不会立刻停止执行,而是会遍历完目标路径集后才停止。改进后的个体信息共享策略对覆盖多目标路径集的效率有显著的提升。
4) 针对难覆盖路径的问题,提出一种提取前期已覆盖此难覆盖路径个体的染色体特征的方法。将覆盖问题转化为对染色体特征的对比筛选问题,以获取覆盖该路径的个体。覆盖多目标路径的效率得到了一定程度的改善。
本发明的改进个体信息共享的多目标路径覆盖测试方法中,改进了个体信息共享的路径覆盖策略,子种群个体资源能被充分利用,提高了运行效率;对种群集中的各种群按覆盖效果进行排序,覆盖效果更好的子种群优先级更高,被更早地执行,避免了覆盖路径效果不好的子种群拖慢整个覆盖过程的问题;通过个体关系矩阵的比较法减少难覆盖路径的计算量,避免由于难覆盖路径的存在而大量计算适应度函数值,从而提升覆盖效率。和传统的多种群路径覆盖方法相比,在覆盖率、准确率以及时间方面效果更佳。通过种群个体信息共享策略,大大降低了因多个子种群存在而产生的计算量增加问题,在对难覆盖路径的处理上,提出的方法有效地提升了目标路径集的覆盖效率。
附图说明
图1是本发明实施例的改进个体信息共享的多目标路径覆盖测试方法的流程图。
图2是本发明实施例的多路径覆盖测试遗传算法的流程图。
图3是本发明实施例的改进个体信息共享的多目标路径覆盖测试方法的各种群中个体信息共享方式的示意图。
图4是本发明实施例的改进个体信息共享的多目标路径覆盖测试方法的测试用例生成插件的***运行界面。
具体实施方式
本实施例以改进个体信息共享的多目标路径覆盖测试方法为例,以下将结合具体实施例和附图对本发明进行详细说明。
请参阅图1,示出本发明实施例提供的一种改进个体信息共享的多目标路径覆盖测试方法。
在多种群遗传进化过程中,改进种群中个体信息共享方式的目的是提高测试用例的生成效率,减少软件测试的工作量。下面具体阐述本策略的实施方案。
步骤一,构建多路径覆盖模型。
为了更充分地挖掘每个子种群的价值,我们融合个体信息共享改进方式,构建了一个多路径覆盖问题的数学模型。
假定输入向量为in =(i 1 , i 2 , i 3 , ...,i m ),其中i k (1≤k≤m)是路径中的节点,值为0或1,代表该节点是否被执行(0代表不执行,1代表执行),目标路径集P=(p 1 , p 2 , p 3 ,..., p n ),其中p j (1 ≤ j ≤n)表示第j个目标路径。我们的目标就是要找到覆盖路径集P的测试用例集C=(c 1 ,c 2 ,c 3 ,…,c n ),其中c j 是覆盖第j条路径对应的输入向量。
例如,某个个体的染色体解码后是向量in i ,将该向量作为输入,执行被测程序后计算的适应度值达到了覆盖路径p i 的适应度值,说明该个体成功覆盖目标路径p i ,我们就将in i 加入到测试用例集中。
目标路径集P中包含n条路径,对每条路径p j (j=1, 2, …, n),当in j =(i j1 , i j2 ,i j3 , ..., i jn )作为输入数据覆盖路径p j 时,目标函数y j =F(in j )取得最大值。则覆盖目标路径集P的问题将转化成求解y 1 ,y 2 , ..., y n 最大值的优化问题,即:
传统建模求解问题时,针对多目标优化问题,解必须同时满足多个条件,各个目标函数都对应一条独立的目标路径,目标函数之间相互独立,也即,找到每个目标函数对应一个覆盖该路径的测试数据即可。为了易于理解和明确问题,将式(1)转化为式(2),即所提问题的最终问题模型为:
如式(2)所示,最终模型由n个函数构成,每个函数对应一个优化问题,每个优化问题对应一个覆盖目标路径的测试数据。因为每个子函数都相互独立,都对应一条具体的目标路径,所以最终需要求解的问题是,找到对应每个子函数(子问题)的解,最后形成一个包含多个解的解集合。
步骤二,改进遗传算法生成多目标路径覆盖测试用例。
种群集POP={pop 1 , pop 2 , ..., pop i , ..., pop n } (i = 1,2,…,n)中包括多个子种群pop i ,对其中任意一个子种群pop i 中的个体,首先判定该子种群pop i 个体是否是子函数max(F i )的最优解,然后判定子函数max(F i )的最优解是否是其它种群对应的子函数max(F k ) (k≠i)的最优解,以实现每个子种群分别被判定用于全部n个子函数的求解,生成多目标路径覆盖测试用例;
针对第i个子种群的第j个个体e ij 为子函数max(F i ) (k ≠ i)的最优解的判定条件是:比较该个体的覆盖路径p(e ij )是否和目标路径p k 一致;当比较结果一致时,个体e ij 就是第k个优化函数的最优解;当比较结果不一致时,个体e ij 不参与k种群进化过程,不计算在第k条目标路径上的适应度函数值。
步骤一得到的数学模型说明了各个子问题都是相对独立的,但又不完全脱离。子问题间相对独立是因为每个子问题都代表一个子种群对一条目标路径的求解过程,子问题间没有其它联系。子问题间不是完全脱离的,是因为子问题求解不仅仅会解决对应的目标路径,也会尝试覆盖其它子问题的目标路径。子问题取得最优解的条件是,当且仅当该子种群覆盖对应目标路径时适应度值取得最大值。适应度函数的设计如式(3)所示,适应度函数的设计是根据接触式层接近度结合分支条件相似度进行设计的,其中接触式层接近度是通过接触向量与执行的路径进行加权计算得到的。
其中R aim 表示目标路径,R j 表示当前的路径第j个节点,ρ j 是第j个节点的接触度,N c 表示目标路径覆盖的条件分支的数目, n c 表示当前路径与目标路径覆盖的条件分支相同的数目,公式中n c /N c 代表当前路径执行的条件分支占相同目标路径条件分支的比例。这里对n c /N c 项没有进行标准化,是因为该项的取值范围已经处于[0, 1]内,无需标准化,不会对接触式层接近度项产生较大影响。
此外,对模型(2)中各个子问题的适应度函数的设计是相同的,都以式(3)作为标准。求解模型的实现方法借鉴了个体信息共享策略的思想,由于该策略存在一些不足(无法避免较差子种群拖累算法执行效率,不够充分利用种群个体资源,没有针对难覆盖路径的具体措施),因此对其做了3点改进如下。
改进一,对个体共享的路径覆盖策略做了改进。已有个体信息共享策略中,当确定第i(i≤n,n是种群数)个子种群覆盖第i条路径后执行的操作是,停止第i个子种群继续执行。这里对此过程做了相应改进,即种群i停止的条件为,在第i个种群在覆盖第i个路径后继续执行,直到匹配完最后一条路径为止。这样做的原因是,第i个种群覆盖第i条路径后依旧可能会覆盖到其它的路径,继续遍历执行可以充分利用子种群资源,避免资源浪费,从而影响效率。
虽然每一个种群会用在n条目标路径的求解中,但是并不会对效率造成太大的影响。因为n个种群的数量并不是一成不变的,而是会随着目标路径集中路径的覆盖逐步减少。比如,pop i 表示第种群集中第i个种群,当其覆盖第k条路径时,第k条路径对应的种群将会从种群集中移除,随着路径不断地被个体覆盖,这些路径对应的种群也会被移除,因此算法的效率会不断提升。
改进二,对种群集中各种群按覆盖效果做排序处理。由于初始化种群集时,各子种群都是随机产生的,有些种群对目标路径的覆盖效果可能比较差,有些子种群情况可能比较好,为了避免覆盖效果差的种群对测试数据生成效率产生较大影响,让表现优异的子种群优先执行,所以先对种群集中各子种群按照覆盖效果进行排序处理。
改进三,提出一种针对难覆盖路径的处理方法。该方法具体过程是,首先搜索前面执行已覆盖了难覆盖路径的个体,然后对该个体染色体解码,计算获取解码后参数之间的大小关系并保存为关系矩阵(该矩阵保存的信息是各个参数与其它参数之间的大小关系),将该矩阵称为目标个体关系矩阵。之后,种群选择覆盖难覆盖路径个体的方式就转化为个体与目标个体关系矩阵的比较,这不需要计算适应度值,大大地降低了计算量。
以上三点是针对已有个体信息共享策略存在的不足之处提出的改进措施。各子种群中个体信息共享方式请参阅图3,具体的多路径覆盖测试遗传算法如下,流程图请参阅图2:
step 1,对被测程序进行插桩处理,初始化参数:
设定算法执行时的参数,包括种群数n,种群中个体数m,目标路径集中目标路径数n,种群进化需要的选择、交叉和变异概率值等。
step 2,种群初始化:
路径集P={p 1 , p 2 , p 3 , ..., p n },对任意属于P的目标路径p i ,随机生成个体数为n的子种群pop i 。
step 3,编码个体,执行插桩后的程序(不执行进化操作):
采用二进制编码格式,执行程序获取各种群尝试覆盖的目标路径集中路径的效果。
step 4,收集各子种群覆盖目标路径集的结果,并对各子种群进行排序:
根据获得的各种群覆盖的数据结果,对种群集中各种群按覆盖路径的数量排序,并按照排序后的种群次序执行。
step 5,计算种群个体的适应度值,并判断是否为最优解:
对第i个种群pop i ,计算该种群中个体覆盖第i条路径的适应度值的最大值max(F i (in i ))。如果存在个体的适应度值达到最大值,说明该个体覆盖目标路径p i ,将p i 从目标路径集中移除,否则转向step 9。
step 6,判断pop i 是否移除:
当i≠n时,pop i 需要对第i+1到n条目标路径尝试覆盖,如果找到覆盖第j(j>i)条路径的个体,将pop j 移除,直到完成尝试对第n条路径覆盖后,终止pop i 的执行。
step 7,通过信息共享覆盖:
pop i 中个体除了判定是否是y i = max(F i (in i ))的最优解,还需要判定是否是y k (k≠i)的最优解,如果pop i 中个体能够覆盖第k条目标路径,则pop k 终止。
step 8,判断算法是否终止:
若目标路径P被全部覆盖,则表明算法完成任务,终止程序执行,或种群进化代数超出阈值,转向step 10。
step 9,种群进化:
对该种群执行轮盘赌(roulette wheel)选择算子、交叉算子和变异算子等遗传操作,执行完后转向step 5。
step 10,程序执行结束。
基于所提出的方法,开发了一个针对三角形分类程序的测试用例生成插件。该插件选用Eclipse作为开发平台,以插件项目为开发方式,通过xml文件实现插件功能的配置。该测试用例生成插件原型如图4所示。
此插件是利用java语言编写的,实现了能根据指定目标路径集和种群数来获取测试用例的功能。用户在Input the target path set输入框中输入待测目标路径集,各个目标路径之间以逗号作为分隔符,每条目标路径是一个长度为m的字符串,表示程序共有m个节点,每个节点取值为“0” 或“1”,其中“0”代表该节点未被执行,“1”表示该节点被执行。图中目标路径集中输入了4条目标路径,该插件的目标就是找到这4条目标路径对应的测试用例。算法中种群个体数通过Population size输入框进行设置,然后点击Generate testcases按钮即可运行插件,算法会自动验证目标路径集的内容并切割执行。下方的平均耗时及测试用例标签是用来显示测试用例生成的结果,插件执行完成后覆盖目标路径的测试用例及相应的平均运行时间就显示在对应的标签旁边。
本发明主要有以下几个方面的贡献:
1) 将单目标的接触式层接近度方法借鉴到多种群遗传算法中,提出多目标的路径覆盖测试数据生成方法,极大地提升了测试数据的生成效率。
2) 针对种群集中各子种群随机产生,致使覆盖多目标路径效率不稳定的问题,提出了按照各子种群的覆盖效果对其进行排序的方法,旨在让更优的子种群优先执行,提升种群覆盖效率。
3) 在多种群遗传算法中应用了种群间个体信息共享的策略,对信息共享的过程做了改进,即当某子种群寻找到覆盖对应目标路径后,该种群不会立刻停止执行,而是会遍历完目标路径集后才停止。改进后的个体信息共享策略对覆盖多目标路径集的效率有显著的提升。
4) 针对难覆盖路径的问题,提出一种提取前期已覆盖此难覆盖路径个体的染色体特征的方法。将覆盖问题转化为对染色体特征的对比筛选问题,以获取覆盖该路径的个体。覆盖多目标路径的效率得到了一定程度的改善。
本发明的改进个体信息共享的多目标路径覆盖测试方法中,改进了个体信息共享的路径覆盖策略,子种群个体资源能被充分利用,提高了运行效率;对种群集中的各种群按覆盖效果进行排序,覆盖效果更好的子种群优先级更高,被更早地执行,避免了覆盖路径效果不好的子种群拖慢整个覆盖过程的问题;通过个体关系矩阵的比较法减少难覆盖路径的计算量,避免由于难覆盖路径的存在而大量计算适应度函数值,从而提升覆盖效率。和传统的多种群路径覆盖方法相比,在覆盖率、准确率以及时间方面效果更佳。通过种群个体信息共享策略,大大降低了因多个子种群存在而产生的计算量增加问题,在对难覆盖路径的处理上,提出的方法有效地提升了目标路径集的覆盖效率。
需要说明的是,以上所述仅为本发明的优选实施例,并不用于限制本发明,对于本领域技术人员而言,本发明可以有各种改动和变化。凡在本发明的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。