《毕业设计(论文)针对网络教学平台软件的可靠性测试研究与实践.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)针对网络教学平台软件的可靠性测试研究与实践.doc(32页珍藏版)》请在三一办公上搜索。
1、目录第 1 章 绪论1.1 课题背景1.2 国内外研究动1.2.1 软件可靠性研究的发展及现状1.2.2 软件可靠性领域面临的主要问题1.3 论文主要研究内容及意义第 2 章 软件可靠性测评相关理论研究2 .1 软件可靠性的基本概念2.1.1 软件可靠性的定义2.1.2 软件可靠性的度量2.1.3 软件可靠性工程2.2 软件测试与可靠性2.2.1 软件测试2.2.1.1 软件测试方法2.2.1.2 软件测试技术2.2.1.3 软件测试模型2.2.2 软件可靠性评价技术2.2.3 软件可靠性模型2.2.3.1 软件可靠性模型的概念2.2.3.2 建模原理2.2.3.3 建模的一般过程2.3 软件
2、测试与可靠性评价的关系2.4 小结第 3 章 传统的软件可靠性测试方法3.1 软件可靠性测试方法的概念3.1.1 软件可靠性测试的提出3.1.2 软件可靠性测试的定义3.1.3 软件可靠性测试的过程3.2 两种主要的软件可靠性测试方法3.2.1 基于使用模型的统计测试方法3.2.1.1 统计测试原理3.2.1.2 使用模型的构造3.2.1.3 测试用例的生成3.2.1.4 测试的充分性以及可靠性度量3.2.2 基于运行剖面的可靠性测试方法1 绪论1.1 课题背景二十世纪七十年代以来,计算机系统被越来越广泛地用来监视和控制与人类生活相关的一些物理过程。这些计算机系统监视其外部物理过程的变化,并根
3、据变化产生控制指令,引导物理过程按照正确的方式运转。典型的应用包括飞行器和航天器的控制系统、汽车电子系统、工业过程控制系统、电站控制系统、危重病人的生命维持系统、通信系统以及目前正在大规模兴起的消费类电子产品。在这种情况下,对计算机系统的质量和可靠性的要求也越来越高,这是因为这些系统的功能一旦失效,将引起生命、财产的重大损失以及环境可能遭到严重破坏1,从而使社会生产和经济活动陷入不可收拾的混乱状态。计算机系统的可靠性包含硬件可靠性与软件可靠性两方面的内容。由于硬件可靠性技术已有五十余年的发展历史,冗余技术、差错控制、故障自动检测、容错技术和避错技术等可靠性设计技术已经成熟,以及大规模超大规模集
4、成电路的被采用,可使整机的可靠性大体上每经六年就提高十倍。相比之下,软件可靠性的研究只有二十年左右的发展历史,加上软件生产基本上仍处于作坊式的手工制作,其提高软件可靠性的技术与管理措施还处于十分不完善的状况。而且随着计算机技术迅猛发展,软件的销售量和使用量呈几何级数增长,软件的规模也越来越大,复杂性急剧提高。例如,航天飞机的飞行软件达 50 万行源代码,F-22 战斗机更达 150 多万行源代码,软件失效已成为系统瘫痪的主要原因。根据美国国防部和 NASA 的统计,当今武器系统和航天项目中的软件可靠性比硬件系统大约低一个数量级。而且工程应用中由软件引发的、震惊科技界的故障持续不断,在某些类型的
5、设备中软件故障甚至远远超过了硬件,成为系统的主要故障源。1.2 国内外研究动态1.2.1 软件可靠性研究的发展及现状第一篇关于软件可靠性的论文是 1967 年 Hudon提出的生灭过程模型,该模型导出了故障间隔的威布尔分布。继 Hudon之后,1972 年 Jelinski等人进一步研究了软件的故障率,他们都假定有一个故障的分段常数,故障率同残留差错数成正比。以上模型中的参数估计大多采用经典统计的方法。但大量的事实表明,当观察值的分布偏离原来的假设模式时,由经典统计所得的参数估计值往往很不可靠。因此,1977 年 J.W.Tukey提出了探索数据分析方法(EDA),该方法区别于经典统计方法的主
6、要之处是:对数据作极少假定或根本不假设模型,非常不重视问题的数学结构,而强调直接研究数据本身,了解数据的特征、结构,以此出发,分析如何得到更多的信息,然后采用适合这种数据的估计。70 年代末至 80 年代初,软件可靠性的研究开始集中于对软件可靠性模型进行比较和选择。早期工作的不足之处是缺乏较好的故障数据和所需的比较准则。90 年代以来,软件可靠性研究工作进展较快,主要有:(1) 软件可靠性设计。在软件设计过程中,为了提高软件可靠性,经常采用一些专门的技术将可靠性“设计”到软件中去。提高软件可靠性的技术主要有 2类:一类是避免故障,即在开发过程中,不让缺陷和差错潜入软件的技术;另一类是容错技术,
7、其中最常用的设计技术就是恢复块技术和-版本程序设计技术。F.Belle 等人从可靠度优化、费用优化等方面考虑了软件的容错技术。在此基础上,将上述诸技术结合起来,Belle 等人提出了一致性恢复块、接受表决、自检程序设计以及考虑版本间失效相关的容错技术,但目前这些技术仍处于理论上的研电子科技大学硕士论文:软件可靠性测试与评价技术的研究与实现究,其工程上的实践尚有待于进一步探讨。(2) 软件可靠性测试。通过对软件可靠性的测试发现软件中的故障,从而不断排除故障以提高软件可靠性。传统的软件测试方法主要有面向程序的静态测试和动态测试 2 大类。1991 年,T.Downs 针对现有大多数软件可靠性模型在
8、测试阶段将软件处理成黑盒子的作法,提出对测试过程直接建模。1993 年,Whittaker 等人采用马尔可夫过程对软件的测试过程和测试用例作了研究。在 1997 年的第 19届国际软件工程会议上,美国的 P.Frank 在一个发现程序失效并修改软件而消除失效的模型中,比较了几种测试方法,所考虑的问题是,使用测试用例来发现失效或通过模拟使用并在使用过程中发现失效是不是最好的。“最好”是用在所有测试到的失效都消除以后获得的可靠性来度量的。另外,美国的 A.Podgurski等人在这次会议上维护之后的软件可靠性重新评价一文中指出:回归测试中测试用例复用与修改后软件可靠性的评价是不相容的。作者提出了一
9、种在某些普通环境下评价修改后软件可靠性的比较经济的方法。随着面向对象编程(OOP)技术的兴起,相应地发展了面向对象的软件测试技术,该技术首先由 M.J.Harrold 等人提出,其基本思想是找出服务内部和服务间的定义-引用对,围绕定义-引用对的覆盖确定测试用例。针对目前大多数 OOP 测试主要集中在类的测试上,Liu. C等人通过建立一个状态模型来获得软件的动态运行时行为,提出了一个系统级的OOP 软件测试方法。(3) 软件可靠性数据的收集。软件可靠性数据的收集是估测软件可靠性的基础,所收集的数据是否有效,是否满足模型的要求,直接影响到软件可靠性评价的准确性和可靠性。通常收集的软件可靠性数据有
10、 2 类:失效计数数据和失效间隔数据。但由于软件中一个相同的错误可能会导致许多失效,并且若干个错误之间有时存在相关性,从而会降低所收集到数据的精确度,因此收集软件可靠性数据时,首先要制订出详细的计划和标准,如人力资源、时间的分配,所收集数据的形式、记录方式、存储方式等问题。其次,应对数据作具体的分析处理后方可应用,如数据的提取、合并、相关性分析等,采用的主要技术有算法、分段拟合技术等。另外,当应用某一具体的软件可靠性模型时,可能会出现需要的是其中的一类失效数据,而收集到的却是另一类,这时需进行失效数据间的转换。目前虽已开发出了一些自动收集软件可靠性数据的支持工具,但局限性很大,因此,如何准确而
11、高效地自动收集各种软件可靠性数据,还是一项有待于进一步研究和实践的课题。(4) 软件可靠性预测。传统的软件可靠性预测模型大多通过拟合已收集到的软件失效数据来预测软件在未来时间的失效数。考虑到不同时期软件失效数据对软件可靠性预测的影响会有所不同,M.Xie 提出了一个双指数平滑软件可靠性预测模型,即对近期所观察到的软件失效数据赋予一个较大的权值,与传统的预测模型相比,该模型简单易行且准确程度高。对于软件可靠性预测中的不一致问题,Karunanithi等人在 1991 和 1992 年这两届的 IEEE 关于软件可靠性工程的国际会议上,提出了利用神经网络来解决该问题。在训练人工神经网络阶段,使用执
12、行时间作为输入,而将观察到的累积错误数作为目标输出,在训练结束时,输入一个附加的、未来的、执行时间的区间段,并考察人工神经网络对累积错误数的估计精度。HanS.Son 等人利用熵论针对软件开发阶段由于开发方法的差异而引起的软件可靠性预测问题作了定量分析。(5) 硬-软件混合系统可靠性问题。计算机系统是由硬件、软件组成的一个有机整体,硬件与软件之间相互依赖、相互作用,因此为了评价计算机系统的可靠性,必须从硬-软件综合系统的角度来认识问题。国外从 70 年代中期开始研究综合系统的可靠性问题。1983 年 ARMS 会议上开始将“综合硬/软件可靠性”作为会议专题之一。同年,还专门召开了“全系统可靠性
13、研讨会”,国外这方面的研究成果已经在航空等领域得到应用。从 80 年代中期开始,我国科学工作者也投入了这项研究及应用。几种常见的硬- 软件混合系统可靠性模型有:Costes-Landrauit-Lapie 马氏模型,Thompson模型,Sumita-Masuda 模型,Shooman模型,IBM 模型,Iyer-Tang 模型等。上述模型大多假定系统包含一个硬件子系统和一个软件子系统,所以,当任意一个子系统失效,都会导致系统失效。WelkeSR讨论了具有冗余硬件元件和多个软件版本的混合系统可靠性,建立了一个硬-软件统一模型,该模型将软件中的 G-O/NHP 模型与硬件马氏过程模型综合起来考虑
14、。通过确定软件失效的转移概率,将软件失效在硬件可靠性模型中体现出来。国内软件可靠性研究始于 80 年代初,黄锡滋等在软件可靠性建模、软件可靠性分配及软件可靠性管理等方面作了有益的探索;陈望梅等开展软件避错技术研究;姚一平等在软件可靠性建模、软件可靠性评价工具和混合硬件-软件系统可靠性等方面作了努力;刘纯生在软件容错方面作了重要工作;蔡开元在软件可靠性建模(提出模糊软件可靠性模型)、软件可靠性模型应用选择、软件可靠性测试、软件可靠性度量体系作了有益的探讨。徐仁佐、李德银、张宇虹等在软件可靠性理论方面作了研究。在工程实践方面,姚一平等曾利用自己的软件可靠性评价工具对 ACT 验证机软件可靠性给予评
15、价。蔡开元也将自己的模糊软件可靠性模型应用于 ACT验证机。徐仁佐等人利用 CLIPS 开发了软件可靠性专家系统,从而为软件可靠性模型的选择和比较提供了有力的支持。1.2.2 软件可靠性领域面临的主要问题软件可靠性的研究虽然已取得了很大的成就,但存在的问题仍很多,主要有:(1) 软件可靠性测试。软件可靠性测试是适用于软件可靠性工程中的一种测试方法,旨在有效地发现程序中影响软件可靠性的缺陷,有别于传统的测试方法。软件可靠性测试在软件可靠性工程中很重要,甚至必不可少,是正确估计软件产品的可靠性的基础。但目前在这方面的研究工作很薄弱,急需开展。(2) 软件可靠性模型问题。虽然目前已建立了数百种软件可
16、靠性模型,但均具有一定的局限性,因此,从软件可靠性模型的假设是否合理、实际应用是否简单方便、适用范围是否广泛等问题出发,如何进一步建立合理、实用的软件可靠性模型还有待于进一步研究。(3) 软件测试用例的自动生成问题。现有的软件测试用例生成方法缺乏形式化方式,因此各种软件测试工具中测试用例的自动生成工具还有待于进一步开发和完善。(4) 实时软件的可靠性评价。目前在软件可靠性评价技术的研究中,大多针对通用软件而忽视了实时软件。虽然两者在评价方法上有一部分是相同的,但实时软件的可靠性评价还有自身的特殊性,如对时间资源的管理与通用软件存在差异。(5) 高可靠性软件的可靠性评价。对某些可靠性要求极高的软
17、件,如核电站、航天飞机软件,单纯依赖软件可靠性模型进行软件可靠性评价似乎不现实,因为所需的测试时间远远超出了有实际意义的界限。那么怎样对这些软件进行可靠性评价呢?目前还缺乏有效方法。(6) 硬-软件混合系统可靠性问题。计算机系统中硬、软件故障产生的方式截然不同,故硬、软件可靠性不完全一致,同时考虑到人的可靠性,目前虽然已建立了一些硬-软件可靠性模型,但这些模型都是针对一些具体的问题提出的,其侧重点各不相同,因而模型的问题还很多。1.3 论文主要研究内容及意义本论文是在国家“十五”项目“高可信赖的嵌入式实时操作系统”和合作项目“航空燃油计算机管理系统”的支持下进行的。本文主要围绕软件可靠性测试与
18、评价技术展开,针对当前软件可靠性领域面临的主要问题,在以下几个方面做了重点研究:1 软件可靠性测试方法的研究。2 软件可靠性评价技术的研究。3 实时软件的可靠性评价技术的研究。4 软件可靠性测试用例的自动生成技术,以及自动化软件可靠性测试与评价框架的研究与实现。软件可靠性是软件质量的重要指标之一,软件业也越来越关注软件的可靠性问题。在这样的前提下,讨论软件的可靠性测试与可靠性评价技术,是十分有必要的,本文研究的意义主要有以下几点:第一,对于软件的可靠性测试方法起一定的改进作用。基于使用模型的统计测试方法的应用越来越广泛,然而使用模型的建立却缺乏成熟的方法。本文利用作为工业标准的 UML 建模语
19、言,探讨并给出了一种基于 UML 模型的统计测试方法。该方法从 UML 模型导出使用模型,并首次给出了从 UML 状态图和用例图转化为使用模型的形式化算法。本文的研究使得统计测试方法更加可行、高效。第二,提出了一种比较有效的可靠性评价方法来验证软件的可靠性。由于软件可靠性模型本身存在的诸多不足和缺陷,传统的基于可靠性增长模型的可靠性评价方法已经不适合软件的可靠性评价,尤其是高可靠性需求的软件。本文通过研究基于假设检验的可靠性评价方法,并在其基础上做出改进,提出了一种基于贝叶斯理论的可靠性评价方法。该方法克服了传统可靠性评价方法的一些弊端。第三,针对实时多任务软件的可靠性评价做了一些研究。与通用
20、软件相比,实时软件的可靠性评价有自身的特殊性。在实时多任务系统中,任务通常是一个相对独立的运行实体,具有不同的运行时间比例、故障率、重要度等,对整个系统的可靠性影响也不一样。本文提出了一种基于任务模块的实时软件可靠性评价模型,能较好地反映系统中实时软件的故障过程。第四,构建了一个软件可靠性测试与评价的辅助工具平台(SATRETools),并将上述理论研究应用到该平台框架的设计中。SATRETools 是一个集成化的测试系统,集成了软件的可视化建模、可靠性测试用例自动生成与管理、测试进程的执行和跟踪、以及可靠性评价等功能。针对传统的软件测评工具功能单一、自动化程度不高等缺陷,SATRETools
21、 努力提供一个完整、自动化的可靠性测评环境。2 软件可靠性测评相关理论研究2.1 软件可靠性的基本概念2.1.1 软件可靠性的定义1983 年,美国 IEEE 计算机学会软件工程技术委员会对软件可靠性的定义如下:1在规定的条件下,在规定的时间内,软件不引起系统失效的概率,该概率是系统输入和系统使用的函数,也是软件中存在的错误的函数;系统输入将确定是否会遇到已存在的错误(如果错误存在的话)。2在规定的时间周期内,在所述条件下程序执行所要求的功能的能力。软件可靠性定义中提到的“规定的条件”和“规定的时间”,在工程中有重要的意义,需要进一步解释。软件测试和运行中有三种时间度量。第一种是日历时间,日历
22、时间是指日常生活中使用的日、周、月、年等计时单元;第二种是时钟时间,时钟时间是指从程序运行开始,到运行结束所用的时、分、秒,其中包括等待时间和其他辅助时间,但是不包括计算机停机占用的时间;第三种是执行时间,执行时间是指计算机在执行程序时,实际占用的中心处理器(CPU)的时间,所以又称为 CPU 时间。定义中所指的“条件”,是指环境条件。环境条件包括了与程序存储、运行有关的计算机及其操作系统。例如计算机的型号、字长、内存容量、外存介质的数量及容量、输入和输出设备的数量、通信网络、操作系统和数据管理系统、编译程序及其他支持软件。这些因素显然对程序的运行有重要的影响。但是这些因素在使用中一般没有变化
23、。定义中的环境条件还包括软件的输入分布。程序在启动运行时,需要给变量赋值,即给程序提供输入数据。输入数据可能是由外部设备输入,也可能早已存储于计算机内存等待读取。2.1.2 软件可靠性的度量对软件产品具有可靠性程度的定量评价称为软件可靠性度量。软件可靠性度量参数(常简称软件可靠性参数)是指表示软件可靠性的一个或几个变量。软件可靠性指标是指从用户的角度对产品的可靠性参数应达到的目标值所作的规定。第 2 章软件可靠性测评相关理论研究软件可靠性很难用一个度量参数表示。对于不同的软件、不同的应用,可能使用不同的参数。和硬件可靠性度量一样,软件可靠性度量也可应用概率论和数理统计的方法、技术,因为软件的失
24、效呈现出随机性。软件可靠性度量可以分为两类:管理度量和技术度量。管理度量主要面向管理人员,为软件可靠性管理服务。管理度量仅仅用于反映是否进行某项软件可靠性活动,因此通常只取“是”或“否”两个值。比如:是否进行软件故障树分析,是否收集有关的可靠性数据等。本节主要从技术度量的角度阐述软件可靠性的度量指标,即可靠性度量。1初始故障数:测试开始时软件中故障的个数。它可通过程序容量或可靠性模型对这一度量进行估计。2剩余故障数:经测试和故障排除后,尚残留在软件(程序和文档)中的故障数。通常它是根据测试的故障数据和可靠性模型来进行估计的,这是一种较为直观的度量方式。3 可靠度一般用 R(t)度量,指在 t=
25、0 时系统正常的条件下,系统在时间区间0,t内能正常运行的概率。该参数是关于软件失效行为的概率描述,是软件可靠性的基本定义。4 失效概率 F(t)是失效时间少于或等于 t 的概率,根据其定义可知它和可靠度 R(t)之间存在如下联系:F(t)=1-R(t) 公式(1-1)5 失效强度 f(t):失效强度是失效概率的密度函数,如果 F(t)是可微分的,失效强度 f(t)是 F(t)关于时间的一阶导数,即:f(t)=dF(t)/dt=-dR(t)/d(t) 公式(1-2)8 平均失效间隔时间 MTBF:指 2 次相邻失效时间间隔的均值。当软件从时刻 T1 工作到时刻 T2,若发生了 n次失效,则:M
26、TBF=(T1- T2)/(n+1 公式(1-6)2.1.3 软件可靠性工程至今尚无国际公认的关于软件可靠性工程的定义。根据我国可靠性工程界关于硬件可靠性工程的定义,本文认为,软件可靠性工程(Softwarereliabilityengineering)是为了达到软件产品的可靠性要求而进行的一系列软件工程活动。其内涵涉及以下4方面活动和有关技术:1 软件可靠性分析:进行软件的可靠性需求分析、指标分配、故障数分析、失效模式和影响分析以及软件开发过程中有关软件可靠性的特性分析等;2软件可靠性设计和实现:进行防错设计、容错设计、纠错设计、故障恢复设计和软件可靠性增长等;3软件可靠性测量、测试和评价:
27、在软件生存周期各阶段进行有关软件可靠性的设计、制造和管理方面的属性测量,进行软件可靠性测试、软件可靠性预计、软件可靠性估计和软件可靠性验证等;4 软件可靠性管理:确定影响软件可靠性的因素,指定必要的设计和实现准则,以及对软件开发各阶段软件可靠性相关过程和产品的要求。依据上面3中所述有关测量数据和分析结果控制与改进开发过程,进行风险管理(不仅考虑安全性等技术风险,而且考虑进度和经费方面的风险),改进费用效益关系,改进开发过程,对采购或重用的软件进行可靠性管理等。实施软件可靠性工程要解决三个问题,即软件可靠性指标的确定与分配、软件可靠性要求的实现和软件可靠性的验证。2.2 软件测试与可靠性2.2.
28、1 软件测试软件测试是保证软件正确性和提高软件软件可靠性的最基本和最重要的手段,也是工业界使用的主流技术。下面本文将对软件测试用到的主要方法、技术和测试模型做一个简要的介绍。2.2.1.1 软件测试方法软件测试方法有许多,不同的测试方法往往有不同的出发点、不同的思路以及不同的手段。本节主要介绍两种最基本的测试方法:黑盒测试和白盒测试。1 黑盒测试(Black-box Testing)又称功能测试,数据驱动测试(Data DrivingTesting)或基于规格说明(Specification-based Testing)的测试。在进行黑盒测试时,仅把软件当作一个黑盒,只需知道程序输出和输入之间
29、的关系或者程序的功能。因此,黑盒测试是从用户的观点出发的测试。它是从软件需求出发,根据软件需求规格说明设计测试用例,并根据测试用例的要求运行被测程序的测试方法。它较少关心程序内部的实现过程,侧重于程序的执行结果,将被测程序看成是不可见的黑盒子,因此被称为黑盒测试。黑盒测试着重于验证软件功能和性能的正确性,其典型测试项目包括功能测试、性能测试、边界测试、强度测试等。2 白盒测试(White-box Testing)又称结构测试(Structure Testing),逻辑驱动测试(Logical Driving Testing) 或基于程序的测试(Program-based Testing)。采用
30、这一测试方法,测试者必须看到被测的源程序,分析程序的内部结构,并根据其内部构造设计测试用例。白盒测试是一种按照程序内部的逻辑结构和编码结构设计并执行测试用例的测试方法。采用这种测试方法,测试者需要掌握被测程序的内部结构。白盒测试通常根据覆盖准则设计测试用例,使程序中的每个语句、每个条件分支、每个控制路径都在程序测试中受到检验。白盒测试需要运行程序,并能在运行过程中跟踪程序的执行路径。这两类测试方法是从完全不同的起点出发,并且是两个完全对立的出发点,可以说反映了事物的两个极端。两类方法各有侧重,在测试的实践中都是有效的和实用的。我们不能指望其中的一个能够完全代替另一个。在进行单元测试时大都采用白
31、盒测试,而在功能测试或系统测试中一般采用黑盒测试。表2-1给出了黑盒测试和白盒测试两类测试方法的对比。2.2.1.2 软件测试技术目前在软件测试中广泛使用的关键技术有:(1)基于规范的测试技术在该类测试中,除了早已熟悉的边界值分析、等价类划分等方法外,还有决策表、有限自动机、形式化规范等方法。决策表用来表示条件(输入)和行为(输出)之间的逻辑关系,从条件和行为的所有可能组合中系统地选取测试用例,可用因果图来表示这样的关系。有限自动机用来对测试系统进行建模,并采用相关的技术,选取测试用例覆盖其中的状态及其转换。形式化规范是用形式化语言给出规范(例如准确地定义语法和语义),进而实现自动地由规范生成
32、测试用例,同时提供预示输出(oracleoutput),用以检验测试结果。(2)基于代码的测试技术在该类测试中,主要包括参考模型建立、控制流测试和数据流测试。主要用图形的形式来表示程序的控制结构,其中的结点和边对应程序中的元素,结点表示语句或语句的顺序流,边表示结点之间的控制转换;控制流测试旨在覆盖程序中的所有语句可以用决策/条件覆盖等准则来度量覆盖率;数据流测试中,使用控制流程图作为注释来解释如何定义和使用程序变量,沿着流程图的不同流向看出同一个变量的值的变化,可以用一个三元组(d,u,V)来表示,其中V 是变量,d 是定义V 的结点,u是使用V的结点,这样,就可以看出三者之间的关系。(3)
33、基于故障的测试技术在该类测试中,主要包括错误猜测、故障植入、修改测试三种,其中错误猜测是由测试人员根据给定的程序,依据自身经验和以前类似项目的记录大致猜测最有可能的故障;故障植入是目前非常通用的测试方法,通过人工地将故障植入程序并对其后的结果进行监控,找出程序中隐藏的缺陷;修改测试是指对程序稍作修改,即作一些语法上的修改(区别于原始版本),让所有的测试用例在原始版本和修改后的版本上运行,如果测试用例能够分清程序与修改后程序之间的差别,就将后者删去。大量实践表明:修改测试可以找出程序中的语法故障,有的甚至是很复杂的故障。当然,在具体应用时,修改的程度要根据实际需要而定。(4)基于使用的测试技术可
34、以使用模拟仿真技术重新生成产品实际操作的环境,即通过列举程序可能的输入状态和它们发生的概率来建立测试模型,生成的测试模型是关于如何使用系统的一种定量特征描述。目前在软件可靠性工程测试技术里已经大量使用该技术。2.2.1.3 软件测试模型随着面向对象开发技术的广泛应用和软件测试自动化的要求,基于模型的软件测试逐渐得到重视。基于模型的软件测试属于基于规范的软件测试范畴,其特点是:在产生测试用例和进行测试结果评价时,都是根据被测试应用程序的模型及其派生模型(一般称为测试模型)进行的。基于模型的测试最初应用于硬件测试,广泛用于电信交换系统测试,目前在软件测试中得到了一定应用,并在学术界和工业界得到了越
35、来越多的重视。软件测试中使用的典型模型有:有限状态机、UML 模型和马尔可夫链等模型。1 有限状态机:基于有限状态机的测试模型假设软件在某个时刻总处于某个状态,并且当前状态决定了软件可能的输入,有限状态机模型特别适用于把测试数据表达为输入序列的测试方法,并可以利用图的遍历算法自动产生输入序列。有限状态机可以用状态迁移图或状态迁移矩阵表示,可以根据状态覆盖或迁移覆盖产生测试用例。有限状态机模型有成熟的理论基础,并且可以利用形式语言和自动机理论来设计、操纵和分析,特别适合描述反应式软件系统,是最常用的软件描述和软件测试的模型。Beizer 等详细讨论了基于状态机的软件测试,基于有限状态机模型的测试
36、研究已经取得一定研究成果6,7,8,但是复杂软件往往要用很复杂的状态机表示,构造状态机模型的工作量比较大,因此自动构造软件的有限状态机模型非常关键。2 UML 模型:作为事实上的面向对象建模标准语言,统一建模语言(UML)在面向对象开发过程中得到了广泛应用,出现了大量商品化的支持工具,如Rational Rose,基于UML模型的测试也得到了广泛关注。基于UML 模型的测试研究主要集中于 UML 的状态图(statechart),还很少利用其他图(如部署图、组件图)的模型信息。状态图是有限状态机的扩展,强调了对复杂实时系统进行建模,提供了层次状态机的框架,即一个单独状态可以扩展为更低级别的状态
37、机,并提供了并发机制的描述9,因此 UML使用状态图作对单个类的行为建模。文研究了基于状态机的测试充分性准则,文 11研究了基于状态图的软件测试。3 马尔可夫链:是一种以统计理论为基础的统计模型,可以描述软件的使用,在软件统计测试中得到了广泛应用。马尔可夫链实际上是一种迁移具有概率特征的有限状态机,不仅可以根据状态间迁移概率自动产生测试用例,还可以分析测试结果,对软件性能指标和可靠性指标等进行度量。另外,马尔可夫链模型适用于对多种软件进行统计测试,并可以通过仿真得到状态和迁移覆盖的平均期望时间,有利于在开发早期对大规模软件系统进行测试时间和费用的规划。马尔可夫链是统计测试的基本模型,在净室软件
38、工程中得到了深入研究,在微软、Raytheon及美国联邦航空署(FAA)都得到了成功应用。马尔可夫链可以用随机迁移矩阵或者带迁移概率的状态迁移图表示。基于马尔可夫链的测试充分性准则一般要求测试过程中对马尔可夫链迁移的覆盖与实际使用相同。4 文法模型:可以描述程序的语法。由于不同的文法等价于不同的状态机,因此也可以视为状态机模型的变体。有关基于文法的测试可见文16,这方面研究工作相对较少。2.2.2 软件可靠性评价技术随着人们对软件可靠性工程研究的深入,软件可靠性评价成为了一项不可缺少的重要的研究内容。因为离开了准确的评价方法,可靠性保证措施的有效性难以判断。目前在软件可靠性评价技术中,受到关注
39、的主要有两种评价方法:1基于软件可靠性测试的验证方法软件可靠性验证方法是为了验证在给定的统计置信度下,软件当前的可靠性水平是否满足用户的要求而进行的测试,即用户在接收软件时,确定它是否满足测评相关理论研究软件规格说明书中规定的可靠性指标。该种方法一般是在软件验收阶段进行的,在软件需求方参与的情况下实施。其主要过程是根据现场测试(注意测试中不再进行故障剔除)的故障情况,利用某种或某些软件供需双方都认可的可靠性验收模型(比如 Nelson模型)进行可靠性的定量评价,以判断该软件是否达到了其需求说明书中约定的可靠度。2基于软件可靠性建模的方法这一方法又称为软件可靠性增长建模,是当前软件可靠性建模的主
40、要内容。该方法主要用于软件的开发阶段,其故障情况也要依赖于测试,与第一种方法不同的是在进行测试的同时修改故障,并通过对所收集到的故障行为进行建模分析,从而估计软件可靠性的实际水平,指导开发人员进行下一步的工作。测试与缺陷的排除联系在一起,一般安排在开发过程的系统测试阶段执行,将测试所确定的失效提交给开发者进行分析和修改,建立软件的一个新的版本,再进行下一次测试。在这种“测试排错新版本”的迭代过程中,由于在软件测试阶段被发现的软件错误不断被剔除,软件可靠性呈增长趋势,因此称为软件可靠性增长建模。软件可靠性模型将在 2.2.3 节重点阐述。2.2.3 软件可靠性模型软件可靠性模型是软件可靠性定量分
41、析技术的基础。以软件可靠性模型为支撑的软件可靠性评价技术,在当前软件开发过程中具有重要的作用。本节将主要阐述软件可靠性模型的相关理论。2.2.3.1 软件可靠性模型的概念软件可靠性工程中使用的模型有两大类型。第一类是可靠性结构模型。可靠性结构模型是指用于反映系统结构逻辑关系的数学方程。借助这类模型,在掌握软件单元可靠性特征的基础上,可以对系统的可靠性特征及其发展变化规律做出评价。软件可靠性结构模型包括串联系统模型、并联系统模型,以及硬软件复合系统模型等。软件可靠性结构模型是软件系统可靠性分析的重要工具,既可以用于软件系统的可靠性综合,也可用于软件系统的可靠性分解,本文第四章研究的基于任务模块的
42、实时软件可靠性评价模型便属于这类模型。第二类模型是可靠性预计模型。可靠性预计模型本质上是一些描述软件失效与软件错误的关系,描述软件失效与运行剖面的关系的数学方程。借助这类模型,可以对软件的可靠性特征做出定量的预计或评价。例如,可以预计开发过程中的可靠性增长,预计或评价软件在预定工作时间的可靠度,预计软件在任意时刻发。生的失效数的平均值、软件在规定的时间间隔内发生失效次数的平均值、软件在生任意时刻的失效率、软件失效时间间隔的概率分布和软件预期的交付时间等。评价和预计是两个有区别又有联系的概念。评价是指对软件现有的可靠性水平做出评价。预计是指对软件未来的可靠性特征进行预测。预测未来的前提是认识现状
43、,所以二者难以截然分开。必须指出,在使用数学模型进行预计时,蕴含的假定是,事物发展规律在未来的一段时间内保持不变。对于短期预测这个假设是合理的。但是,随着预测期的延长,其近似性减弱。用可靠性模型进行预计时,为了得到较准确的结果,如果发现软件的失效规律有明显改变,应该对参数加以修正或重新收集失效数据,重新确定模型参数。一般所说的软件可靠性模型均是指的软件可靠性预计模型。在本文中,若不作特别说明,软件可靠性模型均是指软件可靠性预计模型。2.2.3.2 建模原理软件可靠性建模的目的是:根据与软件可靠性有关的数据,以统计方法给出软件可靠性的估计值或预测值。软件可靠性模型说明了失效过程对影响它的主要因素
44、的通用依赖形式:错误引入、错误消除、操作环境。2.2.3.3 建模的一般过程软件可靠性建模是试图以数学模型来模拟软件的可靠性行为,并对这一可靠性行为给出一种或多种定量的估计或预测。建模过程通常由以下几个部分组成:1 模型假设:在软件可靠性建模时都要作出某些假设,其主要原因是:1)目前人们对软件可靠性行为中的某些特征还无法确知,或者某些特征本来就具有不确定性。比如每个故障具有相同的发生率?故障的发生是否独立?2)为了数学上处理的方便。比如,假设每个故障是否有相同的发生率;软件的初始故障数为一固定的常数等。事实上,现有的很多模型,其差别仅在于假设的不同,而建模的原理是相同的。2 确定度量方式:在直
45、接的、间接的、甚至辅助的各种度量中,根据需要,选择其中一种或多种度量来估计软件的可靠性。比如,故障强度、平均无故障时间等。3 建立数学模型:将已经选择的可靠性度量,表示为软件产品的某些特性的函数。比如,用 x1 , x2 , ,xn 表示软件的某些特性,建立起: (t)=f (x1 , x2 , ,xn) MTTF=g (x1 , x2 , ,xn) 4 进行参数估计:对于某些通过模型无法直接获得的度量或参数,则需要使用某种参数估计方法来确定它们的值。目前,参数估计的主要方法有:最大似然估计、最小二乘法、贝叶斯估计、置信区间或置信水平。采用哪一种估计方法要视具体的模型和测试所收集的数据而定。5
46、 确定数据输入域:绝大多数模型都要通过收集故障数据来确定模型中的未知参数。而故障数据的收集是以软件运行(模拟运行或实际运行)为前提的。因此,需要确定数据输入域。视具体情况,数据输入域 FD 可以是一个连续的数据范围 FD=? (di) | DmindiDmax,也可以是一些离散的点 FD=d1 , d2 , ,dn。2.3 软件测试与可靠性评价的关系软件测试是“为了发现故障而执行程序的过程”18,其根本目的是以尽可能少的时间和人力发现并改正软件中潜在的各种故障及缺陷。因此,软件测试与软件可靠性评价有着密切的关系。一方面,软件测试是软件可靠性评价的基础,软件可靠性模型利用软件测试所提供的有关软件
47、系统的故障数据,估算软件的可靠性,对软件将来的故障行为进行预测,以协助开发人员监督软件开发过程,辅助软件过程管理,如过程评价、风险分析、项目估计与决策等。因此,软件测试是保证软件质量,提高软件可靠性的主要手段。没有充分的测试工作,就不可能对软件的可靠性进行有效的评价。另一方面,软件可靠性评价又可以为软件测试服务。只有当经过可靠性评价后得到的可靠性定量指标达到预定的要求时,对软件进行的测试工作才是比较充分的测试。如果度量指标尚未达到预定要求,说明软件中还存在着较多的故障,需要继续对软件进行测试。也就是说,可以用可靠性度量指标来衡量软件测试工作的充分性。实际上,测试工作一直对准软件中隐含的各种故障,所有的测试方法和手段都是以找出软件中隐含的故障为目的。软件中隐藏的故障数目,直接决定软件的可靠性。如果不能将软件中隐含的故障及时排除,一旦暴露出来就会给使用者和维护者带来不同程度的严重后果,势必软件的可靠性差。所以,软件测试必须在软件投入生产运行之前进行,以尽可能多地发现软件中的故障,提高软件可靠性。2.4 小结软件可靠性是最重要的软件特性,通常用它来衡量在规定的条件和时间内,软件完成规定功能的能力。本章首先介绍了软件可靠性的基本概念,然后针对软件测试和软件可靠性评价的相关技术进行了重点研究。软件测试是提高和保证软件可靠性的最基本和最重