3.3 软件可靠性测试
3.3.1 软件可靠性测试概念
软件可靠性测试是指为了保证和验证软件的可靠性而对软件进行的测试,是在软件生存周期的系统测试阶段提高软件可靠性水平的有效途径,是软件可靠性工程的一项重要工作内容,是评价软件可靠性水平及验证软件产品是否达到可靠性要求的重要途径。使用各种测试方法、测试技术都能发现导致软件失效的软件中残存的缺陷,排除这些缺陷后,一般来讲一定会实现软件可靠性增长,但是排除这些缺陷对软件可靠性的提高作用却是不一样的。通过软件可靠性测试能有效地发现对软件可靠性影响大的缺陷,因此可以有效地提高软件的可靠性水平。
软件可靠性测试与传统意义上的软件测试不同,因为软件可靠性不仅和系统的特征有关,还和系统的使用环境有关,即在不同的使用方式下,软件的质量不同。通过模拟软件的实际使用情况来指导测试过程的软件可靠性测试主要有两类,分别是以J.D.Musa为代表研究的软件可靠性工程,以及以Harlan Mills等为代表研究的净室软件工程。在J.D.Musa的研究中,构造运行剖面是最为关键的一项工作,通过运行剖面描述用户对软件的使用情况,并在此基础上通过随机抽样生成软件测试数据,从而指导软件可靠性测试的进行。J.D.Musa将运行剖面定义为“操作和它们发生概率的简单集合”,并给出了运行剖面的构造方法。净室软件工程中的可靠性测试使用的是系统状态变迁图测试模型方法,这种方法中使用了Markov测试模型,该模型是反应式系统典型的统计测试模型。在净室软件工程中,使用的模型是伴随着顺序规范过程建立起来的。本书采用的是按照软件的运行剖面,即对软件实际使用情况的统计规律的描述,来对软件进行随机测试的测试方法。通过软件可靠性测试可以达到以下目的。
第一,有效发现程序中影响软件可靠性的缺陷,从而实现可靠性增长。软件可靠性是指在规定的时间内,在规定的条件下,软件不引起系统失效的能力,其概率度量称为软件可靠度。软件的“规定的条件”主要包括相对不变的条件和相对变化的条件,相对不变的条件包括计算机及其操作系统;相对变化的条件是指输入的分布,用软件的运行剖面来描述。按照软件的运行剖面对软件进行测试一般先暴露在使用中发生概率高的缺陷,然后暴露发生概率低的缺陷。发生概率高的缺陷是影响产品可靠性的主要缺陷,通过排除这些缺陷可以有效地实现软件可靠性的增长。
第二,验证软件可靠性满足一定的要求。通过对软件可靠性测试中观测到的失效情况进行分析,可以验证软件可靠性的定量要求是否得到满足。
第三,估计、预计软件可靠性水平。通过对软件可靠性测试中观测到的失效数据进行分析,可以评估当前软件可靠性的水平,预测未来软件可靠性可能达到的水平,从而为开发管理提供决策依据。软件可靠性测试中暴露的缺陷既可以是影响功能需求的缺陷,也可以是影响性能需求的缺陷。软件可靠性测试是面向需求、面向使用的测试方法,不需要了解程序的结构及如何实现等问题,从概念上讲是一种黑盒测试方法。
软件可靠性测试通常在系统测试、验收、交付阶段进行,主要在实验室内的仿真环境下进行,也可以根据需要或在条件允许的情况下在用户现场进行。
3.3.2 软件可靠性测试过程
3.3.2.1 软件可靠性测试活动
软件可靠性测试的一般过程如图3.5所示,主要活动包括构造运行部面、生成测试用例、准备测试环境、测试运行、收集数据、数据分析和失效修正。
图3.5 软件可靠性测试的一般过程
1.构造运行剖面
软件的运行剖面是对系统使用条件的定义,即系统的输入值按时间的分布或按它们在可能输入范围内出现概率的分布来定义。粗略地说,运行剖面是用来描述软件的实际使用情况的。运行剖面是否能代表、刻画软件的实际使用情况取决于可靠性工程人员对软件的系统模式、功能、任务需求及相应的输入激励的分析,取决于他们对用户使用这些系统模式、功能、任务的概率的了解。构造的运行剖面的质量将对测试、分析的结果是否可信产生最直接的影响。
2.生成测试用例
软件可靠性测试采用的是按照运行剖面对软件进行可靠性测试的方法。因此,可靠性测试所用测试用例是根据运行剖面随机选取得到的。
3.准备测试环境
为了得到尽可能真实的可靠性测试结果,可靠性测试应尽量在真实的环境下进行,但是在许多情况下,在真实的环境下进行软件可靠性测试很不实际,因此需要开发软件可靠性仿真测试环境。例如,对于多数嵌入式软件而言,由于与之交联的环境的开发与软件的开发常常是同步甚至是滞后的,因此无法及时进行软件可靠性测试;在有些系统中,由于与之交联的环境非常昂贵,因此无法用于需要进行大量运行的可靠性测试。
4.测试运行
在真实的测试环境或可靠性仿真测试环境中,用按照运行剖面生成的测试用例对软件进行测试。
5.收集数据
收集的数据包括:软件的输入数据、输出结果,用于进行失效分析和回归测试;软件运行时间数据,可以是CPU执行时间、日历时间、时钟时间等;失效数据,包括每次失效发生的时间或一段时间内发生失效的次数,失效数据可以通过实时分析得到,也可以通过事后分析得到。收集的数据质量对于最终的可靠性分析结果有很大的影响,应尽可能采用自动化手段进行数据的收集,以提高效率、准确性和完整性。
6.数据分析
数据分析主要包括失效分析和可靠性分析。失效分析是指根据运行结果判断软件是否失效,以及失效的后果、原因等;可靠性分析主要是指根据失效数据,评估软件的可靠性水平,预估可能达到的可靠性水平,评价软件产品是否已经达到要求的可靠性水平,为管理决策提供依据。
7.失效修正
如果软件的运行结果与需求不一致,则称软件发生失效。通过失效分析,找到并修正引起失效的程序中的缺陷,从而实现软件可靠性的增长。
3.3.2.2 软件可靠性增长测试过程
软件可靠性增长测试是为了满足用户对软件可靠性的要求、提高软件可靠性水平而对软件进行的测试,是为了满足软件的可靠性指标要求对软件进行测试—可靠性分析—修改—再测试—再分析—再修改的循环过程。软件可靠性增长测试过程如图3.6所示。
图3.6 软件可靠性增长测试过程
3.3.2.3 软件可靠性验证测试过程
软件可靠性验证测试是为了验证在给定的统计置信度下软件当前的可靠性水平是否满足用户的要求而进行的测试,即用户在接收软件时确定它是否满足软件规格说明书中规定的可靠性指标。一般在软件可靠性验证测试过程中,不对软件进行修改。软件可靠性验证测试过程如图3.7所示。
图3.7 软件可靠性验证测试过程
总之,软件可靠性测试是面向可靠性要求的测试,是软件可靠性工程中的一项重要工作,它能有效地发现影响软件可靠性的缺陷。通过软件可靠性测试,可以有效实现软件可靠性增长,估计软件可靠性水平,验证软件可靠性是否达到要求。但是对于软件可靠性测试的困难和局限性,也应有充分的认识。
首先,软件可靠性测试是一项高投入的测试工作。进行软件可靠性测试必须要了解软件的使用历史,或估计可能的使用情况,构造软件的运行剖面,准备测试环境,并且要进行大量的测试运行。
其次,软件可靠性测试不能代替其他的测试和验证方法。从有效发现缺陷的角度出发,软件可靠性测试可能不是最有效的方法,必须结合其他的测试和验证方法、手段发现软件中存在的各种缺陷。
最后,难以验证具有极高可靠性要求的软件。对于具有极高可靠性要求的软件,如要求失效率为10-9的软件,使用软件可靠性测试方法进行验证是不切合实际的,必须采用形式化验证等方法来加以解决。