一、软件测试的概念
关于软件测试有不同的定义,具体如下所述。
1.软件测试正向思维
软件测试正向思维的出发点是使自己确信产品是能够正常工作的,主要代表人物是 Bill Hetzel博士。他于1972年在美国的北卡罗来纳大学组织了历史上第一次关于软件测试的正式会议,并于1973年首先给出软件测试的定义:“测试就是建立一种信心,确信程序能够按既定的设想运行”。1983年,Bill Hetzel博士又将软件测试的定义修改为:“评价一个程序或系统的特性或能力,并确定它是否达到期望的结果,软件测试就是以此为目的的任何行为”。在定义中,“设想”和“期望的结果”就是现在提及的用户需求或者功能设计,其核心思想为:测试就是验证软件是工作的,即软件的功能是按照预先的设计执行的;测试针对系统的所有功能,以正向思维逐个验证其正确性。
测试的目的是确保产品能够工作。测试可以简单抽象地描述为以下过程:在设计规定的环境下运行软件的功能,将其结果与用户需求或功能设计相比较,如果相符则测试通过,如果不相符则视为存在缺陷。这一过程的终极目标是将软件的所有功能在设计规定的所有环境内全部运行通过。这类测试方法以需求和设计为本,因此有利于界定测试工作的范畴,更利于部署测试的侧重点,加强针对性。
这一点对于大型软件的测试,尤其是在时间和人力资源有限的情况下显得格外重要。
但是,软件测试正向思维会导致以下想法:为了看到产品运行,可以将测试工作推迟。测试始终晚于开发,被看作软件生命周期中编码之后的一项活动,这与贯穿于整个软件开发生命周期的测试理念不合。因此,可以认为Hetzel的说法是一种狭义的软件测试定义。
2.软件测试逆向思维
逆向思维的代表人物是 Glenford Myers,他认为测试不应该着眼于验证软件能正常工作,相反应该首先认定软件是有错误的,然后用逆向思维去发现尽可能多的缺陷。他同时认为,将验证软件是否可以正常工作作为测试目的,非常不利于测试人员发现软件中的缺陷。1979年,Glenford Myers给出对软件测试的定义:“软件测试是为发现错误而执行一个程序或者系统的过程”。同时,Myers还提出了三个重要观点,具体如下所述。
(1)测试是为了证明程序有错误,而不是证明程序无错误。
(2)一个好的测试用例能发现以前未发现的错误。
(3)一个成功的测试是发现了以前未发现的错误的测试。
Myers认为,测试必须发现缺陷,否则就没有价值。Myers提出“测试的目的是证伪”,推翻了过去“为表明软件正确而进行测试”的思想,为软件测试的发展提出了新的方向,软件测试的理论方法在其后也得到了长足的发展。
这个软件测试的定义强调了测试人员要不断思考开发人员的理解误区、不良习惯等。在这种思维下,软件测试的目标是发现系统中各种各样的问题,而与系统需求和设计没有必然的关联,这样往往能够更多地发现系统中存在的缺陷。
3.IEEE定义的软件测试
随着软件和IT行业的发展,软件趋向大型化、高复杂度,软件的质量越来越重要。人们的认识也在改变,从软件测试的目的是证明软件产品可以工作和尽量发现产品中的缺陷,慢慢转向测试是软件质量保证的重要手段之一,也是进行软件质量评估的基础。
这时,人们还将质量的概念融入其中,软件测试定义发生了改变:测试不单纯是一个发现缺陷的过程,它以软件质量保证为主要职能,包含软件质量评价。Bill Hetzel 在《软件测试完全指南》一书中指出:“测试是以评价一个程序或者系统的属性为目标的任何一种活动。测试是对软件质量的度量。”
1990年,ANSI/IEEE对软件测试进行了定义:软件测试是在规定条件下运行系统或构件,观察和记录结果,并对其某些方面给出评价的过程。
4.广义软件测试定义
在前面几种软件测试定义中,测试活动都只包含了运行软件系统进行测试,即执行软件的过程。但软件开发产品不仅是程序代码,还包括和软件相关的文档和数据。因此,软件测试的对象也不仅是程序代码,还应该包括软件设计开发各个阶段的工作产品,如需求文档、设计文档、用户手册等。从这个意义上讲,传统的软件测试定义(主要关注软件运行过程中对软件进行的检查和发现不一致的行为)是一个狭义的概念,实际上这只是测试的一部分,而不是测试的所有活动。
随着人们对软件工程化的重视以及软件规模的日益扩大,软件分析、设计的作用越来越突出。有资料表明,60%以上的软件缺陷不是程序错误,而是分析和设计缺陷。若把软件分析、设计上的缺陷遗留到后期,可能造成设计、编程的部分甚至全部返工,从而增加软件开发成本、延长开发周期等。同时,需求和设计阶段所产生的缺陷具有放大效应,严重影响软件质量。因此,为了更早地发现并解决问题,降低修改缺陷的代价,有必要将测试延伸到需求分析和设计阶段中,使软件测试贯穿于整个软件生命周期。目前得到提倡的是软件全生命周期测试的理念,也可称为广义软件测试,即软件测试是对软件形成过程中的所有工作产品(包括程序以及相关文档)进行的测试,而不仅是对程序运行进行的测试。
测试活动包含了测试执行之前和之后的所有的阶段活动,包括测试计划和控制、测试分析和设计、测试实现和执行、测试评估和 告、测试结束活动等。整个测试活动中除了进行动态测试外,还将进行静态测试,如静态分析、文档或代码的评审等。
广义的测试引入两个概念来覆盖测试的范畴:验证(Verification)和确认(Validation)。
验证:通过检查和提供客观证据来证实指定的需求是否满足,即输入与输出之间的比较,或者检验软件是否已正确地实现了产品规格书所定义的系统功能和特性。验证过程提供证据表明软件相关产品与所有生命周期活动的要求(如正确性、完整性、一致性、准确性等)相一致。
确认:通过检查和提供客观证据来证实特定目的的功能或应用是否已经实现。在确认时,测试人员应考虑使用的条件范围要远远大于输入时确定的范围。确认一般是由客户或代表客户的人执行,即确认所开发的软件是否满足用户真正的需求,相当于保持对软件需求定义、设计的怀疑,一切从客户出发,理解客户的需求,发现需求定义和产品设计中的问题。
这主要通过各种软件评审活动来实现。对于每个测试级别,测试人员都要检查输出是否满足具体的需求,或和这些特定级别相关的需求。这种根据原始需求检查开发结果的过程称为确认。在确认过程中,测试人员判断一个产品(或者是产品的一部分)能否完成它的任务,据此判断这个产品是否满足期望的使用要求。
二、软件测试的对象与目的
和确认不同,验证只针对开发过程的某个阶段。验证需要确保特定开发阶段的输出已经按照它的规格说明(相应开发级别的输入文档)正确而完整地实现了。这意味着验证是检查是否正确地实现了规格说明,产品是否满足规格要求,而不是检查最终的产品是否满足期望的使用需求。
根据软件的定义,软件包括程序、数据和文档,因此软件测试并不仅仅是程序测试。软件测试贯穿整个软件生命周期。在整个软件生命周期中,各个阶段有不同的测试对象,形成了不同开发阶段的不同类型的测试。需求分析、概要设计、详细设计以及程序编码等各个阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源代码,都应成为软件测试的“对象”。
测试的目的:以最少的人力、物力和时间找出软件中潜在的各种缺陷,通过修正各种缺陷提高软件质量,避免软件发布后潜在的软件缺陷造成商业风险。同时,利用测试过程中得到的测试结果和测试信息,作为后续项目开发和测试过程改进的重要依据,避免在将来的项目开发和测试中重复错误。
三、软件测试的误解
相对于软件开发而言,软件测试还不为众人所了解。很多软件开发人员,包括多数软件企业的高层管理人员,由于缺乏软件测试的知识和实践经验,对软件测试还有很多误解,这对软件测试工作极为不利,必须加以澄清。
误解一:如果发布的软件有质量问题,那是软件测试人员的原因。
软件测试是一种有效提高软件质量的手段,但即使在投入上有所保证,测试也不能百分之百地发现所有质量问题。况且,软件的质量也不是靠测试测出来的,软件开发过程中每一个环节都要有质量意识,做好检查、审查等各项工作,才能保证质量。
误解二:软件测试技术要求不高,至少比编程容易很多。
很多人认为,软件测试就是运行程序,用键盘或鼠标操作一下,然后看结果是否正确。实际上,软件测试不仅是运行或操作软件,还涉及测试环境的搭建、测试用例的设计等技术问题。当采用白盒测试技术时,需要有良好的编程能力;在编写自动化测试脚本时,也需要有良好的编程经验。一个测试人员不仅需要掌握测试技术,还需要掌握开发技术、数据库技术,以及丰富的 络知识,只有这样,在测试工作中才能得心应手。
误解三:有时间就多测一些,来不及就少测一些。
软件测试不是可有可无的,测多少、如何测也不能随心所欲。规范化的软件测试流程需要对软件项目的计划设计、时间分配、人员组成、风险分析等做到跟踪、控制与协调。
误解四:软件测试是测试人员的事,与开发人员无关。
为了减小相互的影响,一般要求开发与测试相对独立,但这只是分工的不同。开发和测试是软件项目相辅相成的两个过程,人员的交流、协作和配合是提高整体开发效率的重要因素。另外,在编码过程中也会进行单元测试、集成测试,因此整个项目的开发与测试需要整个项目组所有人员的通力配合。
误解五:软件测试是开发后期的一个阶段。
在很多软件开发生命周期的模型中,往往把测试作为整个开发过程的某一个阶段,实际上这是一个错误的认识。软件测试是保证软件质量的一种手段,缺陷的引入可能出现在开发初期,因此在可行性研究阶段就需要软件测试人员的介入,从而更加严格地对开发过程中的文档进行评审,提高软件开发过程中的产品质量。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!