1MILY: 黑体; mso-bidi-font-size: 12.0pt">.4 软件可靠性
1.硬件可靠性
所谓系统的可靠性,是指“一个系统在一定的环境下,在所给定的时间内能按预定的要求完成一定功能的概率”。
设一个具有N个元件的系统,经运行t时间后,有F(t)个元件失效,其余S(t)个元件仍然保持完好,则分别定义元件的可靠度R(t)和不可靠度Q(t)为:
定义元件的失效率Z(t)为单位时间内失效的元件数与非失效的元件数之比。
根据理论研究和大量统计得出,在正常的工作条件下,元件的失效变化趋势如图1.3所示。这就是硬件系统可靠性分析中著名的盆式曲线(Bathtub curve)。它表明系统在使用的开始阶段,其失效率是比较高的,但随着故障的排除,其失效率将稳定在一个基本上保持不变的常数,这个时期称为正常的使用期。由于受到周围环境、元件老化等因数的影响,在使用一定的时间后,系统的故障率开始上升,而且越来越高,直至系统被淘汰。
在正常的使用期,系统的失效率可以近似为一个常数l,则:
解这个方程,并考虑到R(0)=1,有:
硬件可靠性理论中的一个重要参数是系统的平均故障间隔时间MTBF(Mean Time Between Failures)和平均故障时间MTTF(Mean Time To Failures)。MTBF是指可修复故障的系统,而MTTF是指不可修复故障的系统。如果忽略这一点,MTBF和MTTF是混用的。因此,根据定义:
上述公式是硬件可靠性的基本理论,也是一套非常成熟的理论。
经过几十年的发展,硬件可靠性不但在理论上成熟的,而且在工程上也有许多提高可靠性的方法和工具。目前,一般出厂的硬件产品都有可靠性指标,如风险函数和MTBF等。
2.软件可靠性
软件的可靠性定义为:在给定的时间内,特定环境下软件正确运行的概率。正如前节所述,软件可靠性是软件质量的要素之一。对用户而言,同其它软件质量要素相比,软件可靠性是最重要的要素。
从其定义可以看出,软件可靠性涉及三个概念:给定的时间、特定的环境、正确运行的概率。
对给定的时间,是指由于软件的可靠性是随时间而变化的,根据软件可靠性的理论,软件每排除一个故障,其可靠性就提高一步。因此,在谈论软件可靠性的时候,一定要指明是什么时间的可靠性。
特定的环境是软件可靠性的一个重要的因素,它包括硬件环境、软件支撑环境和其它为保证软件正常运行所需要的环境。在评估软件可靠性时,一般要假设环境是正确无误的。
正确运行的概率情况比较复杂,软件运行包括选择输入数据和启动程序执行。但问题是如何选择输入数据才能真实的反应软件的可靠性?如何根据错误发生的时间来评估软件可靠性?软件可靠性的变化规律是什么?等等,类似的问题在软件可靠性理论的研究中都没有很好的解决。虽然如此,在过去的三十余年里,科学家在这个方面做了大量的研究,目前比较著名的有四十余种软件可靠性模型,由于工程数据的来源以及对软件可靠性认识上的不同,这些模型存在较大的差异。一个新的软件究竟用那种可靠性模型去评估更好,目前尚无定论。只能根据工程背景和个人的喜好去判断。
抛开寻求统一的软件可靠性模型,近几年来,许多科学家试图从工程的角度研究软件可靠性的部分内容,主要是软件的平均无故障时间MTBF、软件的故障率l等,这些参数对用户来说恐怕是更重要的。目前的许多军用软件、关系到国计民生的一些重要软件都有相应的可靠性参数评估,也是软件生产应达到的目标。
根据软件可靠性的理论,一个软件在交付之后,软件的可靠性就是确定的,只不过人们现在还没有很好的办法去认识它。抛开其它因素不谈,唯一能影响软件可靠性的是残留在软件中错误数目。随着软件在测试过程中或在使用过程中,软件错误的不断发现与排除,残留在软件中的错误会逐步减少,软件的故障率会逐步降低,因此,软件的故障率曲线应该类似于图1.4所示的曲线。这是软件可靠性建模的基本思想。
1.5 软件错误
1. 软件错误的概念
定义1.1:错误(Error):是指人们期望的和系统实际具有的状态或行为之间的偏差。
软件错误包括由系统分析或者程序设计而产生的全部错误。软件错误存在于软件生存期的各个阶段,凡是和预期的状态或行为不相符合的统称为软件错误。例如,制定的计划和实际不相符合的、需求说明书有问题的、设计说明书有问题的、程序编码有问题的、测试有问题的、运行结果不正确的、维护有问题的等等,都是软件错误。
定义1.2:失效(Failure):是指在软件运行期间出现的错误。它是因软件中存在的错误引起的、并在执行期间动态表现出来的和实际不同的状态和行为。
从这里可以看出,失败只是错误的一部分。
定义1.3:故障(Fault):是指软件中的物理缺陷。
故障也是错误的一部分,故障是指软件中实实在在存在的错误。故障可能引起软件的失效,也可能不引起软件的失效,人们总是通过修改软件中的故障来提高软件的可靠性。
定义1.4:缺陷(Defect,Bug):凡是没有按照要求所进行的工作统称为缺陷。
缺陷泛指系统中的一切错误。显然,缺陷是比错误范围更大的概念,缺陷除了包括错误所具有的全部属性外,像程序的多余物、难以理解的程序、难以修改的程序,文档不完全等,虽然这些可能并不能使软件失败,但是缺陷。通过修改软件中的缺陷来提高软件的质量。
从定义可以看出,上述四个概念是彼此相关的,有些文献中也经常是混用的。实际使用时应区分它们之间的层次和范围。
2.软件的缺陷数目与缺陷密度
软件的缺陷数目是指软件中所存在的所有缺陷的总和。而软件的缺陷密度是指每单位代码中的缺陷数目,这里,单位代码一般是KLOC或KSLOC(千行源代码),表示为缺陷数目/KLOC,或者缺陷数目/KSLOC。
软件工程师在工作中一般会引入大量的缺陷。统计表明,有经验的软件工程师的缺陷引入率一般是50~250个缺陷/KLOC,平均的缺陷引入率在100个缺陷/KLOC以上。即使软件工程师学过软件缺陷管理之后,平均的缺陷引入率也在50个缺陷/KLOC,也就是说,每20行代码中就有一个缺陷。再者从理论上看,人的认识能力是有限的,根据Hatton模型,对一般的软件,软件的缺陷数目可用下面的公式表示:
这里W是软件的复杂度,一般用源代码数目来表示。
从工程实践来看,目前世界上先进的软件开发组织所生产的软件,其缺陷密度可以达到2个缺陷/KLOC,一般的软件开发组织所生产的软件其缺陷密度可以达到4~40个缺陷/KLOC。据统计,在美国,安全第一的软件开发的代价是每行程序需花费500$。NASA所生产的软件其故障密度可以达到0.1个缺陷/KLOC,但其代价是每行源代码高达1000$。
软件的缺陷数目或者缺陷密度可以通过测试或者其它方法来计算。而残留在软件中缺陷数目或者缺陷密度只能通过评估来得到,例如根据测试的程度、或者根据软件可靠性模型等可以预测软件中残留的缺陷数目。
在安全第一或者一些重要的软件验收中,软件的缺陷数目或者缺陷密度是软件能否通过验收的重要标准。
文章来源于领测软件测试网 https://www.ltesting.net/