1、软件测试与软件可靠性【摘要】:随着科学技术的飞速发展,软件的功能越来越强大,软件的复杂性也越来越高,软件应用的日益广泛及重要性的不断增强,人们对软件质量的要求也越来越高。可靠性作为衡量软件质量的重要特性,如何提高软件的可靠性已成为人们关注和研究的焦点。在实际的项目应用中,软件测试成为提高交付软件可靠性的最后一个武器,软件可靠性问题从来就是是软件测试中的重要难题之一。为了保证一个软件系统的质量,有必要针对软件的测试与可靠性评估方法进行专门地研究。【关键词】 软件测试,可靠性,软件质量保障前言随着科学技术的飞速发展以及高新技术的广泛应用,使得现代工业产品中软件成分所占比例越来越高,规模越来越大。软
2、件不但能执行过去由专门的硬件执行的功能,而且能执行一些专门硬件几乎无法执行的功能。软件已不再是硬件的附属物,而已成为与硬件相并列的独立的技术状态管理项目。然而,多年来由于受多种因素的影响和限制,软件的质量水平并没有引起人们的足够重视,尤其是软件的开发、设计阶段,没有经过严格的需求分析和评审;在软件的调试、验收阶段,缺乏科学的测试手段,并未对软件进行必要、充分的测试,再加上由于程序语言的复杂性以及被测程序的多样性,导致在软件运行中暴露出大量的问题。因此,必须下大力气抓好软件产品测试工作,切实提高软件的质量和可靠性。现代工业产品无不依赖于计算机及其软件。但实际上往往将软件作为硬件的一个附属部分,而
3、不是作为一个产品对待,软件没有指标,没有列入型号技术配套表,缺少与硬件相同的资源保证。许多软件的开发和生产仍处于“自设计、自编码、自测验”状态,软件质量低、风险大、保障难。例如:某型产品测出的故障800个,其中:软件故障600个,占75之多;硬件故障127个,占16;其他故障73个,占9。可见软件问题的严重性,因此必须加强软件开发和生产的管理,建立和完善软件测试的手段和方法,严格按照软件工程化管理的要求进行软件开发和管理,提高软件产品的质量和可靠性。一.软件测试1.1 软件测试的定义软件测试(Software testing)是软件生存期(Software life cycle)中的一个重要阶
4、段,是软件质量保证的关键步骤,是保证软件质量, 提高软件可靠性的最主要活动之一。通俗地讲,软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码进行最终复审的活动软件测试的目的是为了检验软件系统是否满足需求。 从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程” 。或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果) ,并利用这些测试用例去运行程序,以发现程序错误或缺陷。 1.2 软件测试的目的、原理和内容一个好的测试用例在于能发现迄今为止未发现的错误。因
5、此, 测试的目的是以最少的人力、物力和时间投入, 尽可能多的找出软件中潜在的各种错误和缺陷以证明软件的功能和性能与需求相符合。具体可表述为:1.通过软件测试, 检查软件模块是否与软件设计要求相一致, 保证软件开发的正确性;2.通过软件测试, 检查软件用户界面是否友好,软件是否易用;3.通过软件测试, 暴露软件开发过程中遗留在程序中的错误, 以便开发人员予于排除, 提高软件的可靠性;4.通过软件测试, 检查所提供的文件与软件系统的一致性。5.通过软件测试收集可靠性评估数据。软件测试原则为: 一是所有的测试都应追溯到用户需求, 这是因为软件测试的目标在于揭示错误,而最严重的错误是那些无法满足用户需
6、求的错误,二是应尽早制定测试计划, 由于软件的复杂性和抽象性, 使得开发的每个环节都可能发生错误, 所以要树立把软件测试贯穿到软件开发的各个阶段的观念, 坚持软件开发的阶段评审, 以期尽早发现错误,提高软件质量。三是应从“小规模”开始, 逐步转向“大规模”, 对重点程序模块要进行重点测试, 以提高测试的投资效益。四是应该由独立的第三方进行测试。软件测试包括如下内容:软件单元测试: 验证单元满足功能、性能和接口等要求;软件部件测试: 验证组装构成和组装结果;软件配置项测试: 检验软件模块之间的接口关系并构成符合要求的软件配置项;系统测试: 软件配置项加入导系统上进行测试, 检验软件是否满足规定要
7、求。二软件可靠性及其评估可靠性(reliability)是产品在规定的条件下和规定的时间内完成规定功能的能力,它的概率度量称为可靠度。软件可靠性(software reliability)是软件系统的固有特性之一,它表明了一个软件系统按照用户的要求和设计的目标,执行其功能的正确程度。软件可靠性与软件缺陷有关,也与系统输入和系统使用有关。理论上说,可靠的软件系统应该是正确、完整、一致和健壮的。但是实际上任何软件都不可能达到百分之百的正确,而且也无法精确度量。一般情况下,只能通过对软件系统进行测试来度量其可靠性。 软件可靠性是软件系统在规定的时间内及规定的环境条件下,完成规定功能的能力,它的度量主
8、要包含了以下三个要素: 1.规定的时间 软件可靠性只是体现在其运行阶段,所以将“运行时间”作为“规定的时间”的度量。“运行时间”包括软件系统运行后工作与挂起(开启但空闲)的累计时间。由于软件运行的环境与程序路径选取的随机性,软件的失效为随机事件,所以运行时间属于随机变量。 2.规定的环境条件 环境条件指软件的运行环境。它涉及软件系统运行时所需的各种支持要素,如支持硬件、操作系统、其它支持软件、输入数据格式和范围以及操作规程等。不同的环境条件下软件的可靠性是不同的。具体地说,规定的环境条件主要是描述软件系统运行时计算机的配置情况以及对输入数据的要求,并假定其它一切因素都是理想的。3.规定的功能
9、软件可靠性还与规定的任务和功能有关。由于要完成的任务不同,软件的运行剖面会有所区别,则调用的子模块就不同(即程序路径选择不同) ,其可靠性也就可能不同。所以要准确度量软件系统的可靠性必须首先明确它的任务和功能。 软件的评估理论是进行评估的理论依据,评估方法是评估理论的实际应用和处理测试数据的方法。对于评估指标体系中的不同指标,应该根据测试数据的不同,选取相应的评估理论和方法。软件评估(Software assessment)的实质是对软件质量的度量与评价。 软件可靠性评估(Software reliability assessment)的完整含义是:根据软件系统可靠性结构(单元与系统间可靠性关
10、系) 、寿命类型和各单元的可靠性试验信息,利用概率统计方法,评估出系统的可靠性特征量。 随着计算机软件编制的规范化,必然要将软件可靠性考核纳入科学、规范的轨道。具体表现在:1、制定软件可靠性量化指标,使软件考核有明确的标准;2、建立完善的软件测试、可靠性信息收集系统,使在计算机软件开发中通过科学的软件测试不断减少缺陷;3、通过研究软件可靠性考核方法,制定相应的软件考核规程、标准;4、开发软件可靠性评估软件,使软件鉴定更加方便。软件可靠性评估永远都是一种期望,是建立在经验数据上的一种期望推导,只要应用到的模型有状态分析模型;执行路径分析模型:失效时间间隔模型;故障计数模型;输入域分类模型三重视软
11、件测试,提高软件可靠性软件开发是一个自顶向下, 逐步细化的过程, 而测试则是自底向上, 逐步集成的过程。低一级别的测试为高一级别的测试准备条件, 但这并不排除并行测试, 单元测试可对每一个程序模块进行测试, 以消除模块内部在逻辑上和功能上的错误与缺陷, 同时也可部分的验证详细设计说明书的正确性。而集成测试将用于检测和排除子系统及系统在结构上的错误。同时, 可对设计说明书的正确性加以验证。在此基础上, 对照软件需求进行正确测试, 以检测需求分析说明书的正确性。最后从系统全体出发, 运行系统, 进行系统测试, 看是否满足要求。对于软件的可靠性而言,在测试过程中发现问题越早,对于软件的可靠性影响将会
12、越小。从软件工程的观点看,预防程序问题要比改正问题重要得多。从某种意义上来讲,软件测试是提高软件可靠性的最直接的方法,从方法上来讲分为以下:1实施软件工程, 提高软件的透明度大型的智能设备系统, 其软件是一项复杂的知识密集型的产品, 目检和互检的软件开发方式, 已经越来越不能满足软件开发的需要了。必须采取软件工程的方法开发软件, 使软件的生产工业化, 即必须实现软件的开发、运行、维护和引退整个过程的规范化。而且, 这个过程应该是可控的, 可重复的以及可预测的。只有做到设计、生产、检验互相制约, 增加软件的透明度, 才能从根本上有效提高软件的质量和可靠性水平。2进行充分的检验, 采取纠正措施软件
13、测试一般包括制订测试方案、制订测试计划、实施测试、编写测试报告等四项工作。对软件进行测试必须是有计划、有组织的, 要明确任务、时间、人员、设备、经费、方法和工具等, 并做好测试纪录备案, 以保证对被测试软件进行全面有效的考核。对测试中发现的所有问题, 必须按要求进行纪录, 测试完成后由开发人员分析问题, 并制定软件纠正措施,按规定进行纠错或进行其他处理。3加强人员培训, 建立软件测试检验队伍由于软件测试在软件开发中占有重要的地位,因此对软件的测试人员提出了很高的要求, 他们必须具备较强的专业知识、计算机知识、还应具有软件检测经验和能力, 因此, 必须尽早培养软件的检测人员, 在坚持和完善自检的
14、基础上, 必须组织有效的“互检”, 并积极创造条件组建软件专检队伍和机构,实行专检, 积极贯彻软件“自检、互检、专检”的制度。同时软件测试人员要与设计人员一起参与软件开发的各个阶段, 比如: 在软件需求分析阶段要完成软件测试计划设计, 在测试阶段要对软件分级逐次测试( 包括单元、模块、组装、系统测试) , 最后还要写出测试报告, 对软件质量进行分析评估, 给出结论和意见。4提高检验员的专业水平, 加强软件产品监督和控制随着高新技术的广泛应用, 产品的科技含量越来越高, 这就要求检验员必须具备很高的专业素质,才能适应未来的验收工作。在软件测试方面, 我们的人才相对缺乏, 所以要加快培养、提高检验
15、员的专业水平, 造就一批软件方面的高水平人才队伍, 只有这样才能对产品的软件质量进行有效的监督的控制。由于硬件设备的飞速发展,导致软件行业被迫快速跟上,软件行业的很多技术都不规范,不成熟,加之,客户需求往往在时间限制上有很强的要求,导致任务很紧,对于测试的关注度就再次减少,我们要大力研究软件开发过程的度量技术, 以便加强对软件开发过程的控制, 从而提高软件的质量和可靠性, 减少风险, 缩短研究周期, 降低研制费用, 切实抓好装备软件的可靠性工作, 积极提高软件质量和可靠性的方法, 制定相应的验收法规和制度, 逐步开展软件的可靠性试验工作, 把装备软件的质量和可靠性提高到一个新水平。以下几个问题
16、值得注意:1应当把设备中的软件同硬件一样看作为产品, 要有指标、有必要的资源投入;2贯彻软件工程、实现软件工程化, 这是提高软.件质量、减少风险、节省费用的基础和必要件;3应当遵循软件开发过程的规律, 强化过程监.督;4必须强化软件测试, 这是保证软件质量, 提高软件可靠性的最主要活动之一。四软件测试在提高软件可靠性中的应用测试主要依据是被试系统的研制任务书和技术规格书,是对软件整体功能和性能的综合测试与评估。测试原理是软件测试活动的理论基础,测试方法是测试原理的实际应用和获得测试数据的手段,实践证明,尽管人们在开发软件的过程中使用了许多保证软件质量的方法和技术,但开发出的软件中还会隐藏许多错
17、误和缺陷。这对于规模大、复杂性高的软件更是如此。所以,严格的软件测试对于保证软件质量具有重要作用。完整的测试过程包括测试前的检查、设计测试用例、测试实施、可靠性数据收集和编写测试报告 5 个步骤,下面逐一对这 5 个步骤进行说明。1. 测试前的检查,制订测试方案应用软件的可靠性测试前有必要检查软件需求与研制任务书是否一致,检查所交付程序和数据以及相应的软件支持环境是否符合要求,检查文档与程序的一致性,检查软件研制过程中形成的文档是否齐全、文档的准确性和完整性以及是否通过了有关评审。分析功能需求,定义失效等级确定概率分布,整理概率分布的信息 将这些信息编码送入数据库等都是该阶段应该明确到文档的任
18、务。 2.设计测试用例 设计测试用例就是针对特定功能或组合功能设计测试方案,并编写成文档。测试用例的选择既要有一般情况,也应有极限情况以及最大和最小的边界值情况。因为测试的目的是暴露应用软件中隐藏的缺陷,所以在设计选取测试用例和数据时要考虑那些易于发现缺陷的测试用例和数据,结合复杂的运行环境,在所有可能的输入条件和输出条件中确定测试数据,来检查应用软件是否都能产生正确的输出。 设计与选取测试用例集的第一步是对测试用例进行描述,这种描述是否权威、完整、可理解与规范化,则决定了该测试用例能否或多大程度上可以被操作人员、软件研制人员和试验鉴定人员所理解接受。所以,规范化的测试用例描述在软件测试与评估
19、中具有重要的作用。 3.测试实施 做好上述准备工作后,就可以实施测试了。研制方交付的任何软件文档中与可靠性质量特性有关的部分,包括产品说明书、用户文档、程序以及数据都应当按照需求说明和质量需求进行测试。在项目合同、需求说明书和用户文档中规定的所有配置情况下,程序和数据都必须进行测试。 在测试中,可以考虑进行“强化输入” ,即输入比正常输入更恶劣(合理程度的恶劣)的输入。如果软件在强化输入下可靠,只能说明比正规输入下可靠得多。 为了获得更多的可靠性数据,应该采用多台计算机同时运行软件,以增加累计运行时间。 4.可靠性数据收集 软件可靠性数据是可靠性评估的基础。应该建立软件错误报告、分析与纠正措施
20、系统。按照相关标准的要求,制定和实施软件错误报告和可靠性数据收集、保存、分析和处理的规程,完整、准确地记录软件测试阶段的软件错误报告和收集可靠性数据。 用时间定义的软件可靠性数据可以分为四类:1、失效时间数据,记录发生一次失效所累积经历的时间;2、失效间隔时间数据,记录本次失效与上一次失效间的间隔时间;3、分组数据,记录某个时间区内发生了多少次失效;4、分组时间内的累积失效数,记录某个区间内的累积失效数。这四类数据可以互相转化。测试活动结束后必须编写软件可靠性测试报告 ,对测试项及测试结果在测试报告中加以总结归纳。,我们有必要投入一定的人力、物力,针对我们的实际需要,有目的地对各类应用软件进行
21、软件可靠性测试,从实践中逐步积累经验。同时需要软件开发方和使用方共同合作,进行软件可靠性测试方法的研究和有关支持工具的开发,促进我国软件可靠性水平的提高。五当前应用软件存在问题分析由于软件行业拔苗助长是的疯狂发展,以及软件开发所存在的固有困难,现在所交付的产品在可靠性方面要么就是花费巨大的人力,财力以及时间来保证的,要么就是在可靠性发面基本没有保证的。测试是需要花费时间和财力的,所以许多企业在这方面不愿意多投入,除非人命关天的项目,从测试和软件可靠性的角度来看,导致如此问题的主要原因在于:1 软件开发透明度差由于软件生产单位大多采用“手工作坊”式的开发方式, 由开发者自己设计、自己编程、自己测
22、试、自己包维护, 即所谓的“三自一包”。未能加强对软件开发过程的管理, 使得软件出现故障后只能由开发者自己去维护。2 没有严格软件质量监控系统由于未对软件的更改标识、更改控制、更改检查等进行严格的控制, 造成软件的管理混乱, 使得产品的软件错误较多。3 未能对软件进行充分的检测软件的测试软件、测试工具缺乏, 标准、规范和制度不健全。目前绝大多数的软件检测都与硬件一同进行, 在软件的验收中, 所谓的检测也是对预先制定的几个用例进行检测, 而不是按照软件开发的各个阶段进行单元测试、部件测试、配置项测试、系统测试等, 起不到软件测试的应有作用, 因而造成软件的缺陷多、故障多。4 尚未建立完善的检验体
23、系到目前为止, 多数企业对软件没有像硬件那样建立严格的“三检制度”, 软件检验基本上是由软件开发者自己完成的, 而实践证明仅仅依靠自检是不能保证软件质量的。因此交付使用的产品软件质量问题较多, 在使用中发现有时一个误操作都有可能引起“死机”的现象。5 对软件测试尚未找到理想的方法和手段在当前的型号研制中, 应用软件需求定义阶段缺少用户的有效参与, 承制方在软件开发的各阶段以测试工作主要是开发人员自测和互测相结合的方式, 一些隐含的错误和缺陷被遗留到软件产品交付投入运行阶段。【参考文献】1蔡永强. 重视软件测试,提高软件质量. 2J.R.Brown and M.Lipow. TESTING FO
24、R SOFTWARE RELIABILITY. Redondo Beach ,California 902783关欣,衣晓,仇善丽. 软件可靠性综述.4Bucharest,Romania. SOFTWARE RELIABILITY FROM THE FUNCTIONAL TESTING PERSPECTIVE.5Michael Naixin Li,James M.Bieman,Rick Karcich. Software Reliability Growth With Test Coverage.6徐仁佐. 软件可靠性工程. 清华大学出版社 20077 Musa J D. Operational profiles in software reliabilit y engineeringJ . IEEE Software ,1993 ,10 (2) :14 - 32.8宫云战,高文玲 . 软件测试与软件可靠性之间的关系9http:/