软件工程第六章-测试ppt课件.ppt
软软 件件 工工 程程第六章第六章 测试测试通常把编码和测试统称为实现。通常把编码和测试统称为实现。所谓编码就是把软件设计结果翻译成用某种所谓编码就是把软件设计结果翻译成用某种程序设计语言书写的程序。程序设计语言书写的程序。所选用的程序设计语言的特点及编码风格将所选用的程序设计语言的特点及编码风格将对程序的可靠性、可读性、可测试性和可维对程序的可靠性、可读性、可测试性和可维护性产生深远的影响。护性产生深远的影响。无论怎样强调软件测试的重要性和它对软件无论怎样强调软件测试的重要性和它对软件可靠性的影响都不过分。可靠性的影响都不过分。在软件生命周期的每个阶段都不可避免地会在软件生命周期的每个阶段都不可避免地会产生差错。产生差错。在每个阶段结束之前通过严格的技术审查,在每个阶段结束之前通过严格的技术审查,尽可能早地发现并纠正差错尽可能早地发现并纠正差错.经验表明审查并不能发现所有差错,此外在经验表明审查并不能发现所有差错,此外在编码过程中还不可避免地会引入新的错误。编码过程中还不可避免地会引入新的错误。 Error: : 人的错误人的错误 Fault: : 人错误的结果,体现在开发和人错误的结果,体现在开发和维护的产品中维护的产品中 Failure: (: (系统系统故障故障) ) 错误错误( (fault)(内在内在) )、故障、故障(failure)(外在外在) )人的错误如何产生故障人的错误如何产生故障?!human errorfaultfailurecan lead tocan lead to测试的目的就是在软件投入生产性运行之前,测试的目的就是在软件投入生产性运行之前,尽可能多地发现软件中的错误。尽可能多地发现软件中的错误。软件测试仍然是保证软件质量的关键步骤,软件测试仍然是保证软件质量的关键步骤,它是对软件规格说明、设计和编码的最后复它是对软件规格说明、设计和编码的最后复审。审。软件测试在软件生命周期中横跨两个阶段。编码和测试阶段在编写出每个模块之后就对它做必要的测试(称为单元测试),模块的编写者和测试者是同一个人,编码和单元测试属于软件生命周期的同一个阶段。在这个阶段结束之后,对软件系统还应该进行各种综合测试,这是软件生命周期中的另一个独立的阶段,通常由专门的测试人员承担这项工作。大量统计资料表明,软件测试的工作量往往大量统计资料表明,软件测试的工作量往往占软件开发总工作量的占软件开发总工作量的40%40%以上,在极端情以上,在极端情况,测试那种关系人的生命安全的软件所花况,测试那种关系人的生命安全的软件所花费的成本,可能相当于软件工程其他开发步费的成本,可能相当于软件工程其他开发步骤总成本的骤总成本的3 3倍到倍到5 5倍。倍。必须高度重视软件测试工作,绝不要以为写必须高度重视软件测试工作,绝不要以为写出程序之后软件开发工作就接近完成了,实出程序之后软件开发工作就接近完成了,实际上,大约还有同样多的开发工作量需要完际上,大约还有同样多的开发工作量需要完成。成。通过测试发现错误之后还必须诊断并改正错通过测试发现错误之后还必须诊断并改正错误,这就是调试的目的。调试是测试阶段最误,这就是调试的目的。调试是测试阶段最困难的工作。困难的工作。在对测试结果进行收集和评价的时候,软件在对测试结果进行收集和评价的时候,软件所达到的可靠性也开始明朗了。软件可靠性所达到的可靠性也开始明朗了。软件可靠性模型使用故障率数据,估计软件将来出现故模型使用故障率数据,估计软件将来出现故障的情况并预测软件的可靠性。障的情况并预测软件的可靠性。1、定义:测试是为了、定义:测试是为了发现程序中的错误发现程序中的错误而执而执行程序的过程。行程序的过程。注意:注意: 只能尽可能查错,不能证明程序中只能尽可能查错,不能证明程序中 没有错;没有错; 测试员与程序员不应是同一个人。测试员与程序员不应是同一个人。测测 试基础试基础G.MyersG.Myers给出了关于测试的一些规则,这些给出了关于测试的一些规则,这些规则也可以看作是测试的目标或定义。规则也可以看作是测试的目标或定义。(1) (1) 测试是为了发现程序中的错误而执行程测试是为了发现程序中的错误而执行程序的过程;序的过程;(2) (2) 好的测试方案是极可能发现迄今为止尚好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;未发现的错误的测试方案;(3) (3) 成功的测试是发现了至今为止尚未发现成功的测试是发现了至今为止尚未发现的错误的测试。的错误的测试。软件测试的目标软件测试的目标由于测试的目标是暴露程序中的错误,从心由于测试的目标是暴露程序中的错误,从心理学角度看,由程序的编写者自己进行测试理学角度看,由程序的编写者自己进行测试是不恰当的。因此,在综合测试阶段通常由是不恰当的。因此,在综合测试阶段通常由其他人员组成测试小组来完成测试工作。其他人员组成测试小组来完成测试工作。应该认识到测试决不能证明程序是正确的。应该认识到测试决不能证明程序是正确的。即使经过了最严格的测试之后,仍然可能还即使经过了最严格的测试之后,仍然可能还有没被发现的错误潜藏在程序中。测试只能有没被发现的错误潜藏在程序中。测试只能查找出程序中的错误,不能证明程序中没有查找出程序中的错误,不能证明程序中没有错误。错误。为了能设计出有效的测试方案,软件工程师为了能设计出有效的测试方案,软件工程师必须深入理解并正确运用指导软件测试的基必须深入理解并正确运用指导软件测试的基本准则。下面讲述主要的测试准则。本准则。下面讲述主要的测试准则。(1 1) 所有测试都应该能追溯到用户需求。所有测试都应该能追溯到用户需求。软件测试的目标是发现错误。从用户的角度软件测试的目标是发现错误。从用户的角度看,最严重的错误是导致程序不能满足用户看,最严重的错误是导致程序不能满足用户需求的那些错误。需求的那些错误。软件测试准则软件测试准则(2 2) 应该远在测试开始之前就制定出测试应该远在测试开始之前就制定出测试计划。实际上,一旦完成了需求模型就可以计划。实际上,一旦完成了需求模型就可以着手制定测试计划,在建立了设计模型之后着手制定测试计划,在建立了设计模型之后就可以立即开始设计详细的测试方案。因此,就可以立即开始设计详细的测试方案。因此,在编码之前就可以对所有测试工作进行计划在编码之前就可以对所有测试工作进行计划和设计。和设计。(3 3) 把把ParetoPareto原理应用到软件测试中。原理应用到软件测试中。ParetoPareto原理说明,测试发现的错误中的原理说明,测试发现的错误中的80%80%很可能是由程序中很可能是由程序中20%20%的模块造成的。当然,的模块造成的。当然,问题是怎样找出这些可疑的模块并彻底地测问题是怎样找出这些可疑的模块并彻底地测试它们。试它们。(4 4) 应该从应该从“小规模小规模”测试开始,并逐步测试开始,并逐步进行进行“大规模大规模”测试。通常,首先重点测试测试。通常,首先重点测试单个程序模块,然后把测试重点转向在集成单个程序模块,然后把测试重点转向在集成的模块簇中寻找错误,最后在整个系统中寻的模块簇中寻找错误,最后在整个系统中寻找错误。找错误。(5 5) 穷举测试是不可能的。所谓穷举测试穷举测试是不可能的。所谓穷举测试就是把程序所有可能的执行路径都检查一遍就是把程序所有可能的执行路径都检查一遍的测试。测试只能证明程序中有错误,不能的测试。测试只能证明程序中有错误,不能证明程序中没有错误。但是,精心地设计测证明程序中没有错误。但是,精心地设计测试方案,有可能试方案,有可能充分覆盖程序逻辑充分覆盖程序逻辑并使程序并使程序达到所要求的可靠性。达到所要求的可靠性。(6 6) 为了达到最佳的测试效果,应该由独为了达到最佳的测试效果,应该由独立的第三方从事测试工作。所谓立的第三方从事测试工作。所谓“最佳效果最佳效果”是指有最大可能性发现错误的测试。开发软是指有最大可能性发现错误的测试。开发软件的软件工程师并不是完成全部测试工作的件的软件工程师并不是完成全部测试工作的最佳人选(通常他们主要承担模块测试工最佳人选(通常他们主要承担模块测试工作)。作)。 黑盒测试黑盒测试(black-box , or closed-box testing): 确信对每个输入,观察到输出与期望的输确信对每个输入,观察到输出与期望的输入出是否匹配入出是否匹配. 对功能测试对功能测试2、测试方法、测试方法 白盒测试白盒测试(white-box , or open-box, clear-box testing): 利用程序的结构进行测试利用程序的结构进行测试. 结构测试结构测试141416161616161610103 32 22 22 2若程序执行需若程序执行需10-3秒,则对于所有合法输入秒,则对于所有合法输入的测试大约需用一万年,而且还应测试输入非法的测试大约需用一万年,而且还应测试输入非法数据的情况。数据的情况。主要问题:穷尽测试主要问题:穷尽测试(complete test)通常通常是不可能的。是不可能的。例:例:(Black-box) 程序要求输入程序要求输入3个整型数据。若字长个整型数据。若字长16位,则各种可能输入的排列组合共有位,则各种可能输入的排列组合共有 (种)(种)例:例:(White-box) 下图所示的程序中共有下图所示的程序中共有 520 1014条可能的执行通路,显然,每条通路都执行条可能的执行通路,显然,每条通路都执行一遍是不现实的。一遍是不现实的。1. 基本概念基本概念循环循环2020次次3、测试步骤:测试步骤:(1) 单元测试单元测试 程序设计和代码错误(程序设计和代码错误( bugsbugs)(2) (2) 子系统测试子系统测试 模块之间的连接模块之间的连接(3) (3) 系统测试系统测试 需求和系统设计需求和系统设计(4) (4) 验收测试验收测试 顾客参与顾客参与(5) (5) 平行运行平行运行 新系统、老系统同时运行并比较新系统、老系统同时运行并比较. .集成测试集成测试测试阶段的信息流:测试阶段的信息流:测试测试评价评价调试调试可靠性可靠性模型模型软件配置软件配置测试配置测试配置测试结果测试结果可靠性预测可靠性预测错错 误误正正 确确错误率数据错误率数据预期结果预期结果单元测试(白盒单元测试(白盒)主要测试以下五个方面:主要测试以下五个方面:1、模块接口:、模块接口: 内部检查:传输参数的数目、属性、单位、次内部检查:传输参数的数目、属性、单位、次序是否匹配;全程变量的定义是否一致;只做序是否匹配;全程变量的定义是否一致;只做输入的变元有无被修改,等等。输入的变元有无被修改,等等。 外部检查:打开、结束、关闭文件的操作;文外部检查:打开、结束、关闭文件的操作;文件和属性;件和属性;IO错误处理;输出拼写,等等。错误处理;输出拼写,等等。2、局部数据结构:、局部数据结构: 数据说明数据说明(declaration);初始化与缺省值的设置;初始化与缺省值的设置;变量名拼写;数据类型的相容性;上变量名拼写;数据类型的相容性;上下溢出及下溢出及地址异常,等等。地址异常,等等。3.单元测试单元测试3、重要的执行通路:、重要的执行通路: 由于穷尽测试不可能,故通常针对最常见的由于穷尽测试不可能,故通常针对最常见的错误设计测试方案。较常见的错误有:错误设计测试方案。较常见的错误有: 计算次序问题(例:运算的优先级)计算次序问题(例:运算的优先级) 不同类型混合运算(例:比较类型不同的量)不同类型混合运算(例:比较类型不同的量) 初值设置错误初值设置错误 精度问题(例:精度不够导致两变量不可能相精度问题(例:精度不够导致两变量不可能相等,而程序中等待相等条件的出现)等,而程序中等待相等条件的出现) 表达式错误表达式错误 循环终止条件错误(例:次数差循环终止条件错误(例:次数差1,或陷入死,或陷入死循环)循环)4、出错处理通路:、出错处理通路:预见出现错误的条件,设置处理。较常见的问题有:预见出现错误的条件,设置处理。较常见的问题有: 输出的错误信息难以理解,不能确定错误位置输出的错误信息难以理解,不能确定错误位置 描述的错误与实际错误不符描述的错误与实际错误不符 处理之前系统已经干预处理之前系统已经干预 处理不正确处理不正确3.单元测试单元测试5、边界条件、边界条件 单元测试中最后,也可能是最重单元测试中最后,也可能是最重要的任务,因为软件常在其边界失效。要的任务,因为软件常在其边界失效。1、代码审查、代码审查(code inspection) 代码会审代码会审 以小组会的方式进行,会审小组一般以小组会的方式进行,会审小组一般由由3-43-4人组成,包括组长人组成,包括组长1 1人,程序作者人,程序作者1 1人,其他人,其他程序员(或测试人员)程序员(或测试人员)1-21-2人。人。 作者讲解程序,作者讲解程序,其他人员,捕捉程序结构、功能与编码风格等方其他人员,捕捉程序结构、功能与编码风格等方面存在问题,发现的错误会后交由作者修改面存在问题,发现的错误会后交由作者修改。 预排预排:由人扮演由人扮演computer,模拟执行情况。模拟执行情况。3.单元测试单元测试优点优点: 一次审查可发现多个错误,不必改一个测一个。一次审查可发现多个错误,不必改一个测一个。单元测试的主要手段单元测试的主要手段 :模块不是独立的程序,不易单独测试,为了解决这模块不是独立的程序,不易单独测试,为了解决这个问题,可以在单元测试时为被测试模块编一些测个问题,可以在单元测试时为被测试模块编一些测试模块,作为它上级模块或下级模块的替身。代替试模块,作为它上级模块或下级模块的替身。代替上级模块的称为驱动模块,代替下级模块的称为桩上级模块的称为驱动模块,代替下级模块的称为桩模块模块。2、制做测试软件:、制做测试软件:Stub (存根,桩)和存根,桩)和 Driver(驱动)驱动)2.单元测试单元测试替身模块是真实模块的简化,只需要模拟与被测模块替身模块是真实模块的简化,只需要模拟与被测模块直接有关的一部分功能,测试结束完后完成历史使命。直接有关的一部分功能,测试结束完后完成历史使命。满足被测模块需要的前提下,驱动模块和桩模块的内满足被测模块需要的前提下,驱动模块和桩模块的内容应尽量简单。容应尽量简单。模块不是独立的程序,不易单独测试,为了解决这模块不是独立的程序,不易单独测试,为了解决这个问题,可以在单元测试时为被测试模块编一些测个问题,可以在单元测试时为被测试模块编一些测试模块,作为它上级模块或下级模块的替身。代替试模块,作为它上级模块或下级模块的替身。代替上级模块的称为驱动模块,代替下级模块的称为桩上级模块的称为驱动模块,代替下级模块的称为桩模块模块。2.单元测试单元测试替身模块是真实模块的简化,只需要模拟与被测模块替身模块是真实模块的简化,只需要模拟与被测模块直接有关的一部分功能,测试结束完后完成历史使命。直接有关的一部分功能,测试结束完后完成历史使命。满足被测模块需要的前提下,驱动模块和桩模块的内满足被测模块需要的前提下,驱动模块和桩模块的内容应尽量简单。容应尽量简单。2、计算机测试、计算机测试制做测试软件:制做测试软件:Stub (存根,桩)和存根,桩)和 Driver(驱动驱动) 驱动 X 桩1 桩2软件的编写,属额外开支。模块高内聚可简化软件的编写,属额外开支。模块高内聚可简化这一过程。这一过程。2.单元测试单元测试模块通过单元测试后,要组装为程序,在组装中进行模块通过单元测试后,要组装为程序,在组装中进行的测试,就称为集成测试。的测试,就称为集成测试。 即使所有模块通过了单元测试,组装中仍不免出现即使所有模块通过了单元测试,组装中仍不免出现新问题,根源在于模块接口和全局数据协调不好。新问题,根源在于模块接口和全局数据协调不好。例如:例如:数据会在穿过接口时丢失;数据会在穿过接口时丢失;一个模块可能会对另一模块造成有害的影响;一个模块可能会对另一模块造成有害的影响;把子功能组合起来可能不产生所要求的主功能;把子功能组合起来可能不产生所要求的主功能;有些单独看来可以允许的误差,组装后可能达到不能有些单独看来可以允许的误差,组装后可能达到不能容忍的地方。容忍的地方。集成测试集成测试 (Integration Testing)又称为综合测试又称为综合测试1、非渐增式测试、非渐增式测试 Test A,B, C, DTestATestBTestCTestD先测试每个模块,再把先测试每个模块,再把模块组合程序模块组合程序1、非渐增式测试、非渐增式测试 2、渐增式测试、渐增式测试 4.集成测试集成测试渐增式:从一个模块开始,测一次添渐增式:从一个模块开始,测一次添一个新模块,滚雪球一样越滚越大,一个新模块,滚雪球一样越滚越大,直到把所有模块组装完毕直到把所有模块组装完毕。2、渐增式测试、渐增式测试 4.集成测试集成测试4.集成测试集成测试两种方式的比较:两种方式的比较: 渐增式测试渐增式测试可以较早发现模块间的接口错误;可以较早发现模块间的接口错误;非渐非渐增式测试增式测试最后才组装,因此错误发现得晚。最后才组装,因此错误发现得晚。 非渐增式测试中发现错误后难以诊断定位;渐增式非渐增式测试中发现错误后难以诊断定位;渐增式测试中,出现的错误往往跟最新加入的模块有关。测试中,出现的错误往往跟最新加入的模块有关。 渐增式测试在不断集成的过程中使模块不断在新的渐增式测试在不断集成的过程中使模块不断在新的条件下受到新的检测,测试更彻底。条件下受到新的检测,测试更彻底。 渐增式测试较非渐增式测试费时。非渐增式测试可渐增式测试较非渐增式测试费时。非渐增式测试可以同时并行测试所有模块,能充分利用人力。以同时并行测试所有模块,能充分利用人力。 自顶向下测试自顶向下测试第第1步:测试顶端模块,用桩程序步:测试顶端模块,用桩程序(stub)代替直代替直接附属的下层模块接附属的下层模块4.集成测试集成测试3、渐增式测试渐增式测试 的几种策略的几种策略MS1S2第第2步:根据深度优先或宽度优先的策略,每次步:根据深度优先或宽度优先的策略,每次用一个实际模块代换一个用一个实际模块代换一个stub。3.集成测试集成测试第第3步:在结合进一个模块的同时进行测试。步:在结合进一个模块的同时进行测试。MS1S2M1S3S4M2S2第第4步:回归测试步:回归测试(regression testing)全部全部或部分地重复以前做过的测试。或部分地重复以前做过的测试。 由底向上测试由底向上测试第第1步:把低层模块组合成族,每族实现一个子功能。步:把低层模块组合成族,每族实现一个子功能。第第2步:用驱动程序步:用驱动程序(Driver)协调测试数据的协调测试数据的IO,测测试子功能试子功能族。族。3.集成测试集成测试优点:在早期即对主要控制及关键的抉择进行检验。优点:在早期即对主要控制及关键的抉择进行检验。问题:问题:Stub只是对低层模块的模拟,测试时没有重只是对低层模块的模拟,测试时没有重要的数据自下往上流,许多重要的测试须推要的数据自下往上流,许多重要的测试须推迟进行,而且在早期不能充分展开人力。迟进行,而且在早期不能充分展开人力。DM1M2第第3 3步:去掉步:去掉DriverDriver,自下而上把子功能族合成自下而上把子功能族合成更大的子功能族。更大的子功能族。MMMMMMMMMMMMDDDDDD3.集成测试集成测试注意:注意:两种策略两种策略的优、缺点刚好的优、缺点刚好互补,但单用其互补,但单用其中任一种都不实中任一种都不实际,通常根据软际,通常根据软件的特点将二者件的特点将二者混用。混用。 混合策略混合策略3.集成测试集成测试Target layerTop-downBottom-up5.确认测试确认测试(Acceptance testing)任务:验收软件的有效性(功能和性能达标)。任务:验收软件的有效性(功能和性能达标)。手段:黑盒测试;用户参与;主要用实际数据进手段:黑盒测试;用户参与;主要用实际数据进行测试。行测试。内容:按合同规定审查软件配置;内容:按合同规定审查软件配置; 设计测试计划,使通过测试保证软件能满设计测试计划,使通过测试保证软件能满足所有功能、性能要求;足所有功能、性能要求; 文档与程序一致,具有维护阶段所必须的文档与程序一致,具有维护阶段所必须的细节;细节; 严格按用户手册操作,以检查手册的完整严格按用户手册操作,以检查手册的完整性和正确性。性和正确性。确认测试也称为验收测试确认测试也称为验收测试确认测试必须有用户积极参与,或者以用户确认测试必须有用户积极参与,或者以用户为主进行。为主进行。用户应该参与设计测试方案,使用用户界面用户应该参与设计测试方案,使用用户界面输入测试数据并且分析评价测试的输出结果。输入测试数据并且分析评价测试的输出结果。为了使得用户能够积极主动地参与确认测试,为了使得用户能够积极主动地参与确认测试,特别是为了使用户能有效地使用这个系统,特别是为了使用户能有效地使用这个系统,通常在验收之前由开发单位对用户进行培训。通常在验收之前由开发单位对用户进行培训。确认测试的范围确认测试的范围 应该仔细设计测试计划和测试过程,测试计应该仔细设计测试计划和测试过程,测试计划包括要进行的测试的种类及进度安排,测划包括要进行的测试的种类及进度安排,测试过程规定了用来检测软件是否与需求一致试过程规定了用来检测软件是否与需求一致的测试方案。的测试方案。通过测试和调试要保证软件能满足所有功能通过测试和调试要保证软件能满足所有功能要求,能达到每个性能要求,文档资料是准要求,能达到每个性能要求,文档资料是准确而完整的,此外,还应该保证软件能满足确而完整的,此外,还应该保证软件能满足其他预定的要求(例如,安全性、可移植性、其他预定的要求(例如,安全性、可移植性、兼容性和可维护性等)。兼容性和可维护性等)。确认测试有下述两种可能的结果:确认测试有下述两种可能的结果:(1 1) 功能和性能与用户要求一致,软件是功能和性能与用户要求一致,软件是可以接受的;可以接受的;(2 2) 功能和性能与用户要求有差距。功能和性能与用户要求有差距。在这个阶段发现的问题往往和需求分析阶段在这个阶段发现的问题往往和需求分析阶段的差错有关,涉及的面通常比较广,因此解的差错有关,涉及的面通常比较广,因此解决起来也比较困难。为了制定解决确认测试决起来也比较困难。为了制定解决确认测试过程中发现的软件缺陷或错误的策略,通常过程中发现的软件缺陷或错误的策略,通常需要和用户充分协商。需要和用户充分协商。确认测试的一个重要内容是复查软件配置。确认测试的一个重要内容是复查软件配置。保证软件配置的所有成分都齐全,质量符合保证软件配置的所有成分都齐全,质量符合要求,文档与程序完全一致,具有完成软件要求,文档与程序完全一致,具有完成软件维护所必须的细节,而且已经编好目录。维护所必须的细节,而且已经编好目录。在确认测试过程中还应该严格遵循用户指南在确认测试过程中还应该严格遵循用户指南及其他操作程序,以便检验这些使用手册的及其他操作程序,以便检验这些使用手册的完整性和正确性。必须仔细记录发现的遗漏完整性和正确性。必须仔细记录发现的遗漏或错误,并且适当地补充和改正。或错误,并且适当地补充和改正。软件配置复查软件配置复查如果软件是专为某个客户开发的,可以进行如果软件是专为某个客户开发的,可以进行一系列验收测试,以便用户确认所有需求都一系列验收测试,以便用户确认所有需求都得到满足了。得到满足了。验收测试是由最终用户而不是系统的开发者验收测试是由最终用户而不是系统的开发者进行的。事实上,验收测试可以持续几个星进行的。事实上,验收测试可以持续几个星期甚至几个月,因此能够发现随着时间流逝期甚至几个月,因此能够发现随着时间流逝可能会降低系统质量的累积错误。可能会降低系统质量的累积错误。Alpha和和Beta测试测试如果一个软件是为许多客户开发的(例如,如果一个软件是为许多客户开发的(例如,向大众公开出售的盒装软件产品),那么,向大众公开出售的盒装软件产品),那么,让每个客户都进行正式的验收测试是不现实让每个客户都进行正式的验收测试是不现实的。在这种情况下,绝大多数软件开发商都的。在这种情况下,绝大多数软件开发商都使用被称为使用被称为AlphaAlpha测试和测试和BetaBeta测试的过程,测试的过程,来发现那些看起来只有最终用户才能发现的来发现那些看起来只有最终用户才能发现的错误。错误。Alpha测试由用户在开发者的场所进行,并且测试由用户在开发者的场所进行,并且在开发者对用户的在开发者对用户的“指导指导”下进行测试。开下进行测试。开发者负责记录发现的错误和使用中遇到的问发者负责记录发现的错误和使用中遇到的问题。总之,题。总之,AlphaAlpha测试是在受控的环境中进行测试是在受控的环境中进行的。的。BetaBeta测试由软件的最终用户们在一个或多个测试由软件的最终用户们在一个或多个客户场所进行。与客户场所进行。与AlphaAlpha测试不同,开发者测试不同,开发者通常不在通常不在BetaBeta测试的现场,因此,测试的现场,因此,BetaBeta测试测试是软件在开发者不能控制的环境中的是软件在开发者不能控制的环境中的“真实真实”应用。应用。用户记录在用户记录在BetaBeta测试过程中遇到的一切问题测试过程中遇到的一切问题(真实的或想像的),并且定期把这些问题(真实的或想像的),并且定期把这些问题报告给开发者。报告给开发者。接收到在接收到在BetaBeta测试期间报告的问题之后,开测试期间报告的问题之后,开发者对软件产品进行必要的修改,并准备向发者对软件产品进行必要的修改,并准备向全体客户发布最终的软件产品。全体客户发布最终的软件产品。白盒测试技术白盒测试技术主要技术:主要技术:1、逻辑覆盖、逻辑覆盖(Logical coverage) 适用于白盒测适用于白盒测试试 覆盖程度由弱到强顺次为:覆盖程度由弱到强顺次为: 语句覆盖语句覆盖(Statement coverage):每个语句至少执每个语句至少执行一次。行一次。任务:预定要测试的功能任务:预定要测试的功能 设计输入的测试数据设计输入的测试数据(test cases) 列出预期结果列出预期结果(expected output)设计测试方案设计测试方案白盒测试技术白盒测试技术例:例:P.153 图图7.5问题:若问题:若AND错错写 为写 为 O R , 或, 或X1错写为错写为X 1AND B=0TA=2OR X 1TX = X / AX = X + 1返回返回FFTest case : A=2 , B=0 , X=4. 6 白盒测试技术白盒测试技术判定覆盖判定覆盖(Branch coverage):在的基础上,在的基础上,每个判定的每个分支至少执行一次每个判定的每个分支至少执行一次。Test cases:A=3 , B=0 , X=3A=2 , B=1 , X=1问题:若问题:若X1错错写为写为X 1AND B=0TA=2OR X 1TX = X / AX = X + 1返回返回FF6 白盒测试技术白盒测试技术 条件覆盖条件覆盖(Condition coverage):在的基础上,在的基础上,使每个判定表达式的每个条件都取到各种可能的结使每个判定表达式的每个条件都取到各种可能的结果。果。Test cases:A=2 , B=0 , X=4(满足满足A1, B=0; A=2, X1)A=1, B=1, X=1(满足满足A 1, B 0; A 2, X 1)问:条件覆盖问:条件覆盖 ? 判定覆盖判定覆盖 答答: 不一定。不一定。 反例反例: A=2, B=0, X=1 ( 满足满足A1, B=0; A=2, X 1) A=1, B=1, X=2 (满足满足A 1, B 0; A 2, X 1)入口入口A 1AND B=0TA=2OR X 1TX = X / AX = X + 1返回返回FF满足条件覆盖满足条件覆盖 不满足判定覆盖不满足判定覆盖6.白盒测试技术白盒测试技术判定判定/条件覆盖:即条件覆盖:即判定覆盖判定覆盖 条件覆盖条件覆盖 判定覆盖不一定包含条件覆盖,条件覆盖也不判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖一定包含判定覆盖判定判定/条件覆盖的含义是,选取足够多的测试条件覆盖的含义是,选取足够多的测试数据,使得判定表达式中的每个条件都取到数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也取到各种可能的值,而且每个判定表达式也取到各种可能的结果。各种可能的结果。Test cases:A=2 , B=0 , X=4(满足满足A1, B=0; A=2, X1)A=1, B=1, X=1(满足满足A 1, B 0; A 2, X 1)判定判定/条件覆盖不比条件覆盖不比条件覆盖更强条件覆盖更强6.白盒测试技术白盒测试技术 条件组合覆盖:每个判定表达式条件组合覆盖:每个判定表达式中条件的各种可能组合都至少出中条件的各种可能组合都至少出现一次。现一次。入口入口A 1AND B=0TA=2OR X 1TX = X / AX = X + 1返回返回FF全部可能的条件组合为:全部可能的条件组合为: A1, B=0 A1, B 0 A 1, B=0 A 1, B 0 A=2, X1 A=2, X 1 A 2, X1 A 2,X 1 Test cases:(1) A=2, B=0, X=4 (T T) (2) A=2. B=1, X=1 (F T) (3) A=1, B=0, X=2 (F T) (4) A=1, B=1, X=1 (F F) 问题:没有测试到问题:没有测试到(T F)的情形的情形,有路径没走到有路径没走到 6.白盒测试技术白盒测试技术还可考虑下述覆盖:还可考虑下述覆盖: 点覆盖点覆盖 边覆盖边覆盖= 语句覆盖语句覆盖 路径覆盖路径覆盖(Path coverage): 每条可能的路径都至少执每条可能的路径都至少执行一次,若图中有环,则每行一次,若图中有环,则每个环至少经过一次。个环至少经过一次。=判定覆盖判定覆盖Test cases: A=1 , B=1 , X=1 A=1 , B=1 , X=2 A=3 , B=0 , X=1 A=2 , B=0 , X=4 路路径覆径覆盖盖 条件条件组合组合覆盖覆盖14567231-2-3 1-2-6-7 1-4-5-3 1-4-5-6- 7 6.白盒测试技术白盒测试技术1. 基本路径测试基本路径测试是基本路径测试是Tom McCabeTom McCabe提出的一种白盒提出的一种白盒测试技术。测试技术。用该程序的环形复杂度定义执行路径的基本用该程序的环形复杂度定义执行路径的基本集合,导出的测试用例可以保证程序中的每集合,导出的测试用例可以保证程序中的每条语句至少执行一次,而且每个条件在执行条语句至少执行一次,而且每个条件在执行时都将分别取真、假两种值。时都将分别取真、假两种值。步骤如下:步骤如下:第一步,根据过程设计结果画出相应的流图第一步,根据过程设计结果画出相应的流图。控制结构测试例如,用例如,用PDLPDL描述的求平均值过程,描述的求平均值过程,PROCEDURE average;/ /* * 这个过程计算不超过这个过程计算不超过100100个在规定值域内的有效数字的平均个在规定值域内的有效数字的平均值;同时计算有效数字的总和及个数。值;同时计算有效数字的总和及个数。* */ / INTERFACE RETURNS average, total.input, total.valid; INTERFACE ACCEPTS value, minimum, maximum; TYPE value1100 IS SCALAR ARRAY; TYPE average, total.input, total.valid; minimum,maximum, sum IS SCALAR; TYPE i IS INTEGER;1: i=1;total.input=total.valid=0;sum=0;2:DO WHILE valuei -9993: AND total.input=minimum6: AND valuei011: THEN average=sum/total.valid;12: ELSE average=-999;13: ENDIF END average求平均值过程的流图 第二步,计算流图的环形复杂度。第二步,计算流图的环形复杂度。可以用第可以用第6.5.16.5.1小节讲述的小节讲述的3 3种方法之一计算种方法之一计算环形复杂度。图环形复杂度。图7.67.6所示流图的环形复杂度所示流图的环形复杂度为为6 6。第三步,确定线性独立路径的基本集合。第三步,确定线性独立路径的基本集合。用流图术语描述,独立路径至少包含一条在定义该用流图术语描述,独立路径至少包含一条在定义该路径之前不曾用过的边。路径之前不曾用过的边。程序的环形复杂度决定了程序中独立路径的数量,程序的环形复杂度决定了程序中独立路径的数量,而且这个数是确保程序中所有语句至少被执行一次而且这个数是确保程序中所有语句至少被执行一次所需的测试数量的上界。所需的测试数量的上界。对于求平均值过程来说,由于环形复杂度为对于求平均值过程来说,由于环形复杂度为6 6,因,因此共有此共有6 6条独立路径条独立路径。路径路径3:1-2-3- 10-11-13路径路径2:1-2-10-12-13路径路径1:1-2-10-11-13路径路径4:1-2-3-4-5-8-9-2-路径路径5:1-2-3-4-5-6-8-9-2-路径路径6:1-2-3-4-5-6-7-8-9-2-识别出判定结点。本识别出判定结点。本例中结点例中结点2 2、3 3、5 5、6 6和和1010是判定结点。是判定结点。 第四步,设计可强制执行基本集合中每条第四步,设计可强制执行基本集合中每条路径的测试用例。路径的测试用例。应该选取测试数据使得在测试每条路径时都应该选取测试数据使得在测试每条路径时都适当地设置好了各个判定结点的条件。适当地设置好了各个判定结点的条件。在测试过程中,执行每个测试用例并把实际在测试过程中,执行每个测试用例并把实际输出结果与预期结果相比较。一旦执行完所输出结果与预期结果相比较。一旦执行完所有测试用例,就可以确保程序中所有语句都有测试用例,就可以确保程序中所有语句都至少被执行了一次,而且每个条件都分别取至少被执行了一次,而且每个条件都分别取过过truetrue值和值和falsefalse值。值。应该注意,某些独立路径不能以独立的方式应该注意,某些独立路径不能以独立的方式测试,也就是说,程序的正常流程不能形成测试,也就是说,程序的正常流程不能形成独立执行该路径所需要的数据组合。在这种独立执行该路径所需要的数据组合。在这种情况下,这些路径必须作为另一个路径的一情况下,这些路径必须作为另一个路径的一部分来测试部分来测试, ,如如路径路径1 、路径路径3。2. 2. 条件测试条件测试尽管基本路径测试技术简单而且高效,但是尽管基本路径测试技术简单而且高效,但是仅有这种技术还不够,还需要使用其他控制仅有这种技术还不够,还需要使用其他控制结构测试技术,才能进一步提高白盒测试的结构测试技术,才能进一步提高白盒测试的质量。质量。用条件测试技术设计出的测试用例,用条件测试技术设计出的测试用例,能够检能够检查程序模块中包含的逻辑条件。查程序模块中包含的逻辑条件。一个一个简单条件简单条件是一个布尔变量或一个关系表是一个布尔变量或一个关系表达式,可以加上达式,可以加上NOTNOT算符。算符。关系表达式的形式如下:关系表达式的形式如下:E1E1E2E2其中,其中,E1E1和和E2E2是算术表达式,是算术表达式,而而 是下列算符之一:是下列算符之一:“”, “”,“”或或“”。复合条件复合条件由两个或多个简单条件、布尔算符由两个或多个简单条件、布尔算符和括弧组成。布尔算符有和括弧组成。布尔算