刘好斌,梁旗军,肖 鹏
(南昌航空大学软件学院,江西 南昌 330063)
软件可靠性测试用例的主要作用是测试软件的可靠性,及时发现软件中存在的漏洞,以便实现对软件漏洞的及时修复[1]。测试用例的数量随着软件规模的扩大不断增多,增加了软件可靠性测试的复杂程度,因此,需要对软件可靠性测试的需求展开分析,通过约简优化降低测试用例的数量,提高软件可靠性测试的精度和效率[2]。
魏伟[3]等人通过二元优化覆盖问题描述软件可靠性测试用例约简优化问题,将细胞自动机分类模型引入萤火虫算法中,利用优化后的算法求解优化问题,实现测试用例的约简优化。该方法约简后的测试用例数量多于需求的用例数量,表明方法的约简结果中存在冗余用例,方法的约简效果较差。杨祎巍[4]等人结合局部搜索策略与遗传算法建立测试用例约简优化模型,采用Memetic算法获取模型最优解,实现测试用例的约简优化。该方法约简软件可靠性测试用例的运行代价较大,且约简后的测试用例在软件可靠性测试过程中出错概率较高,存在丢失率高的问题。
为了解决上述方法中存在的问题,提出基于耦合度量的软件可靠性测试用例约简优化方法。
耦合度量指的是对软件可靠性测试用例之间依赖程度的度量[5],建立耦合度量模型,度量测试用例之间的依赖程度,具体过程如下:
用七元组表示软件可靠性测试用例耦合度量模型:
RTC={Fi,Fr,Itc,Yd,Yr,Vn,Fc}
(1)
式中,Fi代表设计软件可靠性测试用例的思想;Fc代表用户描述用例的方式;Fr代表设计规则;Vn代表测试步骤在软件可靠性测试用例中的执行方式和顺序;Itc代表单元测试用例在软件可靠性测试用例中的数量;Yr代表执行测试用例的结果;Yd代表数据在测试用例中的数量;RTC代表软件可靠性测试用例。
测试用例的权重直接影响耦合度量结果,采用人工方式赋予测试用例权重时,会导致度量结果受主观因素的影响,度量精度无法得到保证。因此本文通过特征分析法[6-7]计算测试过程中软件可靠性测试用例的权重。
用m表示耦合资源在软件可靠性测试用例中的数量,耦合资源表示为I1,I2,…,Im,其权重表示为W1,W2,…,Wm,存在W1+W2+…+Wm=1。采用特征分析法计算软件可靠性测试用例的具体过程如下:
1)两两比较耦合资源,获得比较结果vij:
(2)
式中,i≥1,j≤m。根据上式计算结果构建比较矩阵V:
(3)
2)用F表示矩阵V对应的最优传递矩阵,其表达式如下:
(4)
3)用一致性判断矩阵R代替矩阵F:
(5)
式中,rij=exp(fij)。
4)针对测试用例的权重,可通过近似解法计算得到,在上述构建的一致性判断矩阵的基础上,获得资源的重要性排序[8-9],即特征向量,分配权重:
①用Q表示每行元素在矩阵R中的乘积,可通过下式计算得到:
(6)
③归一化处理L=(L1,L2,…,Lm)T,获得W=(W1,W2,…,Wm),即软件可靠性测试用例的权重。
通过下述公式计算用例在软件可靠性测试用例耦合模型中的耦合度TRD:
(7)
式中,T代表用例在模型中的数量;T′代表某类用例在模型中被复用的次数。
针对软件可靠性测试过程中用例被重复利用的程度采用耦合程度YCRD描述,可通过下式计算得到:
(8)
式中,Wi代表软件可靠性测试用例中复用资源对应的权重;TRDi代表某类被复用的资源在软件可靠性测试用例中的复用程度。
设RTCARM代表某段测试时间内,某个用例的多个耦合程度的平均值,其计算公式如下:
(9)
式中,Yi代表软件可靠性测试用例在测试时间内被复用的次数。
通过上述公式获得软件可靠性测试用例的耦合程度,保留耦合度高的软件可靠性测试用例,对剩余的冗余测试用例展开约简优化。
选取K个评价指标用于软件可靠性测试用例的约简优化,即在优化过程中存在K个决策目标。
首先计算决策目标对应的权重,根据计算结果对决策目标排序H=(h1,h2,…,hk),决策目标可表示为He、Hmax、Hmin,分别表示等值目标、最大目标和最小目标,建立的优化目标函数如下:
(10)
式中,TR代表冗余测试用例集;函数opt的取值情况如下:
1)当Hi∈Hmin时,函数opt表示为hi(tj)≤YVi;
2)当Hi∈Hmax时,函数opt表示为hi(tj)≥YVi;
3)当Hi∈He时,函数opt表示为hi(tj)=YVi。
其中,YVi代表目标对应的阈值。
采用分层序列算法在多目标优化思想的基础上求解软件可靠性测试用例约简优化目标函数,求解思想为:
1)通过耦合度量将软件可靠性测试用例分为两类,第一类为冗余测试用例集TR,第二类为耦合测试用例集TE;
2)通过上述建立的目标函数获取TE的最优解x,设TRk代表用例在软件可靠性测试过程中的需求构成集合,为了获取局部最小化的软件可靠性测试用例,可对TRk展开最小化处理;
3)对上述过程展开迭代,当全部冗余测试需求集Rk被约简优化后的用例集覆盖后停止迭代;
用As表示软件可靠性测试过程中全部的用例集,Os表示原始用例集,Oes表示约简优化的目标用例集。
约简软件可靠性测试用例的具体过程如下:
1)初始化输入数据,对输入的用例集展开初始化处理:|As|=m、|Os|=n、|Oes|=k。
2)标记耦合用例集,标记通过耦合度量获取的耦合用例集合中的冗余用例集。分别用T*和R*表示以上两个用例集在软件可靠性测试过程中的需求集。
3)采用蚁群优化算法[10-11]求解软件可靠性测试用例约简优化目标函数,获得TRk,具体过程如下:
(11)
②评价解,计算上述蚂蚁构造解对应的适应度函数值。
(1) 在抗滑桩间距为最佳桩间距时,桩后土拱与桩侧土拱联合并存,联合的土拱可分解为两个单独的土拱[14]。
③非支配排序,针对迭代过程中蚂蚁构建的解,通过非支配排序方法[12-13]对其展开非支配排序,获得多个非支配解构成的集合,选取适应度函数值最高的解集,作为软件可靠性测试用例约简优化目标函数的最优解集。
④更新解集,比较迭代过程中的最优解集与上述生成的最优解集,保留更好的解集。
⑤更新信息素ςij[14-15]。为了引导蚂蚁在迭代过程中向最好的方向移动,需要对信息素ςij展开更新,引入挥发机制减少信息素ςij在搜索路径中的值,并将优秀的信息素添加到搜索路径中。
将迭代过程中获取的最优解集用于信息素ςij的更新,让最优解集中的解在蚂蚁搜索路径中释放信息素,信息素ςij的更新过程如下:
ςij=ςij(1-σ)+Δςij
(12)
式中,σ代表挥发因子,当Δςij的值为1时,表明最优解中存在边(i,j),当Δςij的值为0时,表明最优解中不存在边(i,j)。
4)在上述过程获取的TRk中通过层次序列化算法[16]获取局部最小的软件可靠性测试用例集。
5)迭代上述步骤,当R*=As时,获得约简后的最优软件可靠性测试用例集。
为了验证基于耦合度量的软件可靠性测试用例约简优化方法的整体有效性,需要对其展开测试。本次测试所用的用例约简平台如图1所示。
图1 测试用例约简平台
针对图1所示的平台,现设定软件可靠性测试过程中需要用例数量为200个,测试用例总数为223个,现采用基于耦合度量的软件可靠性测试用例约简优化方法、文献[3]方法和文献[4]方法在上述平台中展开测试。
通过SizeCos表示约简用例的运行代价,其计算公式如下:
(13)
式中,|V′|代表约简后用例在软件可靠性测试过程中的运行代价;|V|代表原始用例在软件可靠性测试过程中的运行代价。
依据式(13)计算得到三种方法的软件可靠性测试用例约简结果,如图2所示。
图2 不同方法的用例约简结果
分析图2中的数据可知,所提方法可有效将软件可靠性测试用例的数量约简为测试需要的用例数量,而文献[3]方法和文献[4]方法的约简结果中存在测试不需要的用例,即冗余用例,表明以上两种方法的用例约简效果较差。且对比所提方法、文献[3]方法和文献[4]方法的运行代价发现,所提方法的运行代价最小,因为该提方法对软件可靠性测试用例约简之前,度量了测试用例的耦合程度,保留耦合程度较高的用例,对剩余的用例展开约简优化,减少了约简的用例数量,降低了运行代价。
进一步将丢失率FaultLoss作为评价指标对上述方法展开测试,丢失率越高,表明约简后测试用例对软件可靠性测试的错误越多,FaultLoss的计算公式如下:
(14)
式中,|F′|代表用例约简优化后,错误测试软件可靠性的数量;|F|代表原始用例测试软件可靠性的出错数量。
所提方法、文献[3]方法和文献[4]方法的丢失率测试统计结果,如表1所示。
表1 不同方法的丢失率
由表1中的数据可知,在测试过程中所提方法的丢失率低于其他两种方法,表明采用所提方法对软件可靠性测试用例约简优化后,用例的错误测试数量减少,在软件可靠性测试过程中,所提算法表现出良好的用例约简能力。
测试用例的数量随着软件系统的更新不断增多,如果不对其处理,会增加软件可靠性测试的成本,因此在软件可靠性测试过程中,需要对测试用例展开约简优化。目前软件可靠性测试用例约简优化方法存在约简效果差、运行代价高和丢失率高的问题,为此提出基于耦合度量的软件可靠性测试用例约简优化方法,该方法通过耦合度量获取用例中的冗余用例,建立用例约简优化目标函数对冗余用例展开约简,实验结果表明,该方法可有效降低用例中存在的冗余用例,且运行代价和丢失率较低,具有良好的应用性能。