摘要:软件可靠性问题是软件测试中的重要难题之一,由于程序语言的复杂性以及被测程序的多样性,一直没有一个好的可靠性模型来评价它。鉴于此,提出了一个有关黑盒测试的可靠性分析模型,模型在结合等价类和边界值划分的基础上充分考虑软件复杂性、缺陷后果严重性和信息不足等因素等原因,根据矩阵和数理统计的知识得出相关的可靠性模型,并使用EM算法对该模型的置信下限做出了相应的理论证明。实验表明,该模型在实用性和可靠性方面都取得了较大的进展。
关键词:测试准则;EM算法;测试用例复杂性;软件可靠性模型
中图分类号: TP311
文献标识码:A
0引言
随着软件应用的日益广泛及重要性的不断增强,人们对软件质量的要求也越来越高。可靠性作为衡量软件质量的重要特性,其定量评估和预测已成为人们关注和研究的焦点。软件可靠性模型作为可靠性评测的核心和关键,可用于软件生命周期的不同阶段,定量地估计和预测软件可靠性行为。一个好的可靠性模型可以准确评估和预测软件可靠性行为,这对于软件资源分配、软件市场决策有着重要的意义。
软件可靠性模型这一领域的研究在 20 世纪 70 年代获得较大发展后,很多可靠性模型已经投入使用。可以说,软件可靠性模型已从研究阶段发展到了工程阶段。但是,面对软件自身及其开发过程日益复杂的情形,它仍然呈现出其自身的不足。
首先,在软件可靠性建模方面,传统的软件可靠性模型主要是从时间域和输入域两个方面来考虑软件缺陷发生的概率或缺陷总数,很少从缺陷自身的因素论述;其次,在软件可靠性建模过程中,基本上是根据测试结果直接来推导模型,很少关注软件测试的设计过程;最后,在适应性方面也存在着一定的缺陷。
鉴于此,要想建立比较适用的软件可靠性模型,必须改变传统可靠性建模思路,采用新的观点、方法和新的数学工具来研究软件故障过程。论文将测试用例的设计融入到软件可靠性建模过程中去,在充分考虑软件缺陷影响因子和复杂性等因素基础上,采取合适的数学处理方法构建出一个基于测试用例的软件可靠性模型,并结合EM算法对该模型的可靠性作了验证。该模型不但考虑了失效出现的概率,还考虑了失效后可能产生后果的严重性。
论文主要工作如下:(1)根据等价类、边界值等方法来设计测试用例模型;(2)在一定假设的基础上,通过观测数据推导出测试用例的可靠性并得出相应的软件可靠性;(3)利用EM算法对软件可靠性进行相应的检验。
1测试用例模型的构建
测试用例的设计是软件测试过程中最为关键的一个环节,一个软件测试成功与否与其测试用例设计成功与否有很大的关系。所谓测试用例,也就是为特定目标开发的测试输入、执行条件和预期结果的集合。也可以说是对软件运行过程中所有可能存在的目标、运动、行动、环境和结果的描述,这些特定目标可以是验证一个特定的程序路径或核实是否符合特定需求。而测试活动要建立必要的前提条件,提供测试用例输入、观察输出,然后将这些输入和输出进行比较,以确定测试是否通过测试某个程序路径或何时满足软件规定的要求。简言之,测试用例就是设定输入数据,运行被测试函数,然后判断实际输出是否符合预期结果。
通常造成软件缺陷的主要原因有:(1)软件设计文档规范不一;(2)测试用例设计过程中引入了人为的错误;(3)测试执行后,复杂的决策条件、循环和分支的覆盖率目标并没有达到等。而一个完整的测试应该包含正面测试(Positive
Testing,PT)和负面测试(Negative Testing,NT)。正面测试是验证程序应该执行的工作,而负面测试是验证程序不应该执行的工作。只有面面俱到,才能保证测试的充分性。要想保证测试用例设计质量,必须遵循四个原则:(1)测试准则,每个测试用例应当有一组有限可枚举的待测目标的判定准则;(2)测试用例输入域的划分和输入点集的提取;(3)测试目标的复杂性问题,应尽量化复杂为简单;(4)对测试用例进行测试的力度,就是在特定输入条件下进行测试的细分程度和测试的次数。在黑盒测试中,不可能采取穷举式测试。只能选取输入域中有代表性样本点来运行程序,然后通过程序运行的结果(成功率或失效率)来推断出软件可靠性。综上可知,一个好的测试用例既要有完善的输入域也要有代表性的输入点集。
输入域主要来源于需求规格说明、程序观察和额外的属性规约。假设D表示输入域,S表示规格说明,P表示程序观察,T表示额外的属性规约。则输入域可表示为:D=S∪P∪T。其中额外的属性规约主要是指规格说明中没有但满足负面测试或可能用到的那部分数据。
输入点的选取对软件测试来说也是至关重要的,为了确保输入点集选取的客观性,特采取有选择性随机输入的方法。其大体过程分为两步:
1) 提取测试用例的边界值点,构成集合T1;
2) 在每个相邻边界点中选取n个点进行测试,其中选取测试点个数由测试人员根据具体情况而定,关于相邻边界值点间测试点的选取通过高斯随机函数产生。即:
其中ij表示输入点,n表示选择点的个数,σ表示所选取点的方差,Id表示所选取点。
根据上式所得到的Id构成了集合T2。则测试用例的输入域D=T1∪T2。根据边界值和等价类相结合的方法将输入域化分成L个子区域。即D=(D1,D2,…,DL)。
2测试用例可靠性评估
2.1基本概念
软件可靠性模型通常分为三种:时间域可靠性模型、输入域可靠性模型和混合可靠性模型。实际上,软件黑盒测试的过程是从输入域着手,反复有选择性地随机抽取输入点集,通过观察其输入和输出之间的映射关系得出其可靠性。下面给出一些测试过程中常用到的概念和度量。
定义1测试准则:测试准则是关于一组有限可枚举的待测试目标(待测试的软件部分)的判定规则,如果测试通过了判定规则的判定,则认为达到了测试准则,否则就没有。假设i表示输入数据,且i∈D,output表示输出数据,也就是说如果输入数据i满足output=f(i)(i∈D),就认为达到了判定准则,否则就没有。
定义2测试子域:把测试用例的输入域D按照上述二个步骤划分成L个互不相交的子域D1,D2,…,DL,即D=D1∪D2∪…∪DL,且Di∩Dj=(i≠j且i,j=1,2,…,L),则Di称为测试子域。
定义3测试可靠性因子:为了更好的判断输入和输出是否满足映射关系,特此引入功能性可靠因子c,其中c=1或c=0。当c=1时,表示输入和输出符合其映射关系;当c=0时,表示输入和输出不满足其映射关系。
定义4缺陷影响因子:不同的缺陷对软件可靠性的影响不一样。通常测试人员将缺陷分为如下几个级别:致命、严重、一般、轻微、建议。对应不同的级别应给予相应权重来描述它,以表示它对测试结果的影响。其中缺陷影响因子用γi表示,这里i=5,表示5个级别。根据经验可设γ=(10,5,2,1,0.5)。
软件就好比一辆汽车,不同的缺陷、故障(缺陷因子不同)会产生不同的结果,就像座位和车刹的故障一样,同样是缺陷,但产生的结果不同。作为软件的可靠性来说,应该把缺陷因子考虑到其中,这样才能更好地度量和评价软件可靠性。
假设输入i产生缺陷的概率为P(i),其中i∈D,根据定义3可将c表示为i的函数c(i),它满足c(i)=1或c(i)=0,根据定义4可将缺陷影响因子γ表示为i的函数γ(i)。则测试用例的可靠性可用(1)式表示:
2.2测试用例的可靠性评估
在软件测试可靠性评估领域,所有的结果都是在一定假设条件下产生的,不论是JM模型、Musa模型或者NHPP模型,都是在一定的假设基础上进行的。
根据等价类原理可知测试向量所产生的缺陷在各个子域内出现的概率是均等的。同时,软件的复杂性在观测数据矩阵中也得到了很好的体现。根据等价类原理,可以计算出相应的可靠性模型。
推论1对任意一功能点进行一次有选择性的随机测试,其可靠度可表示为:
其中γi表示第i个缺陷影响因子,c/ij表示观测结果。
证明假设对任意一个功能向量F进行测试,其输入点集为:
根据其映射规则,通过定义3可以得出一组相应的矩阵C。它可表示为式(2)。
根据定义4可知每组输入可能产生5种等级的缺陷,而每种等级的缺陷对软件可靠度造成的影响是不一样的,因此可把矩阵C分解成一个新矩阵C/,C/中包含了5种缺陷影响因子的信息。由于论文主要是计算软件的可靠性,在定义3中已规定当输入和输出满足映射关系时,c取1,否则取0。所以C/表示式(3)。
根据矩阵C/和(1)式可以得出软件无缺陷运行的概率如(4)式所示。
根据(4)式可推知缺陷影响因子为γi的发生概率Pγ为:Pγ=1-PFi,从而可计算出软件可靠度RFi如式(5)所示:
推论2测试用例在无缺陷下运行的概率为:
证明测试向量F1,F2,…,Fn相互独立, 则可推出测试用例F的可靠度为各个测试向量可靠度的交集,表示为(7):
据推论1知测试用例的可靠度Rc=∏ni=1RFi, 从而可得出测试用例在无缺陷下运行的概率为
3软件可靠性评估
3.1最大概率的EM算法
在文献[5]中论述了EM算法在假设检验中的应用,本文将该方法引申到软件测试可靠性评估计算上。
假设输入点集为I,通过输入和输出的映射函数关系,观测到I服从概率分布Pd(I), Id。随机变量I只是观测数据的一部分,假设A表示与I有关的随机事件,即A={R(I)>Rα},R(I)表示通过随机输入I观测到的似然统计量,Rα表示测试人员的期望值,且Rα∈[0,1]。这里所要求的是最大概率sup{Pd(A):d∈D0},这里D0是D的子集。在假设检验中,最大概率可以是真实的检验水平,也可以是犯第1类或第2类错误的概率。
EM算法是用来求解似然函数最大值点的工具,所以,如果能够将概率Pd(A)看成似然函数的值,则可以利用EM算法得到最大概率sup{Pd(A):d∈D0}。
EM算法的基本步骤:
设f(y|d)是Y的概率函数。从一个初始点d∈D开始,则寻找sup{Pd(A):d∈D0}的算法由下面的两步迭代而成(t=0,1,…):
E步:给定现在的值d(t)后,对未知的对数似然函数l(d|Y)=log f(Y|d)求条件期望:
M步:最大化函数Q(d|d(t)),求取最大值点d(t+1)作为下一步迭代的值,即使得:
3.2基于测试用例的软件可靠度检验
软件测试是一个反复测试的过程,一个测试软件包含多个测试用例,各个测试用例之间的关系是相互独立的,假设测试软件P包括m个测试用例,并且对该软件进行了k次测试,根据推论2可计算出一个关于测试用例的观测数据矩阵R如(8)式所示:
其中Rij表示对第i个测试用例进行第j次测试所得到的结果。其中经过k次测试后,每个测试用例的可靠度可以取其算术平均值作为最后结果,其结果可表示为式(9)。
根据(8)、(9)式可推导出测试软件P的最终矩阵表达式为式(10):
下面利用R={R(c)1,…,R(c)m}对软件可靠度RP进行检验。检验的问题是:
这里的RP表示测试员或者软件使用者对软件可靠度的期望值,如果测试软件可靠度大于该期望值,则认为测试软件的可靠度达到要求,否则,认为没达到要求。根据式(8)可推出软件的可靠度的极大似然估计为式(11)。
对于给定的检验水平α,假设A={R^p>Rα},通常的检验方法应该选取R尽可能的小,对给定的水平α,其中临界值Rα可以表示为式(12)。
通过上文分析,可得出RP的对数似然函数为式(13)。
其中,c是一个与Rij无关的常数且c=-m log k。
给定(R1,…,Rm)的一个初值(R(0)1,…,R(0)m),则在已知l步迭代后,EM算法的E步是:
EM算法的M步是在RP=R1…Rm=RP下求出Q(R1,…,Rm,R(l)1,…,R(l)m)关于(R1,…,Rm)的最大值。其中可以利用Lagrange乘子法得到最大值点为R(l)ij=R(l)ij+λ,其中λ是方程∏mi=1∑kj=1(R(l)ij+λ)=RP的解。
这样可得到一个序列{(R(l)1,…,R(l)m),l=1,2,…}。根据EM算法的一般原则,这个序列使得R(l)P{R^P>R}是单调不减的。如果初值选得适当,则方程也收敛得较快。
4试验模拟
软件可靠性模型主要是改进软件开发过程和软件可靠性的度量。基于测试用例的软件可靠性评估模型是根据在在改善测试用例设计过程中通过对失效数据进行建模,并且通过EM算法来求其最小置信下限,真实地描述了软件失效特征,理论上具有较高的预计精度和较好的适用性。
4.1测试用例可靠度计算
下面给出一个有关登录原为:登陆系统的测试用例试验数据,该用例包括3个测试向量,即,Fc={F1,F2,F3},根据定义4将其按照缺陷等级分成5个类别,其相关测试数据见表1。
缺陷因子对软件本身的影响的情况下可计算出功能向量的可靠度RF=[0.9415,0.9658,0.962]和测试用例的可靠度Rc=0.9564。从测试结果来说,用户和测试人员更容易接受包含缺陷影响因子的测试结果。
4.2适用性评价
本文所给出的软件可靠性评估模型是基于数据域的基础上提出的,而Nelson模型是数据域软件可靠模型的代表。文章通过对上述登录原为:登陆系统的模拟,得出了一组关于Nelson模型、传统算法和基于测试用例模型的试验数据(本文所提出的模型用TC模型表示)。
5结语
在软件可靠性模型构建的过程中充分考虑了测试的各个环节产生因素对测试充分性所带来的影响,并最终得出软件可靠性的数学评估模型。模型从测试用例的输入域和测试点集入手,在充分考虑了软件复杂性和缺陷影响因子等因素前提下,结合数学方法构建了基于测试用例的可靠性模型。为了确保模型的可靠性,采用了EM算法对该模型进行了可靠性检验。理论和实验表明该模型有一定的优势,其结果更加符合测试人员和使用人员的期望值,在精度和适应性方面都有一定的提高。但是,其中仍有些问题需要进一步研究,如将新模型应用于更多的工程数据,对新模型的适用性作进一步分析等。总之,基于测试用例的可靠性模型很值得做进一步的研究。
|