7.9.1 基本概念 1.软件可靠性的定义
对于软件可靠性有许多不同的定义,其中多数人承认的一个定义是:软件可靠性是程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。 在上述定义中包含的随机变量是时间间隔。显然,随着运行时间的增加,运行时出现程序故障的概率也将增加,即可靠性随着给定的时间间隔的加大而减少。
按照IEEE的规定,术语“错误”的含义是由开发人员造成的软件差错(bug),而术语“故障”的含义是由错误引起的软件的不正确行为。在下面的论述中,将按照IEEE规定的含义使用这两个术语。 2.软件的可用性
通常用户也很关注软件系统可以使用的程度。一般说来,对于任何其故障是可以修复的系统,都应该同时使用可靠性和可用性衡量它的优劣程度。 软件可用性的一个定义是:软件可用性是程序在给定的时间点,按照规格说明书的规定,成功地运行的概率。
可靠性和可用性之间的主要差别是,可靠性意味着在O到£这段时间间隔内系统没有失效,而可用性只意味着在时刻f,系统是正常运行的。因此,如果在时刻£系统是可用的,则有下述种种可能:在O到£这段时间内,系统一直没失效(可靠);在这段时间内失效了一次,但是又修复了;在这段时间内失效了两次修复了两次;??
如果在一段时间内,软件系统故障停机时间分别为£。,,£。。,?,正常运行时间分别为 Tup ASS = (7.1) Tup + Tdown
Tup Tdown = 其中 = ?tui ?tdi
如果引入系统平均无故障时间MTTF和平均维修时间MTTR的概念,则(7.1)式可 以变成
MTTF (7.2) = ASS
MTTF + MTTR
平均维修时间MTTR是修复一个故障平均需要用的时间,它取决于维护人员的技
术水平和对系统的熟悉程度,也和系统的可维护性有重要关系,第8章将讨论软件维护问题。平均无故障时间MTTF是系统按规格说明书规定成功地运行的平均时间,它主要取决于系统中潜伏的错误的数目,因此和测试的关系十分密切。 7.9.2 估算平均无故障时间的方法
软件的平均无故障时间MTTF是一个重要的质量指标,往往作为对软件的一项要求,由用户提出来。为了估算MTTF,首先引入一些有关的量。 1.符号
在估算MTTF的过程中使用下述符号表示有关的数量: Er——测试之前程序中错误总数; Ir——程序长度(机器指令总数); τ——测试(包括调试)时间;
Ed(τ)——在0至τ期间发现的错误数; Ec(τ)——在O至τ期间改正的错误数。 2.基本假定
根据经验数据,可以作出下述假定。
(1)在类似的程序中,单位长度里的错误数Er/J,近似为常数。美国的一些统计数字表明,通常
O.5×10-2≤ET/IT≤2×10-2
也就是说,在测试之前每1 000条指令中大约有5~20个错误。
(2)失效率正比于软件中剩余的(潜藏的)错误数,而平均无故障时间MTTF与剩余的错误数成反比。
(3)此外,为了简化讨论,假设发现的每一个错误都立即正确地改正了(即,调试过程没有引入新的错误)。因此 Ec(τ)=Ed(τ) 剩余的错误数为
Er(τ)=Er—Ec(τ) (7.3) 单位长度程序中剩余的错误数为
?r(τ)=ET/IT—Ec(τ)/I T (7.4) 3.估算平均无故障时间
经验表明,平均无故障时间与单位长度程序中剩余的错误数成反比,即
1
MTTF= K(ET/IT - EC(τ)/IT) (7.5)
其中K为常数,它的值应该根据经验选取。美国的一些统计数字表明,K的典型
值是200。
估算平均无故障时间的公式,可以评价软件测试的进展情况。此外,由(7.5)式可得
IT (7.6) Ec = ET —
K╳MTTF
因此,也可以根据对软件平均无故障时间的要求,估计需要改正多少个错误之后,测试工作才能结束。 4.估计错误总数的方法
程序中潜藏的错误的数目是一个十分重要的量,它既直接标志软件的可靠程度,又是计算软件平均无故障时间的重要参数。显然,程序中的错误总数ET与程序规模、类型、开发环境、开发方法论、开发人员的技术水平和管理水平等都有密切关系。下面介绍估计ET的两个方法。 (1)植入错误法 使用这种估计方法,在测试之前由专人在程序中随机地植入一些错误,测试之后,根据测试小组发现的错误中原有的和植入的两种错误的比例,来估计程序原有错误的总数ET。
假设人为地植入的错误数为Ns,经过一段时间的测试之后发现ns,个植入的
错误,此外还发现了n个原有的错误。如果可以认为测试方案发现植入错误和发
现原有错误的能力相同,则能够估计出程序中原有错误的总数为
n N = Ns (7.7)
?
?ns 其中N即是错误总数ET,的估计值。
(2)分别测试法
植入错误法的基本假定是所用的测试方案发现植入错误和发现原有错误的概率相同。但是,人为地植入的错误和程序中原有的错误可能性质很不相同,发现它们的难易程
自然也不相同,因此,上述基本假定可能有时和事实不完全一致。 如果有办法随机地把程序中一部分原有的错误加上标记,然后根据测试过程中发现的有标记错误和无标记错误的比例,估计程序中的错误总数,则这样得出的结果比用植入错误法得到的结果更可信一些。
为了随机地给一部分错误加标记,分别测试法使用两个测试员(或测试小组),彼此独立地测试同一个程序的两个副本,把其中一个测试员发现的错误作为有标记的错误。具体做法是,在测试过程的早期阶段,由测试员甲和测试员乙分别测试同一个程序的两个副本,由另一名分析员分析他们的测试结果。用r表示测试时间,假设
·τ=0时错误总数为B0;
·τ=τ1,时测试员甲发现的错误数为B1;
·τ=τ1,时测试员乙发现的错误数为B2;
·τ=τ1时两个测试员发现的相同错误数为bc。
如果认为测试员甲发现的错误是有标记的,即程序中有标记的错误总数为B1,则测试员乙发现的B2个错误中有bc个是有标记的。假定测试员乙发现有标记错误和发现无标记错误的概率相同,则可以估计出测试前程序中的错误总数为
B2 B = B1 (7.8)
?00bc
使用分别测试法,在测试阶段的早期,每隔一段时间分析员分析两名测试员
的测试结果,并且用(7.8)式计算B如果几次估算的结果相差不多,则可用B的
00??平均值作为ET的估计值。.此后一名测试员可以改做其他工作,由余下的一名测试员继续完成测试工作,因为他可以继承另一名测试员的测试结果,所以分别测试法增加的测试成本并不太多。
7.10 小 结
实现包括编码和测试两个阶段。 按照传统的软件工程方法学,编码是在对软件进行了总体设计和详细设计之后进行的,它只不过是把软件设计的结果翻译成用某种程序设计语言书写的程序,因此,程序的质量基本上取决于设计的质量。但是,编码使用的语言,特别是写程序的风格,也对程序质量有相当大的影响。
大量实践结果表明,高级程序设计语言较汇编语言有很多优点。因此,除非在非常必要的场合,一般不要使用汇编语言写程序。至于具体选用哪种高级程序设计语言,则不仅要考虑语言本身的特点,还应该考虑使用环境等一系列实际因素。
程序内部的良好文档资料,有规律的数据说明格式,简单清晰的语句构造和输入输出格式等等,都对提高程序的可读性有很大作用,也在相当大的程度上改进了程序的可维护性。
目前软件测试仍然是保证软件可靠性的主要手段。测试阶段的根本任务是发现并改正软件中的错误。
软件测试是软件开发过程中最艰巨最繁重的任务,大型软件的测试应该分阶段地进行,通常至少分为单元测试、集成测试和验收测试3个基本阶段。 设计测试方案是测试阶段的关键技术问题,基本目标是选用最少量的高效测试数据,做到尽可能完善的测试,从而尽可能多地发现软件中的问题。 应该认识到,软件测试不仅仅指利用计算机进行的测试,还包括人工进行的测试(例如,代码审查)。两种测试途径各有优缺点,互相补充,缺一不可。 白盒测试和黑盒测试是软件测试的两类基本方法,这两类方法各有所长,相互补充。 通常,在测试过程的早期阶段主要使用白盒方法,而在测试过程的后期阶段主要使用黑盒方法。为了设计出有效的测试方案,软件工程师应该深入理解并坚持运
用关于软件测试的基本准则。
设计白盒测试方案的技术主要有,逻辑覆盖和控制结构测试;设计黑盒测试方案的技术主要有,等价划分、边界值分析和错误推测。 在测试过程中发现的软件错误必须及时改正,这就是调试的任务。为了改正错误,首先必须确定错误的准确位置,这是调试过程中最困难的工作,需要审慎周密的思考和推理。为了改正错误往往需要修正原来的设计,必须通盘考虑统筹兼顾,而不能“头疼医头、脚疼医脚”,应该尽量避免在调试过程中引进新错误。 测试和调试是软件测试阶段中的两个关系非常密切的过程,它们往往交替进行。
程序中潜藏的错误的数目,直接决定了软件的可靠性。通过测试可以估算出程序中剩余的错误数。根据测试和调试过程中已经发现和改正的错误数,可以估算软件的平均无故障时间;反之,根据要求达到的软件平均无故障时间,可以估算出应该改正的错误数,从而能够判断测试阶段何时可以结束。
习 题7
1.下面给出的伪码中有一个错误。请仔细阅读这段伪码,说明该伪码的语法特点,
找出并改正伪码中的错误。字频统计程序的伪码如下: INITIALIZE the Program READ the first text record
DO WHILE there are more words in the text record DO WHILE there are more words in the text record EXTRACT the next text word
SEARCH the word_table for the extracted word IF the extracted word is found
INCREMENT the word’s occurrence count ELSE
INSERT the extracted word into the table END IF
INCREMENT the words_processed count END DO at the end of the text record READ the next text record
END DO when aI】text records have heen read PRINT the table and summary information TERMINATE the program
2.研究下面给出的伪码程序,要求: (1)画出它的程序流程图。
(2)它是结构化的还是非结构化的?说明理由。 (3)若是非结构化的,则
(a)把它改造成仅用3种控制结构的结构化程序; (b)写出这个结构化设计的伪码; (c)用盒图表示这个结构化程序。 (4)找出并改正程序逻辑中的错误。