您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 西安工业大学《软件工程》第七章 测试
第七章测试编码阶段结束后,开始进入测试阶段。无论采用何种开发模型开发出来的大型软件系统,由于客观系统的复杂性,人的主观认识的狭隘性,不可能对要开发的系统具有完美的认识。虽然在软件开发的每一阶段都进行了技术审查和管理复审,也不可能把设计中所有潜在的错误检查出来并进行纠正,而且在编码阶段也会引入新的错误,软件设计环节的错误,如果不进行纠正,在使用阶段可能造成的损失会很大。所以软件在交付使用之前必须进行严格的测试,通过测试找出软件在需求分析、设计和编码阶段隐藏的错误,并加以改正。由于软件产品具有逻辑复杂性,所以软件测试的工作量和工作难度不亚于软件分析和设计,据统计测试工作量占软件开发总工作量的40%~50%以上。而测试的范围存在于软件的整个生命周期,而不仅仅局限在程序编码阶段。7.1测试的基本概念和原则软件开发的前几个阶段是构建软件系统,而软件测试则尽力找出软件的失败和不足之处,表面上看设计是建设性的,测试是破坏性的。事实上这两个过程都是为了提高软件的质量。测试是保证软件质量的重要手段之一。7.1.1测试的必要性大多数人认为在进行软件开发时,认为对软件系统编码结束后,整个软件系统的开发已经基本完成,对测试的理解是把程序看一遍,如果发现了错误,记录错误然后通过调试改正错误,测试过程就结束了。在测试理论形成的早期,一些软件开发公司由于忽视软件的测试,造成了巨大的经济损失。所以测试对提高软件的质量具有很大的重要性。虽然在软件生命周期的各个阶段都有严格的技术审查和管理复审,但是经验表明,审查不能发现所有的差错;在编码过程中,程序员的编程水平对软件的影响很大,但是不管经验多丰富的程序员在编程中都会引入一些错误。如果这些错误在软件交付前没有被测试出来,投入使用后往往带来严重后果。7.1.2测试的概念⒈软件测试软件测试是对软件计划、软件设计和软件编码进行查错和纠错的活动,这个过程包括了代码执行活动和人工活动。测试的目的是找出软件开发整个周期中各个阶段的错误,分析错误的性质和位置而加以纠正。纠正的过程包括对文档和代码的修改,找错的活动称为测试,而纠错的过程称为调试。软件测试过程覆盖软件开发的整个阶段。⒉程序测试程序测试是对编码阶段出现的语法错、语义错、运行错进行查找的编码执行过程。通过查找编码错和纠正编码错来保证算法的正确实现。软件测试过程覆盖软件开发的整个阶段,程序测试则仅限于编码阶段。⒊动态测试动态测试包括白盒测试和黑盒测试。黑盒测试是根据软件的功能而设计测试用例而进行测试的过程,白盒测试是根据测试的内部结构而设计测试数据,发现程序的错误。⒋静态测试静态测试包括代码审查和静态分析。.代码审查是由有经验的程序设计人员根据软件详细设计说明书,通过阅读程序发现软件的错误和缺陷。主要检查代码和设计的一致性、可读性、代码逻辑表达的正确性和完整性、代码结构的合理性等。这种方法不需要专门的测试工具和设备,一旦发现错误就能定位错误,但是此方法具有一定的局限性。静态分析,主要对程序进行控制流分析、数据流分析、接口分析和表达式分析等。静态分析一般由计算机辅助完成,由于使用的程序设计语言不同,相应的静态分析工具也就不同。目前,具备静态分析功能的软件测试工具有很多,如针对汇编语言和C语言开发了一些静态测试分析工具。7.1.3软件测试的目的在进行测试之前,正确理解测试的目的是至关重要的。测试的目的决定了测试方案的设计。某些人认为“测试是为了表明程序是正确的”或“成功的测试是没有发现错误的测试”等等,基于这种思想对软件进行测试,会设计一些不易暴露错误的测试方案;相反,如果认为测试是为了发现软件中的错误,就会设计出昀能暴露错误的测试方案。G.Myers关于软件测试目的的观点是:(1)测试是为了发现程序中的错误而执行程序的过程;(2)好的测试方案是极有可能发现迄今尚未发现的尽可能多的错误的测试;(3)成功的测试是发现了迄今尚未发现的错误的测试。由上述可知,测试的目的是应该尽量找出软件中隐藏的错误并加以纠正,而不是通过测试证明软件没有错。所以,通过测试不是证明软件是正确的。通过测试只能从软件中找到错误,而不可能证明程序中没有错误,即使选择测试方案昀完美,软件中仍然可能隐藏着错误。从表面上看,设计是构造,而测试是破坏,但两者的目的都是开发出高质量的软件产品。明确了测试目的,从心理学的角度,由程序的编写者测试自己编写的软件是不恰当的,但综合测试阶段通常由其他人员组成测试小组完成测试工作。7.1.4测试复杂性测试任何产品一般有两种方法:黑盒测试和白盒测试。如果已经知道了产品应该具有的功能,采用黑盒测试检验产品的每个功能是否能够正常使用;如果知道产品的内部工作过程,采用白盒测试来检验产品内部动作是否按照规格说明书的规定正常运行。对于软件测试而言,黑盒测试只在程序的接口进行测试,检查程序是否完成规格说明书上规定的功能,是否能够适当地接受输入数据产生正确的输出信息,并且保持外部数据的完整性,即黑盒测试把测试对象看成一个黑盒子,完全不考虑其程序的内部结构与处理过程,该测试又称为功能测试。而白盒测试按照程序的内部逻辑结构,检验程序中的每条通路是否能够按照规格说明书上的规定正确工作,即把程序看成装在一个透明的盒子里,完全了解程序的结构和处理过程,该测试又称作结构测试。在理论上看,不论采用哪种测试,只要对每一种可能的情况都进行测试,就可以得到完全正确的程序。我们称包含所有可能的测试称为穷尽测试。而在实际中,穷尽测试是不可能做到的。使用黑盒测试时,要做到穷尽测试,必须对所有的输入数据的各种可能值的所有排列组合都进行测试。例1.一程序模块如图7.1。由三个整数型的输入数据,如果计算机字长为16位,则每个整数可能取的值有216个,三个输入数据的各种可能值的排列组p模块xyz图7.1黑盒测试复杂性例子合共有216×216×216=248≈3×1014。也就是说,大约需要把这个程序执行3×1014次才能做到“穷尽”测试。假定每执行一次程序需要一毫秒,执行这么多次大约需要1万年!不仅测试时间长得叫人不可思议,测试得出的输出数据更是多得叫人完全无法分析。然而严格地说这还不能算穷尽测试,为了保证测试能发现程序中的所有错误,不仅应该使用有效的输入数据(对这个例子来说是合法的整数),还必须使用一切可能的无效输入数据(例如,不合法的整数、实数、字符串等等)。实践表明,用无效的输入数据测试比用有效的输入数据进行测试,往往能发现更多的错误。使用白盒测试时要做到穷尽测试,要使程序中的每条可能通路至少都执行一次,严格地说每条通路都应该在每种可能的输入数据下执行一次。例2.一段程序对嵌套的IF语句循环执行20次(流程图如图7.2)。在这段程序中共有520(≈1014)条可能的执行通路,显然,即使每条通路只执行一次也是不可能的。从上面的例子可以得到这样的结论:无论采用黑盒法还是白盒法,要做到穷尽测试,在时间上和代价上都不可能,只能选择部分测试用例尽可能多地行测试,找到尽可能多的错误,也即是进行有穷测试。7.1.5测试的基本原则从上面介绍的测试目的和测试的复杂性,要求测试人员在进行程序测试时,为了达到测试的要求,应该遵循一些原则,即测试原则。(1)测试前要认定被测试的软件有错,不要认为被测试的程序是正确的;(2)要确定测试软件的预先测试结果;(3)尽量避免测试自己编写的程序;(4)测试时要考虑合理的输入和不合理的输入数据;(5)测试时应以软件需求规格说明书中的需求为标准;(6)要确定找到的新错与已找到的旧错成正比;人们在解决问题时如果在对问题的理解或者问题求解方法的描述中有一处不正确,其相关部分的处理办法也可能是错误的。IBM370系统中,47%的错误集中在4%的模块中,说明软件错误具有“局部化聚集”特征。G.Myers曾经指出:“一个或者多个模块中存在错误的概率与其中已经发现的错误个数成正比”。因此应该对已经发现错误集中的模块进行重点测试,以期找出相关的可能错误,提高测试效率。(7)所使用的测试用例应该纪录下来,以后测试时再用,以供后来的测试和维护使用。这样做的好处有二,首先是测试具有可重复性,在确认测试时对用户特别重要,而且所使用的测试用例和执行结果所得到的数据是建立系统的可靠性模型,评价软件质量的依据。其次,测试用例是系统维护测试与确认的依据,在将来的运行维护阶段,对系统进行局部修改后,必须对修改程序的有效性进行确认。7.2测试步骤在测试一个大规模的软件系统之前,测试人员应该清楚测试的整个过程以及测试的步骤。循环20次图7.2白盒测试复杂性例子7.2.1测试过程整个测试过程如图7.3。图7.3软件测试过程输入信息包括软件配置、测试配置。其中软件配置包括软件需求规格说明书、软件系统设计说明书、源程序清单,可运行代码系统,用户文档(用户技术手册、用户使用手册等)。测试配置包括软件测试计划和测试方案(测试工具+测试数据+测试功能+预期结果),测试工具是为提高测试效率而设计的支撑软件测试的软件。测试结果是执行测试方案得到的实际输出结果。可靠性模型:通过对测试软件的出错率的分析,建立模型,取得可靠的数据,指导软件的维护。输出信息包括修正软件的文档或预测的可靠性模型或纠错后可交付使用的正确软件。测试的过程是相对有限的过程,而不是无限的过程。测试结束后,对测试结果得到的数据进行分析,比较预期结果与测试执行结果。如果出现的错误较多,系统不能达到主要功能、性能指标,则软件质量与可靠性值得怀疑,就需要仔细分析并进一步测试。如果测试发现的错误较少,则应该做如下分析。①软件是可以接受的;②测试所使用的测试用例不能发现系统中可能存在的错误。通过测试,一个错误都没发现,则应该认为这样的测试是失败的测试。7.2.2测试的步骤对于一个大型的软件系统来说,在进行系统测试时,必须按照一定的步骤进行,才能在测试时发现更多的错误。测试时,首先进行单元测试,再进行组装测试,昀后进行确认测试。1.模块测试又称单元测试。在结构化软件系统中,每个模块完成一个相对独立的子功能,将每个模块作为一个独立的实体进行测试,确认模块作为一个单元能够正常运行。在该测试阶段所发现的错误通常是编码和详细设计的错误。2.系统集成测试又叫接口测试、组装测试。将经过测试的单元模块按照一定的顺序组装成系统,同时进行测试。集成测试的重点是模块间的相互通信与协调。在进行集成测试时,应该考虑的问题有以下几个方面:(1)各模块组织在一起,相互传递的数据是否正确,是否有丢失或者不匹配;(2)一个模块功能实现的副作用对其他模块产生何种影响;(3)系统的全局数据的组织是否合适,是否会发生冲突;(4)单个模块的计算误差的累积是否得到有效控制;(5)各模块组织起来是否能够实现需求分析规定的要求;(6)从昀后实现的角度看,系统需求分析本身是否完整,各功能实现是否相容和一致。当系统规模比较庞大时,进行集成测试一般分为子系统集成测试和全部系统集成测试。在系统集成测试过程中,不仅要发现设计与编码的错误,还应该验证系统是否能够实现需求分析规定的功能与性能。因此,该阶段所发现的错误既可能是设计错误,又可能是需求分析中的错误。3.确认测试又称合格测试或验收测试。该阶段将软件系统作为一个单一的实体,在用户的积极参与下进行测试。由于该阶段是用户接受软件系统的昀后步骤,同时也是软件系统交付的必需环节。测试所使用的数据集常常是实际数据。确认测试的目的是验证系统是否能够达到项目计划规定的要求。对于关系重大的软件系统,在验收以后并不立即投入正式运行,一般要有一个试运行阶段,这样做的优点是:(1)在准生产环境中运行新系统既可以进一步确认系统,又可以减少技术风险;(2)使用户熟悉系统的运行特征;(3)检验用户文挡(用户指南、用户手册、维护手册等)是否完整和正确;试运行一般分为α测试和β测试两个过程。α测试由一个用户在开发环境下模拟实际操作环境运行程序系统。α测试的目的是评价软件产品的功能、可用性、可靠性、性能和支持,尤其是系统的界面和特色。测试人员是除开发人员以外首先见到系统的用户,他们发现的问题和修正意见通常十分有价值。而开发
本文标题:西安工业大学《软件工程》第七章 测试
链接地址:https://www.777doc.com/doc-5452006 .html