软件测试理论和工具
摘 要
随着计算机技术的发展,软件产品的复杂程度越来越高,而软件测试是保障软件质量的重要手段,它贯穿于整个软件的生命周期,其工作量约占项目开发总工作量的40%左右。本文从学习软件测试的目的、意义、原则和相关概念入手,了解了软件测试的对象及软件测试的基本方法;详细学习了软件测试的过程,知道了测试步骤中的单元测试、集成测试、确认测试和系统测试方法的用途;了解了制定成功的测试计划的必要性;查阅了一些软件测试工具的使用情况,并且介绍了软件工具SQA Suite的功能及使用特点。
【关键字】软件测试,方法,过程,测试工具
目 录目 录 1
前 言 2
一.软件测试的目的、意义和原则 2
二.软件测试的对象及方法 4
1.软件测试的对象 4
2.软件测试测基本方法 5
三.软件测试的基本过程 6
1.单元测试 6
2.综合测试 6
(1)自顶向下集成 7
(2)自顶向上集成 7
3.确认测试 8
4.系统测试 9
四.制定成功的测试计划 9
五.软件测试支持工具 10
辣.结束语 12
致谢(省略) 12
参考文献: 12
前 言随着计算机技术的发展,计算机已应用到人们生活的每一个角落,而广泛的应用也是计算机软件的复杂度越来越高,功能越来越强。那么,如何来确保软件的质量并保证软件的可靠性呢?因为软件产品是复杂的、知识高度密集的逻辑产品,其中不可能没有错误。就像其他产品要进行质量检验一样,软件测试就是保障软件质量的重要手段。
软件测试贯穿了软件的整个生命周期,其投入量是巨大的,通常其工作量、成本占软件开发总工作量、总成本的40%以上,而且具有很高的技术难度。
一.软件测试的目的、意义和原则 1.软件测试的目的
软件测试的目的有三个,第一是确认软件的质量,一方面是确认软件做了用户所期望的事情,另一方面是确认软件以正确的方式来做了这个事情。
第二是提供信息,比如给开发人员或程序经理提供反馈信息,为风险评估准备信息。
第三软件策测试不仅是在测试软件产品的本身,而且还包括软件开发的过程。如果一个软件产品开发完成之后发现了很多问题,这说明此软件开发过程和可能是有缺陷的。因此软件测试的第三个目的是保证整个软件开发过程是高质量的。
2.软件测试的意义
软件质量是由几个方面来衡量的:
(1)在正确的时间用正确的方法把一个工作做正确。
(2)符合一些应用标准的要求,比如满足不同国家的用户不同的操作习惯和要求,项目工程中的可文护性、可测试性等要求。
(3)质量本身就是软件达到了最开始所设定的要求,而代码的优美或精巧的技巧并不代表软件的高质量。
(4)质量也代表着它符合客户的需要。
软件测试这个行业中,最重要的一件事就是从客户需求出发,从客户的角度去看产品,使用过程中会遇到什么样的问题。只有这些问题都解决了,软件产品的质量才可以说是去了。
测试人员在软件开发过程中的任务:
(1)寻找Bug;
(2)避免软件开发过程中的缺陷;
(3)衡量软件品质;
(4)关注用户的需求。
最终的目标是:确保软件的质量。
3.软件测试的原则
软件测试从不同的角度出发会派生出两种不同的测试原则,从用户的角度出发,就是希望通过软件测试能充分暴露软件中存在的问题和缺陷,从而考虑是否可以接受该产品;从开发者的角度出发,就是希望测试能表明软件产品不存在错误,已经正确的实现了用户的需求,确立人们对软件质量的信心。
为了达到上述的原则,那么需要注意一下几点:
(1)应当把“尽早和不断地测试”作为开发者的座右铭。
(2)程序员应避免检查自己的程序,测试工作应该由独立的专业软件测试机构来完成。
(3)设计测试用例时应该考虑到合法的输入和不合法的输入以及各种边界条件,特殊情况要制造极端状态和意外状态,比如网络异常中断、电源断电等情况。
(4)一定要注意测试中的错误集中发生现象,这和程序员的编程水平和习惯有很大的关系。
(5)对测试错误结果一定要有一个确认过程,一般由A测试出来的错误,一定要由B来确认,严重的错误可以召开评审会进行讨论和分析。
(6)制定严格的测试计划,并把测试时间安排的尽量宽松,不要希望在极短的时间内完成一个高水平的测试。
(7)回归测试关联性一定要引起充分的注意,修改一个错误而引起更多的错误这种现象并不少见。
(8)妥善保存一切测试过程文档的意义是不言而喻的,测试重要性往往要靠测试文档。
二.软件测试的对象及方法1.软件测试的对象软件测试并不等于程序测试。软件测试应该贯穿整个软件定义与开发的时间。因此需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应该是软件测试的对象。
在对需求理解与表达的正确性、设计与表达的正确性、实现的正确性以及运行的正确性的验证中,任何一个环节发生了问题都可能在软件测试中表现出来。
2.软件测试测基本方法软件测试方法一般分为静态测试和动态测试。静态测试是指被测程序不在机器上运行,采用人工检测和计算机辅助静态分析的手段对程序进行检测。而动态测试是指通过运行程序发现错误。一般意义上的测试大多是指动态测试,为使测试发现更多错误,需要运用一些有效的方法。测试任何产品,一般有两种方法:一是测试产品的功能,而是测试产品内部结构及处理过程。对软件产品进行动态测试时,也用这两种方法,分别称为百合测试法和黑盒测试法。
(1)黑盒测试
黑盒测试也称功能测试或数据驱动测试,它是已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看做一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定能够正常使用,程序是否能适当地接受输入数据进而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。黑盒测试方法主要有等价类划分,边值分析、因果图、错误推测等,主要用于软件确认测试。“黑盒”法主要着眼于程序外部结构,不考虑内部逻辑结构,针对软件界面和软件功能进行测试。“黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。
(2)白盒测试
白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都能按预定要求正确工作,而不顾它的功能。白盒测试的主要方法有逻辑驱动、基本路径测试。“白盒”法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿路径的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序中违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出现的错误。第三,穷举路径测试可能发现不了一些与数据相关的错误。
三.软件测试的基本过程软件测试过程一般按四个步骤进行,即单元测试、集成策测试、确认测试和系统测试。
1.单元测试单元测试的对象是软件设计的最小单位模块。单元测试的依据是详细描述,单元测试应对模块内所有重要的控制路径设计测试用例,以便发现模块内部的错误。单元测试多采用白盒测试技术,系统内多个模块可以并行地进行测试。
单元测试任务包括:1模块接口测试;2模块局部数据结构测试;3模块边界条件测试;4模块中所有独立执行通路测试;5模块的各条错误处理通路测试。
单元测试是针对某个模块,而模块通常并不是一个独立的程序,自己不能运行,要靠其他模块调用或驱动,所以单元测试要模拟环境。即在单元测试中,用一些辅助模块去模拟与被测模块相联系的其他模块,为被测模块设计和搭建驱动模块和桩模块。其中,驱动模块相当于被测模块的主程序,它接受测试数据,并传给被测模块,输出实际结果。桩模块用于代替被测模块调用的其他模块,其作用是做少量的数据操作,是一个模拟子程序,不必将子模块的所有功能带入。
驱动模块和桩模块是测试使用的软件,而不是软件产品的组成部分,但它需要一定的开发费用。若驱动模块和装模块比较简单,实际开销相对低些。遗憾的是,仅用简单的驱动模块和桩模块不能完成某些模块的测试任务,这些模块的单元测试只能采用下面讨论的综合测试方法。
2.综合测试时常有这样的情况发生,每个模块都能单独工作,但这些模块集成在一起之后却不能正常工作。主要原因是模块相互调用时接口会引入许多新问题。例如,数据经过接口可能丢失;一个模块对另一模块可能造成不应有的影响;几个子功能组合起来不能实现住功能;误差不断积累达到不可接受的程度;全局数据结构出现错误,等等。综合测试是组装软件的系统测试技术,按设计要求把通过单元测试的各个模块组装在一起之后,进行综合测试以便发现与接口有关的各种错误。
综合测试所涉及的内容包括:软件单元的接口测试、全局数据结构测试、边界条件和非法输入的测试等。综合测试时将模块组装成程序通常采用两种方式:增量方式组装与非增量方式组装。增量式集成方法,程序一段一段地扩展,测试的范围一步一步地增大,错误易于定位和纠正,界面的测试亦可做到完全彻底。下面讨论两种增量式集成方法。
(1)自顶向下集成 将模块按系统程序结构,从主控模块开始,沿控制层次自顶向下逐个把模块连接起来,这种方式能较早地验证主要的控制和判断点。
自顶向下综合测试的具体步骤如下
①以主控模块作为测试驱动模块,把对主控模块进行单元测试时引入的所有桩模块用实际模块代替;
②依据一定的组装次序,每次用一个真模块替换下一个桩模块;
③每集成一个模块立即测试一遍;
④做完每组测试后再用一个真模块替换下一个桩模块;
⑤为避免引入新错误,需不断地进行回归测试(即全部或部分地重复已做过的测试)。
(2)自顶向上集成自顶向上测试是从“原子”模块(即软件结构最底层的模块)开始组装测试,因测试到较高层模块时,所需的下层模块功能均已具备,所以不再需要桩模块。
自顶向上综合测试的步骤分为:
①把低层模块组织成实现某个子功能的模块群(cluster);
②开发一个测试驱动模块,控制测试数据的输入和测试结果的输出;
③对每个模块群进行测试;
④删除测试使用的驱动模块,用较高层模块把模块群组织成完成更大功能的新模块群;
⑤从第一步开始循环执行上述各步骤,甚至整个程序构造完毕。
自顶向上集成方法不用桩模块,测试用例的设计亦相对简单,但缺点是程序最后一个模块加入时才具有整体形象。它与自顶向下测试方法优缺点正好相反。因此,在测试软件系统时,应根据软件的特点和工程的进度,选用适当的测试策略,有时混合使用两种策略更为有效,上层模块用自顶向下的方法,下层模块用自顶向上的方法。
此外,在综合测试中尤其要注意关键模块,所谓关键模块一般都具有下述一个或多个特征:
①对应几条需求;
②具有高层控制功能;
③复杂、易出错;
④有特殊的性能要求。
关键模块应尽早测试,并反复进行回归测试。
3.确认测试确认测试的任务是检查软件能否按合同要求进行工作,即是否满足软件需求说明书中的确认标准。
确认测试的实施首先运用黑盒测试方法,对软件的有效性进行测试,即验证被测软件是否满足需求规格说明确认的标准。然后进行配置复审,复审的目的在于保证软件配置齐全、分类有序,并且包括软件文护所必需的细节。
事实上,软件开发人员不可能完全预见用户实际使用程序的情况。例如,用户可能错误的理解命令,或提供一些奇怪的数据组合,亦可能对设计者自认明了的输出信息迷惑不解,等等。因此,软件是否真正满足最终用户的需求,应由用户进行一系列“验收测试”。验收测试既可以是非正式的测试,也可以是有计划、有系统的测试。有时,验收测试长达数周甚至数月,不断暴露错误,导致开发延期。一个软件产品,可能拥有众多用户,不可能由每个用户验收,此时多采用成为α、β测试的过程,以期发现那些似乎只有最终用户才能发现的问题。
α测试是指软件开发公司组织内部人员模拟各类用户对即将面市的软件产品(成为α版本)进行测试,试图发现错误并修正。Α测试关键在于尽可能逼真地模拟实际运行环境和用户对软件产品的操作并尽最大努力涵盖所有可能的用户操作方式。经过α测试调整的软件产品称为β版本。紧随其后的β测试是指软件开发公司组织各方面的典型用户在日常工作中实际使用β版本,并要求用户报告异常情况、提出批评意见。然后软件开发公司再对β版本进行改错和完善。
4.系统测试软件作为整个基于计算机的一个元素,与计算机硬件、外设、支持软件、数据和人员等其他系统元素组合在一起,在实际运行环境下进行的一系列测试成为系统测试。所以,系统测试必须在目标环境下运行,其功能在于评估系统环境下软件的性能,发现和捕捉软件中潜在的错误。
系统测试的具体实施一般包括:功能测试、性能测试、操作测试、配置测试、外部接口测试、安全性测试等。
四.制定成功的测试计划软件测试是一个极为复杂的过程。一个规范化的软件测试过程通常须包括以下基本的测试活动:
(1)拟定软件测试计划;
(2)编制软件测试大纲;
(3)设计和生成测试用例;
(4)实施测试;
(5)生成软件问题报告。
对整个测试过程进行有效的管理。实际上,软件测试过程与整个软件开发过程基本上是平行进行的。测试计划早在需求分析阶段即应开始制定,其他相关工作,包括测试大纲的制定、测试数据的生成、测试工具的选择和开发等也应在测试阶段之前进行。充分的准备工作可以有效地克服测试的盲目性,缩短测试周期,提高测试效率,并且起到测试文档与开发文档互查的作用。
软件测试大纲是软件测试的依据。它明确详尽地规定了在测试中针对系统的每一项功能或特性所必须完成的基本测试项目和测试完成的标准。无论是自动测试还是手动测试,都必须满足测试大纲的要求。
一般而言,测试用例是指为实施一次测试而向被测系统提供的输入数据、操作或各种环境设置。测试用例控制着软件测试的执行过程,它是对测试大纲中每个测试项目的进一步实例化。已有许多著名的论著总结了设计测试用例的各种规划和策略。从工程实践的角度讲有几条基本准则:
(1)测试用例的代表性:能够代表各种合理和不合理的、合法和非法的、边界和越界的以及极限的输入数据、操作和环境设置等。
(2)测试结果的可判断性:即测试执行结果的正确性是可判断的或可评估的。
(3)测试结果的可再现性:即对同样的测试用例,系统的执行结果应当是相同的。
“工欲善其事,必先利其器”。专业的测试必须以一个好的测试计划作为基础。尽管测试的每一个步骤都是独立的,但是必定要有一个起到框架结构作用的测试计划。测试计划应作为测试的起始步骤和重要环节。一个测试计划应包括:产品基本情况调研、测试需求说明、测试策略和记录、测试资源配置、计划表、问题跟踪报告、测试计划的评审、结果等等。
五.软件测试支持工具一些受软件开发人员欢迎的软件测试工具为软件测试提供了强有力的支持。比如美国Rational公司的著名的套装软件SQA。
SQA Suite 直接支持对客户/服务器应用软件的测试,它的一个重要特点是可以自动驱动被测程序的运行。SQA可以自动记录和重放程序执行过程,从而实现了对测试进行“复查”的自动化。
由于测试是一个需要反复进行的过程,常常要数十次甚至数百次的重复。因此,这一特性大大的提高了软件“再测试”(Re-Test)和“回归测试”(Regression)的自动化程度,把测试人员从繁杂的、重复性的手工测试中解脱出来,从而显著的提高软件测试效率。除了这个最基本的自动录放功能外,它还提供了一系列的辅助支持功能,比如:
(1)被录制的程序执行过程可以被自动转换成具有良好可读性的高级语言程序,从而使这个测试驱动程序可以由测试人员根据测试需要进行必要的修改,甚至完全用手方式编制。
(2)自动记录和分析比较测试的执行结果。不论是简单的正文方式的输出结果,还是人意的图表、声音、动画、图形用户界面(GUI)中的任一构件,都可以根据测试人员的指定被自动记录在测试结果库中,并可对两次测试的结果自动的进行比较,指出其差异部分。此项功能无疑对“自动查找错误”很有帮助。
(3)调节和设定事件的发生时间和速度。
(4)基本的测试库管理功能。
此外,SQA还支持软件测试人员进行以下工作:
(1)制定测试计划和测试大纲,并将这些文档按照自然的树状结构分层的管理起来,并据此控制和驱动整个测试过程。
(2)不仅能够自动记录各类测试结果,而且可对其进行修改,从而使得测试人员可以在程序运行结果尚有许多错误的情况下,通过对所记录下的结果做适当修正来获得理想的“期望结果”,为测试结果的自动比较奠定基础。
(3)测试问题报告的记录与管理。
总之,SQA Suite 提供了一个比较完整的测试平台,可以支持软件测试的各种基本活动,包括测试计划与测试大纲的制定、回归测试的自动化、测试结果的分析比较、软件问题报告的生成与自动分发和控制等。对于许多应用软件开发无疑是个有力的测试支持工具。
辣.结束语通过对软件测试理论和工具的学习,我学到了很多的知识。首先,我知道了软件测试对于一个好的软件的重要性,知道了软件测试的目的与意义所在。其次,我知道了软件测试的一些方法、步骤,还有软件测试所针对的对象和一些软件测试工具的运用,知道了对一个软件进行测试不仅仅要掌握工具的使用,还必须要针对被测试软件的特征和性能去制定有效的测试方案,才能确保软件投入使用。软件测试的发展对我们来说也是很重要的,因为在计算机不断更新的时代,我们所使用的软件也在不断地更新,有些过时的软件测试方法工具或许就无法完美的测试新软件,那么我们就需要在一些老的软件测试方式的基础上不断地去研究,更新完善软件测试的方法及工具。当我完成这篇论文后发现软件测试日后的发展是非常重要的,也学到了很多以往课堂上无法学到的知识。让我的眼界也随之开阔了很多。
致谢(省略)参考文献:[1]王扬.软件测试.第一版.北京:人民出版社,2003.
[2]李纪舟.软件测评师教程.第一版.上海:上海人民出版社,2004.
[3]张文平.ASP.NET 入门经典.第一版.北京:清华大学出版社,2005.