1.一种基于粒子群算法的数据流测试用例自动生成方法,其特征在于,首先对粒子群算法进行改进,包括根据分支距离设计适应度函数,调整更新粒子速度的惯性权重因子,同时提出一种混沌扰动的策略;然后基于改进粒子群算法自动生成基于数据流的测试用例集;
所述分支距离的计算公式如下:
nodeDistance=ap+v(distance) (1)其中,ap表示测试用例到节点之间的距离,如果测试用例的执行路径覆盖了这个节点,那么ap的值就为0,否则ap的值为1;distance表示测试用例到节点的分支距离;
所述适应度函数的计算公式如下:
Fit(i,T)=min(nodeDistancej(defi)+nodeDistancej(usei)+s) (3)其中,j表示测试用例集T中第j个测试用例,nodeDistancej(defi)表示第j个测试用例到第i个定义‑使用对DUP的定义节点的距离;nodeDistancej(usei)表示第j个测试用例到第i个定义‑使用对DUP的使用节点的距离;s表示定义节点和使用节点之间的杀死节点的信息,如果测试用例集T中的执行路径上存在第i个DUP的杀死节点,那么设置s的值为1,如果不存在杀死节点,则把s的值设置为0;
所述惯性权重因子的计算公式如下:
w=wmax‑((wmax‑wmin)×t÷Tmax+r) (5)其中,wmax为惯性因子最大值,wmin为惯性因子最小值,t为当前迭代次数,Tmax为最大迭代次数,r为调节因子,其取值范围为[0.5,0.9],粒子每迭代一次,其值以p=p+0.01的方式线性递增;
所述方法具体包括以下步骤:
步骤1:获取被测程序P,对P进行解析,构建相应的控制流图CFG(P),并获得P中的变量集合N;
步骤2:采用深度优先遍历的方法遍历CFG(P),获得程序中的所有路径Path(P);
步骤3:自底向上遍历每条可执行路径,根据N获得程序中所有的定义‑使用对DUP={dup1,dup2,...,dupn},其中,n表示定义‑使用对总数,dup=(def,use,var),def表示变量的定义节点,use表示相同变量的使用节点,var表示该变量;
步骤4:利用随机值初始化测试用例集和粒子群算法的相关参数,设置最大迭代次数Maxnum,随机生成n个粒子,初始化粒子的位置Xi=[Xi1,Xi2,...,Xid],初始化粒子的速度Vi=[Vi1,Vi2,...,Vid],其中d表示d维;
步骤5:根据分支距离计算公式(1)设计适应度函数计算公式(3);
步骤6:从待测的DUP中取一个定义‑使用对dupj,其中j表示待测试的定义‑使用对集中的第j个定义‑使用对;
步骤7:识别当前粒子的局部最优值PBest和全局最优值GBest;
步骤8:基于适应度判断,若测试用例已经覆盖dupj,则跳转到步骤15,否则跳转到步骤
9;
步骤9:使用公式(4)更新粒子的速度:
其中,Vid是当前粒子的速度;k是当前的迭代次数;w为惯性权重因子,控制历史速度对新速度的影响;i=1,2,...,n,n为总体的大小;c1和c2为加速因子;r1和r2是两个在[0,1]区间内均匀分布的随机数;
步骤10:使用公式(6)更新粒子的位置:
其中,Xid是当前粒子的位置,Vid是当前粒子的速度,k是当前的迭代次数;
步骤11:更新每个粒子的历史最优位置;将当前每个粒子的适应度与PBest进行比较,如果当前粒子的适应度更好,则保存当前粒子的适应度和位置;
步骤12:更新群体的最优位置;将每个粒子的适应度与GBest进行比较,如果当前粒子的适应度更好,则保存当前粒子的适应度和位置;
步骤13:基于适应度函数计算,计算适应度方差;
步骤14:判断适应度方差是否小于阈值,若小于,则对当前种群进行混沌扰动,转到步骤7,否则直接转到步骤7;
步骤15:更新测试用例集,并将dupj从待测试的定义‑使用对中删除,其中j=j+1,若定义‑使用对的覆盖率达到100%,或者达到最大迭代次数Maxnum,则转到步骤16;否则转到步骤6;
步骤16:终止循环并输出测试用例集,算法结束。
2.根据权利要求1所述的基于粒子群算法的数据流测试用例自动生成方法,其特征在于,所述步骤13中,适应度方差根据式(7)、式(8)来计算:f=max{1,max(fi‑favg)} (8)其中, 表示种群的适应度方差,i∈[1,N],N为种群中的粒子个数,fi表示第i个粒子的适应度,favg为粒子群目前的平均适应度。