测试阶段的根本目标是消除错误,保证软件的可靠性。读者可能会问,什么是软件的可靠性呢?应该进行多少测试,软件才能达到所要求的可靠程度呢?这些正是本节要着重讨论的问题。
1.软件可靠性的定义
对于软件可靠性有许多不同的定义,其中多数人承认的一个定义是:软件可靠性是程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。
在上述定义中包含的随机变量是时间间隔。显然,随着运行时间的增加,运行时出现程序故障的概率也将增加,即可靠性随着给定的时间间隔的加大而减少。
按照IEEE的规定,术语“错误”的含义是由开发人员造成的软件差错(bug),而术语故障的含义是由错误引起的软件的不正确行为。在下面的论述中,将按照IEEE规定的含义使用这两个术语.
2.软件的可用性
通常用户也很关注软件系统可以使用的程度。一般说来,对于任何其故障是可以修复的系统,都应该同时使用可靠性和可用性衡量它的优劣程度。
软件可用性的一个定义是:软件可用性是程序在给定的时间点,按照规格说明书的规定,成功地运行的概率。
可靠性和可用性之间的主要差别是,可靠性意味着在0到1这段时间间隔内系统没有失效,而可用性只意味着在时刻t,系统是正常运行的。因此,如果在时刻t系统是可用的,则有下述种种可能:在0到t这段时间内,系统一直没失效(可靠);在这段时间内失效了一次,但是又修复了;在这段时间内失效了两次修复了两次;……
如果在一段时间内,软件系统故障停机时间分别为td1,td2,…,正常运行时间分别为tu1,tu2,…,则系统的稳态可用性为:
A_ss=T_up/(T_up+T_down )(6.1)
其中,T_up=∑▒t_ui ,T_down=∑▒t_di
如果引入系统平均无故障时间MTTF和平均维修时间MTTR的概念,则(6.1)式可变成
A_ss=MTTF/(MTTF+MTTR)(6.2)
平均维修时间MFFR是修复一个故障平均需要用的时间,它取决于维护人员的技术水平和对系统的熟悉程度,也和系统的可维护性有重要关系,第7章将讨论软件维护问题。平均无故障时间MTTF是系统按规格说明书规定成功地运行的平均时间,它主要取决于系统中潜伏的错误的数目,因此和测试的关系十分密切。
软件的平均无故障时间MTTF是一个重要的质量指标,往往作为对软件的一项要求,由用户提出来。为了估算MTTF,首先引入一些有关的量。
1.符号
在估算MTTF的过程中使用下述符号表示有关的数量。
ET——测试之前程序中错误总数;
IT——程序长度机器指令总数;
τ——测试(包括调试)时间;
E_d (τ)——在0至τ期间发现的错误数;
E_c (τ)——在0至τ期间改正的错误数。
2.基本假定
根据经验数据,可以作出下述假定。
(1)在类似的程序中,单位长度里的错误数ET/IT近似为常数。美国的一些统计数字表明,通常也就是说,在测试之前每1000条指令中大约有5-20个错误。
(2)失效率正比于软件中剩余的(潜藏的)错误数,而平均无故障时间MTTF的错误数成反比。
(3)此外,为了简化讨论,假设发现的每一个错误都立即正确地改正了(即,调试过程没有引入新的故障)。因此
E_c (τ)=E_d (τ)
剩余的故障数为
E_r (τ)=E_r-E_c (τ)(6.3)
单位长度程序中剩余的错误数为
ε_r (τ)=E_T/I_T -E_c (τ)/I_T(6.4)
3.估算平均无故障时间
经验表明,平均无故障时间与单位长度程序中剩余的错误数成反比,即
MTTF=1/(K(E_r/I_r -E_c (τ)/I_r))(6.5)
其中K为常数,它的值应该根据经验选取。美国的一些统计数字表明,K的典型值是200。
估算平均无故障时间的公式,可以评价软件测试的进展情况。此外,由式(6.5)可得
E_c=E_r-I_T/(K×MTTF)
因此,也可以根据对软件平均无故障时间的要求,估计需要改正多少个错误之后,测试工作才能结束。
4.估计错误总数的方法
程序中潜藏的错误的数目是一个十分重要的量,它既直接标志软件的可靠程度,又是计算软件平均无故障时间的重要参数。显然,程序中的错误总数ET与程序规模、类型、开发环境、开发方法论、开发人员的技术水平和管理水平等都有密切关系。下面介绍估计ET的两个方法。
(1)植入错误法
使用这种估计方法,在测试之前由专人在程序中随机地植入一终错误,测试之后,根据侧试小组发现的错误中原有的和植入的两种错误的比例,来估计程序中原有错误的总数ET。
假设人为地植入的错误数为Ns,经过一段时间的测试之后发现ns个植入的错误,此外还发现了n个原有的错误。如果可以认为测试方案发现植入错误和发现原有错误的能力相同,则能够估计出程序中原有错误的总数为
N ̂=n/n_s N_s
其中N ̂即是错误总数ET的估计值。
(2)分别测试法
植入错误和发现原有错误的概率相同。但是,人为地植入的错误和程序中原有的错误可能性质很不相同,发现它们的难易程度自然也不相同,因此,上述基本假定可能有时和事实不完全一致。
如果有办法随机地把程序中一部分原有的错误加上标记,然后根据测试过程中发现的有标记错误和无标记错误的比例,估计程序中的错误总数,则这样得出的结果比用植入错误法得到的结果更可信一些。
为了随机地给一部分错误加标记,分别测试法使用两个测试员(或测试小组),彼此独立地测试同一个程序的两个副本,把其中一个测试员发现的错误作为有标记的错误。具体做法是,在测试过程的早期阶段,由测试员甲和测试员乙分别测试同一个程序的两个副本,由另一名分析员分析他们的测试结果。用表示测试时间,假设
τ=0时错误总数为B0;
τ=τ_1时测试员甲发现的错误数为B1;
τ=τ_1时测试员乙发现的错误数为B2;
τ=τ_1时两个测试员发现的相同错误数为bc。
如果认为测试员甲发现的错误是有标记的,即程序中有标记的错误总数为B1,则测试员乙发现的B2个错误中有bc个是有标记的。假定测试员乙发现有标记错误和发现无标记错误的概率相同,则可以估计出测试前程序中的错误总数为
(B_0 ) ̂=B_2/b_c B_1(6.8)
使用分别测试法,在测试阶段的早期,每隔一段时间分析员分析两名测试员的测试结果,并且用(6.8)的估计值计算。如果几次估算的结果相差不多,则可用的的平均值作为ET的估计值。此后一名测试员可以改做其他工作,由余下的一名测试员继续完成测试工作,因为他可以继承另一名测试员的测试结果,所以分别测试法增加的测试成本并不太多。