基于故障的软件可测试性模型设计与应用

2015-10-14 11:24吕俊廷
科技视界 2015年28期
关键词:失效故障

吕俊廷

【摘 要】软件的可测试性表示软件中的错误被检测出的难易程度,软件的可信度则表示经过测试之后对一个软件的信任程度,它们都是软件的重要质量特性。本文将极限理论引入到软件测试过程中,较好的解决了确定软件的可信度的方法,建立了基于故障的可测试性模型,并利用这个模型给出了软件可测试度的计算方法。最后,给出了基于故障的可测试性模型在软件测试过程中的应用。

【关键词】可测试性;可信度;故障;失效;基于故障的可测试性模

软件的可测试性指在给定任意输入集合下对软件进行随机黒盒测试的过程中,软件中存在的错误被发现的难易程度。可测试度是可测试性大小的度量,指随机黒盒测试过程中,软件错误能够被揭示出来的概率。现有的可测试性模型,如敏感性分析模型[1]、PIE分析模型[2]、静态可测试性度量模型[3]等,都是基于白盒测试的,它们的理论基础就是软件的故障/失效(Fault/Failure)模型[4],这个模型介绍了软件故障导致软件失效的三个充分必要条件:

1)程序的输入使这个软件错误得到了执行;

2)被执行的错误使该程序位置之后的数据状态发生变化(故障);

3)错误的程序数据状态被传播到程序输出,并使输出结果错误(产生失效)。

各个不同的模型就是针对这三个充分必要条件,采用不同的技术来获取它的概率值,如敏感性分析模型和PIE分析模型主要应用了插装变异体的技术,而静态可测试性模型则是利用了各种操作符和操作数的发生潜在错误的概率来计算可测试性,基于错误/故障模型的可测试性计算方法要求多次运行被测程序,通过观测变异因子对程序结果的影响来估计其执行概率、传染概率和传播概率,进而估量程序可测试性度量指标值。该过程虽然较为贴近实际结果,但通常实现起来效率比较低下;同时由于该过程需要记录大量测试过程信息,因而对系统的资源要求也很高。本文试图建立一种基于软件测试过程的可测试性度量模型,可测试性的值在软件的测试过程中,被逐步的修正并随之应用于软件的测试,使得可测试性分析和软件测试过程有机结合在一起。

软件的可信度[5]反映了我们对一个软件的信任程度,一般的,R=,其中Lr表示程序中正确的代码行数,Lt表示代码总行数。问题在于一个软件经过测试之后,软件中正确的代码行数依然是未知的,那么我们能够在多大程度上信任它,即它的可信度是多少呢?软件测试的结果是衡量软件质量的依据,本文将从软件测试的结果中给出软件可信度的计算方法。

1 软件测试过程的极限模型

给定规格说明书S,满足S的正确的程序有无数个,它们构成一个等价类P。我们假定程序经过修改后引入的新故障数小于修正的故障数,对于一个较为成熟的组织,这个假设是成立的。设刚完成的未经测试的程序为P0,

公式(1)为我们在工程上的应用奠定了基础,我们无法知道正确的程序到底是什么,但是我们可以很容易的知道程序当前的版本和在此之前的版本的差异,后面我们将利用这个差异来确定软件的可测试度和可信度。

软件测试过程的极限模型是对程序进行多轮测试的过程中所表现出来的规律,这一点决定了它适合于大型的程序,因为只有大型的程序才有可能进行多轮的软件测试。对于小型的程序来讲,由于它的开发和测试过程受到个人技能因素的影响较大,所以极限模型在小型的程序中的表现并不明显。

2 基于故障的可测试性模型及其工程化应用

2.1 基于故障的可测试性模型

可测试性反映了程序的错误在测试过程中暴露的难易程度,可测试性好的程序,它的错误容易暴露出来;可测试性差的程序,它的错误难于暴露出来。如果错误容易暴露出来,我们就认为它体现了软件的优良的可测试性方面的信息;如果错误隐藏的很深,不容易暴露出来,我们就认为这些错误则体现了软件的可测试性差的方面的信息。因此,一个可测试性好的模块,它的错误必然容易发现,不需要执行太多的测试用例,在测试的初期就能够揭示出来;相反,可测试性差的模块,它的错误隐藏的很深,需要执行大量的测试用例,到测试的末期甚至直到软件交付使用后才能将错误揭示出来。

根据上面的分析,我们把软件的错误分为两类:容易暴露的错误和难于暴露的错误,那么可测试度就是容易暴露的错误的度量占错误的总度量的比例,下面将以错误的数量为度量单位进行讨论,即容易暴露的错误数占软件中错误总数的比例:

2.2 软件的可信度度量

在随机黒盒测试中,软件中的错误只有当以故障的形式表现出来时,我们才能够发现并修正它,软件中的错误到底有多少,即使经过了大量的测试之后,也是不可知的,因为软件测试只能够证明软件中含有错误,而无法证明软件是正确的。虽然软件故障只是软件错误的表现形式之一,对于工程化的应用来讲,那些永远不能以故障的形式表现出来的软件错误,可以认为是正确的,所以对于2.1节的可测试度公式(2)中的错误数,可以用故障数来代替

那么如何判定一个故障是容易暴露的故障还是难于暴露的故障呢?一个非常直观的想法就是容易暴露的错误必然容易被发现,因此在随机黒盒测试的早期就能够以软件故障的形式表现出来;难于暴露的错误必然隐藏的很深,不容易被发现,因此直到软件测试的末期,甚至于软件交付使用之后才被揭示出来。基于这种思想,我们把随机黒盒测试按照时间的顺序划分为若干个阶段,用第一阶段、第二阶段、…来表示,把初始阶段测试中发现的故障数作为容易发现的故障数,一般的可以取第一阶段

3 基于故障的可测试性模型在软件测试过程中的应用

基于故障的可测试性模型提供了两个非常有价值的软件指标:可信度和可测试度,这两个指标可以指导我们科学的规划软件测试的进度和合理的分配软件测试过程中资源。下面以p=2为例说明基于故障的可测试性模型在软件测试过程中的应用。

理论上来说,任何一轮测试结束后都可以计算软件的可测试度和可信度,但是假定p=2的前提下,第一轮测试结束后根据公式(4)是无法计算可信度的,所以p=2就意味着至少进行两轮测试;同理,如果假定p=3,则至少进行3轮测试,以此类推。那么两轮测试结束之后,可以由公式(4)计算软件的可信度R,如果R大于给定的软件的可信度R′,则停止测试;否则,根据公式(3)计算软件各个模块的可测试度,根据各模块可测试度的值分配测试资源,即可测试度越小,分配的测试资源越多;可测试度越大,分配的测试资源越少,继续进行下一轮的测试,直到满足给定的可信度为止。

可依照如下算法进行:

(Ⅰ)选择p的值,并进行p轮测试,得到程序Pp。

(Ⅱ)根据公式(4)计算程序Pp的可信度R,如果R>R′,则停止测试,程序Pp即可发布;否则转(3)。其中R′为事先给定的软件的可信度,是我们对软件的要求。

(Ⅲ)根据公式(Ⅲ)计算软件的各个模块的可测试度,根据可测试度的大小分配测试资源,进行第p+1轮测试,得到程序Pp+1,转(Ⅱ)。

在上述测试流程中,软件的可信度和可测试度不断的进行着修正,每进行一轮测试就向真值靠近一步,直到达到我们的要求才停下来。

4 结束语

本文将极限理论引入到软件测试中,解决了软件发布的时间点,即测试结束的时间点的问题,并在此基础上建立了基于故障的可测试性模型,给出了基于故障的可测试度计算方法,整个流程如下:

(1)软件测试以m天为一个阶段进行,各个阶段的测试天数m可以不同,一个版本测试结束后,把测试中发现的故障进行修正得到新的编译版本,由此得到一个程序序列:

(3)计算软件的可测试度,T=,其中Fo表示第一阶段发现的故障数,F表示测试过程中发现的故障总数。基于故障的可测试性模型主要是针对桌面操作环境下故障发生的特点提出的,对于网络环境并没有考虑到,尤其是网络环境下的软件疲劳问题,可能是本模型的一个盲区,还需要做进一步的研究。

【参考文献】

[1]Jeffrey Voas. Software Testability Measurement for Assertion Placement and Fault Localization[J].Software Quality Journal, 1997,6(5):327-335.

[2]Jeffrey Voas. A Dynamic Failure Model for Predicting the Impact that a Program Location has on the Program[J]. ESEC,1991,550(3):308-331.

[3]Jin-Cherng Lin,Szu-wen Lin&Ian-Ho. An Estimated Method for Software Testability Measurement[J]. Eighth IEEE International Workshop Proceedings on Software Technology and Engineering Practice [Incorporating Computer Aided Software Engineering], 1997,6(6):14-18.

[4]Morell, Larry. A Theory of Fault-based Testing[J]. IEEE Tracsactions on Software Engineering, 1990,16(8):844-857.

[5]宫云战.软件的测试性分析与设计[J].装甲兵工程学院学报,2000,1(1):1-5.

[责任编辑:邓丽丽]

猜你喜欢
失效故障
故障一点通
沧电锅炉受热面几种典型失效案例分析
谨防网络意识形态宣传“失效”
三伏贴“失效”三大原因
大学化学实验用氟离子选择电极的再生处理研究
奔驰R320车ABS、ESP故障灯异常点亮
江淮车故障3例