作者: 徐大圣 李晨迅 梅华威
摘 要:开发过程中一次性开发成功或者无错误发生的几率为零,因此在软件的开发过程中需要不断的完善,而这个不断完善修改的过程就是软件测试的过程。软件测试也代表了了设计、编码的最终复审。着重论述了目前软件工程中普遍存在的一些测试问题,并对其产生的原因进行了详细的分析。介绍了软件测试的本质,同时对目前流行的测试方法进行了研究,提出了不同类型的软件最佳的测试方案。
关键词:软件可靠性;软件质量;软件测试;测试用例
1 概述
信息技术的飞速发展,使软件产品应用到社会的各个领域,软件产品的质量自然成为人们共同关注的焦点。软件开发商为了占有市场,必须把产品质量作为企业的重要目标之一,以免在激烈的竞争中被淘汰。用户为了保证自己业务的顺利完成,总是希望选用优质的软件。质量不佳的软件产品不仅会使开发商的维护费用和用户的使用成本大幅增加,还可能产生其他的责任风险,在一些关键应用,如民航订票系统、银行结算系统、证券交易系统等中使用质量有问题的软件,还可能造成灾难性的后果。
软件危机曾经是软件界甚至整个计算机界最热门的话题,为了解决这个危机,软件从业人员、专家和学者做出了大量的努力。现在人们已经逐步认识到所谓的软件危机实际上仅是一种状况,那就是软件中有错误,正是这些错误导致了软件开发在成本、进度和质量上的失控。有错是软件的属性,而且是无法改变的。因为软件是由人来完成的,所有由人做的工作都不会是完美无缺的。问题在于应该如何去避免错误的产生和消除已经产生的错误,使程序中的错误密度达到尽可能低的程度。
软件工程学出现后,软件开发被视为一项工程,以工程化的方法来进行规划和管理软件的开发。事实上,不论采用什么技术和什么方法,软件中出现错误总是难免的。采用新的语言、先进的开发方式、完善的开发过程,可以减少错误的引入,但是不可能完全杜绝软件中的错误,这些引入的错误需要测试来找出。测试是软件开发的重要部分。统计表明,在典型的软件开发项目中,软件测试工作量往往占软件开发总工作量的40%以上。而在软件开发的总成本中用在测试上的开销要占30%到50%。如果把维护阶段也考虑在内,讨论整个软件生存时期时,测试的成本比例也许会有所降低,但实际上维护工作相当于二次开发,仍至多次开发,其中必定还包含有许多测试工作。系统的问题越早发现,改正成本越低,破坏性越小,所以,在系统发布前要尽量多地把系统问题找出来,其手段就是有计划、有组织地进行充分的测试。
软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一组测试数据,并利用这些测试数据运行程序,以发现程序错误的过程。根据测试数据设计方法,软件测试可分为结构测试和功能测试。在结构测试过程中,测试者对程序的语句、分支和逻辑路径进行各种覆盖测试,可以在不同点检查程序的状态,以确定实际状态与预期状态是否一致。软件测试的目的是发现错误,而不是确认其正确性,而对已进行的测试过程的程度进行评估。
2 测试方法
2.1 软件测试实质
软件测试是一项逻辑性强、且极具条理的工作,也是具有风险性的行为。由于软件的输入量、输出结果、软件实现途径都很多,而且软件产品说明书没有客观的标准,导致从不同的角度看,软件缺陷的标准不同,因而无法对软件实施完全测试,这样,就无法通过软件测试显示隐藏的软件缺陷,只能尽量查找软件缺陷,找到的软件缺陷越多,说明软件本身的缺陷就越多,况且还有一些是未发现、不能断定的缺陷,这就是软件测试的局限性。软件测试与软件开发过程的关系如图1所示。
图1 软件测试与软件开发的关系
所有的软件测试都有2个关键的问题组成:建立能测试应用程序的环境,并在该环境中测试软件能力。测试员必须理解和重新生成软件所在的复杂软件环境,并运用其能力确保正常的测试。
2.2 软件测试手段
从测试是否针对系统的内部结构和具体实现算法的角度来看,可分为白盒测试和黑盒测试。
2.2.1 黑盒测试
黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能情况下,通过测试来检测每个功能是否都能正常使用。在测试时,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息并且保持外部信息(如:数据库或文件)的完整性。黑盒法着眼于程序外部结构,不考虑内部逻辑结构,只针对软件界面和软件功能进行测试,它主要用于软件验收测试。黑盒法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。测试情况实际上有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。
2.2.2 白盒测试
白盒测试也称结构测试或逻辑驱动测试,它是在已知产品内部工作过程情况下,通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都能按预定要求正确工作,而不顾它的功能。白盒测试的主要方法有逻辑驱动、基路测试等,白盒法是穷举路径测试,主要用于软件验证。
(1)软件有产品说明书时,对产品说明书实施测试和审查:由于软件产品说明书属于文档,因此对产品说明书的测试是黑盒测试。在实施测试时要弄清所开发软件的客户,并熟悉现有的标准和规范,基于同类软件测试的经验进行测试。除了这些,如果时间和条件允许,应该对产品说明书进行审查,按照相关的标准,看产品说明书是否符合要求。这都是通常的一些做法,当然还可以采用其他软件检测方法。
(2)由于当前软件开发有时不是很正规,在没有产品说明书时应使用试探性测试:首先要分步骤地弄清软件特性,记录软件运行情况,详细描述软件功能,然后运用静态和动态黑盒测试两种方式来测试软件,发现软件缺陷,在这种情况下,可以将一些非法、错误和垃圾数据作为输入数据,以检验软件的输出结果。测试时可采用反复测试、边界值测试和不合条件等方法。
(3)对有些软件实施状态测试:首先是熟悉软件的逻辑流程,可能的话,建立状态转换图,尽量清晰地描绘软件可能的独立状态,从一种状态到另一种状态所允许的输入和条件,以及进入或退出某种状态时的设置条件和输出结果;如果要测试的软件规模较大、复杂性较高,那么建立状态转换图将是非常艰巨的任务,这时减少要测试的状态及状态的数量,但是必须保证每种状态都必须测试一次,也可以在状态测试时选择那些不常用的分支,因为这是最容易被忽略的。在此基础上,测试所有的错误状态及返回值,测试随机状态转换。
(4)在前述测试的基础上,对有些测试实施失败状态测试:具体在实施时,指的是几个时间对某一资源竞争使用,比如:
①两个不同的程序同时保持或打开同一个文档。
②共享同一台外围设备。
③当软件处于读取或者修改状态时按键或者单击鼠标。
④同时关闭或者启动同一个软件的多个实例。
⑤使用不同的程序同时访问同一个数据库。
类似这样的竞争条件还有很多,不一一举例。
(5)在实际测试时还常用反复、压迫和重负测试,实施这些测试的目的是考验软件在恶劣条件下是否能正常运行和退出,从而验证软件的性能。反复测试指的是不断地执行同样的操作;压迫测试是使用软件在不够理想的条件下运行,从而观察软件对外部资源的要求和依赖程度,借此来测试软件的性能;重负测试是指尽量提供条件任其发挥,让软件处理尽可能大的数据文件,即最大限度地发掘软件的能力,使之不堪重负,大多数情况下,用时间作为参数实施重负测试,看其在重负情况下能否正常运行。实际测试时,常将三种测试方法结合起来使用。
(6)测试软件的另一种有效方法就是进行正式审查,其中包括以下几个方面:确定问题、制定审查规则、准备工作以及编写报告,进行审查的主要方法就是组织熟悉该类软件的人员逐一检查代码,其中重要的软件还需要按能力成熟度(cmm)中的要求进行同行评审。
(7)在实际测试中经常采用一种称之为动态白盒测试的方法,其意义是指利用查看代码功能和实现方式得到的信息来确定哪些要测试,哪些不需要测试,以及如何开展测试。其中不仅是查看代码,还包括直接测试和控制软件。包括以下几个部分:
①直接测试底层功能、过程、子程序和库。
②根据软件运行的实际情况不断地调整测试用例。
③对软件中的部分变量和状态信息进行访问,确定测试与预期结果是否相符,并强制软件以正常测试难以实现的方式运行。在具体实施时应分阶段地进行测试,即遵循单元测试、集成测试、配置项测试和系统测试的步骤。目前,灰盒测试逐渐为大家认同,灰盒测试综合了白盒测试和黑盒测试的优点,模糊了两者的界限,在做法上仍然把软件当成黑盒来测试,但是通过简单地查看(不像白盒那样进行完整地查看)软件内部工作机制作为补充。现在的网页制作就很适合灰盒测试。
3 结束语
软件测试的目的不是为了仅仅找出错误,而是通过它发现错误、分析错误,找到错误的分布特征和规律,从而帮助项目管理人员发现当前所采用的软件开发过程的缺陷,以便改进;同时也能够通过设计有针对性的检测方法,改善软件测试的有效性。即使测试没有发现任何错误,也是十分有价值的,因为完整的测试不仅可以给软件质量进行一个正确的评价,而且是提高软件质量的重要方法之一。
参考文献
[1]史济民.软件工程原理方法与应用[m].北京:高等教育出版社,2001.
[2]张海藩.软件工程导论[m].北京:清华大学出版社,1997.
本文链接:http://www.qk112.com/lwfw/jsjlw/jisuanjiyingyong/244281.html