您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 软件工程第六章-测试
软件工程第六章测试通常把编码和测试统称为实现。所谓编码就是把软件设计结果翻译成用某种程序设计语言书写的程序。所选用的程序设计语言的特点及编码风格将对程序的可靠性、可读性、可测试性和可维护性产生深远的影响。无论怎样强调软件测试的重要性和它对软件可靠性的影响都不过分。在软件生命周期的每个阶段都不可避免地会产生差错。在每个阶段结束之前通过严格的技术审查,尽可能早地发现并纠正差错.经验表明审查并不能发现所有差错,此外在编码过程中还不可避免地会引入新的错误。Error:人的错误Fault:人错误的结果,体现在开发和维护的产品中Failure:(系统故障)错误(fault)(内在)、故障(failure)(外在)人的错误如何产生故障?!humanerrorfaultfailurecanleadtocanleadto测试的目的就是在软件投入生产性运行之前,尽可能多地发现软件中的错误。软件测试仍然是保证软件质量的关键步骤,它是对软件规格说明、设计和编码的最后复审。软件测试在软件生命周期中横跨两个阶段。编码和测试阶段在编写出每个模块之后就对它做必要的测试(称为单元测试),模块的编写者和测试者是同一个人,编码和单元测试属于软件生命周期的同一个阶段。在这个阶段结束之后,对软件系统还应该进行各种综合测试,这是软件生命周期中的另一个独立的阶段,通常由专门的测试人员承担这项工作。大量统计资料表明,软件测试的工作量往往占软件开发总工作量的40%以上,在极端情况,测试那种关系人的生命安全的软件所花费的成本,可能相当于软件工程其他开发步骤总成本的3倍到5倍。必须高度重视软件测试工作,绝不要以为写出程序之后软件开发工作就接近完成了,实际上,大约还有同样多的开发工作量需要完成。通过测试发现错误之后还必须诊断并改正错误,这就是调试的目的。调试是测试阶段最困难的工作。在对测试结果进行收集和评价的时候,软件所达到的可靠性也开始明朗了。软件可靠性模型使用故障率数据,估计软件将来出现故障的情况并预测软件的可靠性。1、定义:测试是为了发现程序中的错误而执行程序的过程。注意:①只能尽可能查错,不能证明程序中没有错;②测试员与程序员不应是同一个人。测试基础G.Myers给出了关于测试的一些规则,这些规则也可以看作是测试的目标或定义。(1)测试是为了发现程序中的错误而执行程序的过程;(2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;(3)成功的测试是发现了至今为止尚未发现的错误的测试。软件测试的目标由于测试的目标是暴露程序中的错误,从心理学角度看,由程序的编写者自己进行测试是不恰当的。因此,在综合测试阶段通常由其他人员组成测试小组来完成测试工作。应该认识到测试决不能证明程序是正确的。即使经过了最严格的测试之后,仍然可能还有没被发现的错误潜藏在程序中。测试只能查找出程序中的错误,不能证明程序中没有错误。为了能设计出有效的测试方案,软件工程师必须深入理解并正确运用指导软件测试的基本准则。下面讲述主要的测试准则。(1)所有测试都应该能追溯到用户需求。软件测试的目标是发现错误。从用户的角度看,最严重的错误是导致程序不能满足用户需求的那些错误。软件测试准则(2)应该远在测试开始之前就制定出测试计划。实际上,一旦完成了需求模型就可以着手制定测试计划,在建立了设计模型之后就可以立即开始设计详细的测试方案。因此,在编码之前就可以对所有测试工作进行计划和设计。(3)把Pareto原理应用到软件测试中。Pareto原理说明,测试发现的错误中的80%很可能是由程序中20%的模块造成的。当然,问题是怎样找出这些可疑的模块并彻底地测试它们。(4)应该从“小规模”测试开始,并逐步进行“大规模”测试。通常,首先重点测试单个程序模块,然后把测试重点转向在集成的模块簇中寻找错误,最后在整个系统中寻找错误。(5)穷举测试是不可能的。所谓穷举测试就是把程序所有可能的执行路径都检查一遍的测试。测试只能证明程序中有错误,不能证明程序中没有错误。但是,精心地设计测试方案,有可能充分覆盖程序逻辑并使程序达到所要求的可靠性。(6)为了达到最佳的测试效果,应该由独立的第三方从事测试工作。所谓“最佳效果”是指有最大可能性发现错误的测试。开发软件的软件工程师并不是完成全部测试工作的最佳人选(通常他们主要承担模块测试工作)。黑盒测试(black-box,orclosed-boxtesting):确信对每个输入,观察到输出与期望的输入出是否匹配.——对功能测试2、测试方法白盒测试(white-box,oropen-box,clear-boxtesting):利用程序的结构进行测试.——结构测试14161616103222若程序执行需10-3秒,则对于所有合法输入的测试大约需用一万年,而且还应测试输入非法数据的情况。主要问题:穷尽测试(completetest)通常是不可能的。例:(Black-box)程序要求输入3个整型数据。若字长16位,则各种可能输入的排列组合共有(种)例:(White-box)下图所示的程序中共有5201014条可能的执行通路,显然,每条通路都执行一遍是不现实的。§1.基本概念循环20次3、测试步骤:(1)单元测试——程序设计和代码错误(bugs)(2)子系统测试——模块之间的连接(3)系统测试——需求和系统设计(4)验收测试——顾客参与(5)平行运行——新系统、老系统同时运行并比较.集成测试测试阶段的信息流:测试评价调试可靠性模型可靠性预测错误正确单元测试(白盒)主要测试以下五个方面:1、模块接口:内部检查:传输参数的数目、属性、单位、次序是否匹配;全程变量的定义是否一致;只做输入的变元有无被修改,等等。外部检查:打开、结束、关闭文件的操作;文件和属性;I\O错误处理;输出拼写,等等。2、局部数据结构:数据说明(declaration);初始化与缺省值的设置;变量名拼写;数据类型的相容性;上\下溢出及地址异常,等等。§3.单元测试3、重要的执行通路:由于穷尽测试不可能,故通常针对最常见的错误设计测试方案。较常见的错误有:计算次序问题(例:运算的优先级)不同类型混合运算(例:比较类型不同的量)初值设置错误精度问题(例:精度不够导致两变量不可能相等,而程序中等待相等条件的出现)表达式错误循环终止条件错误(例:次数差1,或陷入死循环)4、出错处理通路:预见出现错误的条件,设置处理。较常见的问题有:输出的错误信息难以理解,不能确定错误位置描述的错误与实际错误不符处理之前系统已经干预处理不正确§3.单元测试5、边界条件——单元测试中最后,也可能是最重要的任务,因为软件常在其边界失效。1、代码审查(codeinspection)代码会审以小组会的方式进行,会审小组一般由3-4人组成,包括组长1人,程序作者1人,其他程序员(或测试人员)1-2人。作者讲解程序,其他人员,捕捉程序结构、功能与编码风格等方面存在问题,发现的错误会后交由作者修改。预排:由人扮演computer,模拟执行情况。§3.单元测试优点:一次审查可发现多个错误,不必改一个测一个。单元测试的主要手段:模块不是独立的程序,不易单独测试,为了解决这个问题,可以在单元测试时为被测试模块编一些测试模块,作为它上级模块或下级模块的替身。代替上级模块的称为驱动模块,代替下级模块的称为桩模块。2、制做测试软件:Stub(存根,桩)和Driver(驱动)§2.单元测试替身模块是真实模块的简化,只需要模拟与被测模块直接有关的一部分功能,测试结束完后完成历史使命。满足被测模块需要的前提下,驱动模块和桩模块的内容应尽量简单。模块不是独立的程序,不易单独测试,为了解决这个问题,可以在单元测试时为被测试模块编一些测试模块,作为它上级模块或下级模块的替身。代替上级模块的称为驱动模块,代替下级模块的称为桩模块。§2.单元测试替身模块是真实模块的简化,只需要模拟与被测模块直接有关的一部分功能,测试结束完后完成历史使命。满足被测模块需要的前提下,驱动模块和桩模块的内容应尽量简单。2、计算机测试制做测试软件:Stub(存根,桩)和Driver(驱动)驱动X桩1桩2软件的编写,属额外开支。模块高内聚可简化这一过程。§2.单元测试模块通过单元测试后,要组装为程序,在组装中进行的测试,就称为集成测试。即使所有模块通过了单元测试,组装中仍不免出现新问题,根源在于模块接口和全局数据协调不好。例如:数据会在穿过接口时丢失;一个模块可能会对另一模块造成有害的影响;把子功能组合起来可能不产生所要求的主功能;有些单独看来可以允许的误差,组装后可能达到不能容忍的地方。集成测试(IntegrationTesting)又称为综合测试1、非渐增式测试TestA,B,C,DTestATestBTestCTestD先测试每个模块,再把模块组合程序1、非渐增式测试2、渐增式测试§4.集成测试渐增式:从一个模块开始,测一次添一个新模块,滚雪球一样越滚越大,直到把所有模块组装完毕。2、渐增式测试§4.集成测试§4.集成测试两种方式的比较:渐增式测试可以较早发现模块间的接口错误;非渐增式测试最后才组装,因此错误发现得晚。非渐增式测试中发现错误后难以诊断定位;渐增式测试中,出现的错误往往跟最新加入的模块有关。渐增式测试在不断集成的过程中使模块不断在新的条件下受到新的检测,测试更彻底。渐增式测试较非渐增式测试费时。非渐增式测试可以同时并行测试所有模块,能充分利用人力。⑴自顶向下测试第1步:测试顶端模块,用桩程序(stub)代替直接附属的下层模块§4.集成测试3、渐增式测试的几种策略MS1S2第2步:根据深度优先或宽度优先的策略,每次用一个实际模块代换一个stub。§3.集成测试第3步:在结合进一个模块的同时进行测试。MS1S2M1S3S4M2S2第4步:回归测试(regressiontesting)——全部或部分地重复以前做过的测试。⑵由底向上测试第1步:把低层模块组合成族,每族实现一个子功能。第2步:用驱动程序(Driver)协调测试数据的I\O,测试子功能族。§3.集成测试优点:在早期即对主要控制及关键的抉择进行检验。问题:Stub只是对低层模块的模拟,测试时没有重要的数据自下往上流,许多重要的测试须推迟进行,而且在早期不能充分展开人力。DM1M2第3步:去掉Driver,自下而上把子功能族合成更大的子功能族。MMMMMMMMMMMMDDDDDD§3.集成测试注意:两种策略的优、缺点刚好互补,但单用其中任一种都不实际,通常根据软件的特点将二者混用。⑶混合策略§3.集成测试TargetlayerTop-downBottom-up§5.确认测试(Acceptancetesting)任务:验收软件的有效性(功能和性能达标)。手段:黑盒测试;用户参与;主要用实际数据进行测试。内容:按合同规定审查软件配置;设计测试计划,使通过测试保证软件能满足所有功能、性能要求;文档与程序一致,具有维护阶段所必须的细节;严格按用户手册操作,以检查手册的完整性和正确性。确认测试也称为验收测试确认测试必须有用户积极参与,或者以用户为主进行。用户应该参与设计测试方案,使用用户界面输入测试数据并且分析评价测试的输出结果。为了使得用户能够积极主动地参与确认测试,特别是为了使用户能有效地使用这个系统,通常在验收之前由开发单位对用户进行培训。确认测试的范围应该仔细设计测试计划和测试过程,测试计划包括要进行的测试的种类及进度安排,测试过程规定了用来检测软件是否与需求一致的测试方案。通过测试和调试要保证软件能满足所有功能要求,能达到每个性能要求,文档资料是准确而完整的,此外,还应该保证软件能满足其他预定的要求(例如,安全性、可移植性、兼容性和可维护性等)。确认测试有下述两种可能的结果:(1)功能和性能与用户要求一致,软件是可以接受的;(2)功能和性能与用户要求有差距。在这个阶段发现的问题往往和需求分析阶段的差错有关,涉及的面通常比较广,因此解决起来也比较困难。为了制定解决确认测试过程中发现的
本文标题:软件工程第六章-测试
链接地址:https://www.777doc.com/doc-5553063 .html