《软件工程实践》PPT课件.ppt
北京理工大学软件工程实践汤铭端中国航天科工集团公司204所第八讲软件测试内容和目的n测试的目的和策略n测试的活动n测试的产品n测试的方法和度量要求n测试用例构造技术测试的目标nMyersn测试是一个为了寻找错误而运行的过程n一个好的测试用例是指很可能找到迄今为止尚未发现的错误的用例n一个成功的测试是指揭示了迄今为止尚未发现的错误的测试nIEEEn由人工或自动方法来执行或评价系统或系统部件的过程,以验证它是否满足规定的需求;或识别出期望的结果和实际结果之间有无差别。Myers软件测试十原则n程序员应避免测试自己编制的程序n测试用例的设计必须包括预期的输出结果n测试用例应包括有效的和期望的输入情况,也要包括无效的和不期望的输入情况n彻底检查每个测试结果n只检查程序是否做了它应该做的事仅仅完成了测试工作的一半,另一半则是要检查程序是否做了它不该做的事n避免不可重复的即兴测试,保留全部测试用例n一段程序中存在错误的概率与在这段程序中已发现的错误数成正比n测试是一项非常复杂、创造性的和需要高度智慧的挑战性任务n不要为了便于测试擅自修改程序n测试工作必须有明确的目标测试的原则(DAVIE)n所有的测试都应追溯到需求n应该在测试工作真正开始前的较长时间就进行测试计划nPareto(20-80)原则应用于软件测试n测试应从“小规模”开始,逐步转向“大规模”n穷举测试是不可能的n为了达到最佳效果,应该由独立的第三方来构造测试测试策略途径n测试开始于模块层,然后延伸到整个基于计算机的系统集合中n不同的测试技术适用于不同的时间点n测试是由软件的开发人员和(对大型系统来说)独立的测试组来管理的n测试和调试是不同的活动,但是调试必须能够适应任何的测试策略测试完成准则n资源耗尽n采用的测试方法满足某种测试充分性要求n满足覆盖率等可度量的测试要求n一段时期没有发现问题且所有发现问题均已解决n通过测试评估出软件达到要求的可靠度n测试发现频率和趋势达到预先计划的限度之下(限度根据要求、经验和历史数据得到)n在一段时期没有出现等级高的问题测试概图n阶段活动n单元n集成n合格性n系统n技术方法n静态测试n静态分析n代码审查n动态测试n白盒测试n白盒测试用例技术n黑盒测试n黑盒测试用例技术V模型系统需求软件需求概要设计详细设计单元测试集成测试编码合格性测试系统测试详细设计概要设计软件需求系统需求软件任务编译后的单元测试后的单元集成的软件测试后的软件交付软件验证验证验证验证验证验证验证与确认验证与确认J.McDermid于1994年在“软件工程师参考手册”中提出测试活动n单元测试(UNIT)n集成测试(INTERGRATION)n合格性测试(QUALIFICATION)n系统测试(SYSTEM)单元测试单元测试n对软件单元进行测试,确实保证它作为一个单元能正常地工作n单元测试的目的是验证单元满足功能、性能和接口等的要求n单元测试采用的技术:静态分析、代码审查、白盒动态测试n测试的充分性由各种测试覆盖率来度量单元动态测试的内容n主要针对下列模块的五个基本特性进行:n模块接口n局部数据结构n重要的执行路径n出错处理路径n影响以上各点的边界条件单元测试用例的要求)用指定值、异常值和极限值验证全部计算;)验证全部输入数据的各种选择;)验证全部输出数据的各种选择和格式;)每个单元的全部可执行语句至少执行一次;)在每个分支点进行选择的测试。单元测试用例的内容)指明被验证的需求或功能;)解释测试如何进行,说明验证代码与单元设计一致的准则和技术,以验证接口满足需求;)指明测试使用的支持软件,如测试工具、驱动模块、桩模块、动态路径分析工具等;)说明全部输入数据和(或)驱动程序等;)说明预期的输出,包括数据值或其它可以验证的结果;)通过准则。单元测试执行环境驱动模块被测单元桩模块B桩模块C桩模块A集成测试n依据软件设计确定的软件结构,按照软件集成“工序”,把各个软件单元逐步集成为完整的软件系统,并不断发现和排除错误,以保证联接、集成的正确性。集成测试的内容集成测试的内容1)软件单元的接口测试;2)软件部件的功能、性能测试;3)全面数据结构测试;4)必要的运行时间、存贮空间、计算精度测试;5)边界条件和非法输入的测试。集成测试的要求集成测试的要求1)必须对有调用关系的软件单元之间的所有调用进行测试,验证每个调用接口的完整性和一致性;2)应对软件进行正确处理的能力的经受错误影响的能力进行测试;3)应测试在各种外部输入下,从外部接口采集和(或)发送数据的能力,包括对正确数据及状态的处理,对接口错误、数据错误、协议错误的识别及处理。集成测试的通过准则集成测试的通过准则1)软件单元无错误地连接;2)满足各项功能、性能要求;3)对错误的输入有正确处理的能力;4)对测试中的异常有合理解释;5)人机界面、对外接口正确无误;软件集成策略1)非增量方式n先测试好每一个软件单元,然后一次组装在一起再测试整个程序。2)增量方式n逐步把下一个要被组装的软件单元或部件,同已测好的软件部件结合起来测试。n增量方式主要包括自顶向下、自底向上、自顶向下与自底向上相结合等方法。集成方式集成方式n非增量方式nBigBangn增量方式n自顶向下方法自顶向下方法n自底向上方法自底向上方法n“三明治三明治”方法方法增量和非增量方式的优缺点n增量方式的优点:a.增量方式占用人工较少。b.增量方式可以较早地发现模块接口错误。c.增量方式容易排错。d.增量方式测试效果好,比较彻底。n非增量方式的优点:a.非增量方式占用机器时间较少。b.非增量方式有利于并行开发。非增量方式非增量方式n有一种很直接、原始的组装方式,它把所有通过单元测试的模块一古脑儿地全部集成在一起,直接组装成软件系统,并对它进行测试。n这种被贬义地称作大爆炸(BigBang)的组装方式,目前仍在许多场合使用。n人们期望它可以带来方便、快捷的组装效果。n这种方法遭到广大测试专家的批评,普遍认为它会引起混乱,且难以确定错误源的位置。自顶向下方法自顶向下方法n自顶向下集成法是一个模块一个模块地组装软件的方法。n按照控制的结构,从主控模块(主程序)开始,向下地逐个把模块连接起来。n集成的方式有两种:深度优先组装法及宽度优先组装法。n深度优先法是先把结构中的一条主要的控制路经上的全部模块逐步组装起来。然后再连接其它的控制路径。n宽度优先法是从结构的顶层开始逐层往下组装。自顶向下集成的过程步骤1)主控模块用作为测试驱动器。直接附属于主控模块的各模块全都用桩模块代替。2)按照所选的组装法(即深度优先或宽度优先)每次用一个真模块取代一个附属的桩模块。3)当装入每个真模块时都要进行测试。4)作完每一组测试后又再用一个真模块代替另一个桩模块。5)可以进行回复测试(即重新再作过去作过的全部或部分测试),以便肯定没有新的错误发生。自底向上方法自底向上方法n自底向上集成测试方法是从软件结构中最底层的、最基本的软件单元开始进行集成和测试。n由于在逐步向上组装过程中下层模块总是存在的,也就是说不再需要桩模块了,但却需要调用这些模块开展工作的驱动模块。自底向上自底向上集成的过程步骤1)低层的模块组成簇,以执行某个特定的软件子功能。2)编写一个驱动模块作为测试的控制程序,和被测试的簇连在一起,负责安排测试用例的输入及输出。3)对簇进行测试。4)拆去各个小簇的驱动模块,把几个小簇合并成大簇,再重复做2、3及4步。这样在软件结构上逐步向上组装。“三明治三明治”方法方法n自顶向下测试的主要优点是能较早显示出整个程序的轮廓。主要缺点是,当测试上层模块时使用桩模块较多,很难模拟出真实模块的全部功能,使部分测试内容被迫推迟,直至换上真实模块后再补充测试。n自底向上测试从下层模块开始,设计测试用例比较容易,但是在测试的早期不能显示出程序的轮廓。n针对自顶向下、自底向上方法各自的优点和不足,人们提出了自顶向下和自底向上相结合,从两头向中间逼近的混合式组装方法,被形象称之为“三明治”方法。“三明治三明治”方法的步骤方法的步骤n步骤:1)对上层模块采取自顶向下测试;2)对关键模块或子系统采取自底向上测试。n混合式的“三明治”方法,综合了自顶向下、自底向上两种方法的长处,扬了长避了短。n例如,对关键模块采取自底向上测试,就可能把输入输出模块提前组装进程序,使设计测试用例变得较为容易;或者使具有重要功能的模块早点与有关的模块相连,以便及早暴露可能存在的问题。除关键模块及少数与之相关的模块外,对其余模块尤其是上层模块仍采取自顶向下的测试方法,以便收到较早显示程序总体轮廓的效果。合格性测试n根据软件需求规格说明中定义的全部功能、性能、可靠性等需求,测试整个软件是否达到要求。合格性测试内容n功能测试n性能测试n资源和余量测试n边界测试n操作测试n外部接口测试n强度测试n可靠性测试n安全性测试n恢复性测试n安装性测试n移植性测试n保密性测试n回归测试功能测试功能测试n根据功能需求进行测试,以确认软件与软件功能需求的一致n功能测试应达到以下要求:a.每一个软件功能都必须被测试用例或被认可的异常所覆盖(或由于异常情况的出现而未达到期望的覆盖,但该异常已被测试者认识到,并进行了处理);b.用一系列合理的数据类型和数据值运行,测试软件在正常、超负荷、饱和和其它“最坏”情况下的结果;c.用假想的数据类型和数据值运行,以测试软件排斥不规则(非法)输入的能力。性能测试性能测试n对软件是否与所需定量的性能需求一致进行确认。n包括:a.软件在获得定量结果时计算的精确性;b.有时间要求的软件,其实际的运行时间;c.软件完成功能所能处理的数据量;d.软件各部分的协调性;e.其它性能指标。资源和余量测试资源和余量测试n测试是否符合软件需求规格说明中提出的处理时间、储存空间和内存、输入输出通道等资源使用的要求,并在设计中为这些资源留出了余量。n通常情况下,应保证在储存空间和内存,输入输出通道,以及处理时间的占用上至少有的余量。边界测试边界测试n测试软件在输入域和(或)输出域、数据结构、状态转换、过程参数、功能界限等边界点或端点情况下的运行状态。操作测试操作测试n操作测试包括对用户接口、人机接口和人机交互要求的所有测试。n应以常规操作、非常规操作、误操作、快速操作等情况来检验界面的可靠性。n操作测试工作还包括对照软件使用说明,逐条进行相应的操作,以检测软件使用说明的完整性、正确性、与软件程序的一致性。外部接口测试外部接口测试n确认软件与其外部接口要求的一致性。n测试内容:a.测试所有外部接口,检测接口信息的格式和内容。b.对每一个外部输入输出接口应进行正常和异常情况测试。n如果软件不能在运行环境中测试,则有必要使用模拟程序或其它测试工具。强度测试强度测试n强度测试是在预先规定的一段时间内,在软件设计的极限状态下,进而在超设计能力的状态下,运行软件以测试软件的所有功能。n可以允许在饱和点上性能降级,但必须保证仍能顺利运行。可靠性测试可靠性测试n软件可靠性测试是以能获得可用来评估软件可靠性的数据为目的的一种软件测试。n例如,基于软件运行剖面设计软件测试用例,并用这些测试用例按出现概率进行随机输入以模拟软件真实运行状态,运行软件以获得失效数据,进而给出软件的可靠性度量,这就是一种软件可靠性测试。n软件运行剖面是指:1)软件运行期间执行各个任务的事件和各事件相应概率的集合。2)系统使用条件的一种定义,系统输入值用其按时间或在可能输入范围中以概率分布来定义。安全性测试安全性测试n针对程序中危险防止和危险处理设施进行的测试,以验证其是否有效。n安全性测试应包括下面的工作:a.全面检验软件在软件需求规格说明中规定的防止危险状态措施的有效性和在每一个危险状态下的反应;b.对软件设计中用于提高安全性的结构、算法、容错、冗余、中断处理等方案,进行针对性测试;c.在异常条件下测试软件,以表明不会因可能的单个或多个输入错误而导致不安全状态。d.用错误的安全性关键操作进行测试,以验证系统对这些操作错误的反应;e.对安全性关键的软件单元和软件部件,要单独进行加强的测试,以确认其满足安全性需求。恢复性测试恢复性测试n对有恢复或重置(RESET)功能的软件,应专门对每一类导致恢复或重置的情况进行测试,以确认恢复或重置功能。安装性测试安装性测试n按规程进行安装正确性测试,包括参数装订、程序加载等。移植性测试移植性测试n在所有要求的移植环境中运行软件以验证软件的移植性。保密性测试保密性测试n验证软件是否提供了软件需求规格说明中规定的保密机制,使软件的机密性、完整性和有效性不被破坏。回归测试回归测试n回归测试是一种选择性重新测试,目的是检测系统或系统组成部分在修改期间产生的缺陷,用于验证已进行的修改并未引起不希望的有害效果,或确认修改后的系统或系统组成部分仍满足规定的要求。Alpha测试和Beta测试n开发者想预见用户的使用过程是不可能的n对于通用软件产品,让每个用户都进行接收(验收)测试是不切实际的n采用Alpha测试和Beta测试来发现只有最终用户才能发现的问题nAlpha测试:由一个用户在开发者的场所、在开发者指导下进行测试nBeta测试:由最终用户在一个或多个用户场所单独地进行测试系统测试n软件与与系统中其它的软、硬件对接并测试其接口的过程n系统测试的目的,是在真实的系统工作环境下检验软件是否能与系统正确连接,并确认软件是否与用户需求(系统需求)一致系统测试内容n安装性测试n功能测试n性能测试n操作测试n外部接口测试n安全性测试:注意进行硬件和软件在各种故障模式下的测试;最坏配置情况下的测试;错误操作情况下的测试;多机系统出现故障切换时,系统的功能、性能连续平稳性测试n性能强度测试n降级能力强度测试独立(第三方)测试n第三方指的是与软件项目甲方、乙方相对独立的其它机构。n进行独立测试的目的是进一步加强软件质量保证工作,提高软件的质量,并对软件产品进行客观评价。n进行第三方独立测试通常有以下优点:1)发挥专业技术优势;2)发挥独立性优势;3)进一步促进承办方的工作。测试方法n静态测试n静态分析n代码审查n代码走查n技术评审n桌面检查n动态测试n白盒测试n控制流覆盖n数据流覆盖n黑盒测试n功能分解n等价类划分n边值分析n因果图n随机测试n猜错法静态测试n代码审查:小组集体阅读讨论检查代码n代码走查:小组集体用“脑”执行并检查代码n桌面检查:由程序员阅读自己编写的程序n技术评审:会议形式讨论检查代码n静态分析:对代码的机械性、程式化的特性分析方法,包括控制流分析、数据流分析、接口分析、表达式分析白盒测试与黑盒测试对比黑盒测试白盒测试优点n适用于各测试阶段n从产品功能角度测试n容易入手生成测试数据n可以构成测试数据使特定程序部分得到测试n有一定的充分性度量手段n可获得较多工具支持缺点n某些代码段得不到测试n如果规格说明有误则无法发现n不易进行充分性度量n不易生成测试数据n无法对未实现规格说明得部分测试n工作量大,通常只用于单元测试,有引用局限性质是一种确认技术,回答“我们在构造一个正确得系统吗?”是一种验证技术,回答“我们在正确地构造一个系统吗?”白盒测试n控制流测试n语句覆盖n分支覆盖n条件覆盖n条件组合覆盖n路径覆盖n数据流测试n全定义使用路径n全使用路径n全定义路径n数据流异常状态图测试覆盖率测试覆盖率n采用白盒法进行测试时,考虑的是测试用例对程序内部逻辑的覆盖程度。n最彻底的白盒法是覆盖程序中的每一条路径,但这往往大到无法实现。n因此采用其它一些标准来量度覆盖的程度,并希望覆盖程度尽可能高些。例子func(intA,B,X)if(A1)&(B=0)X:=X/A;if(A=2)|(X1)X:=X+1;A1andB=0A1andB=0X=X/AX=X/AYESYESNONOabced流图符号语句覆盖语句覆盖n语句覆盖:选择足够的测试用例,使得程序中每个语句至少都能被执行一次。n语句覆盖率:已执行的可执行语句占程序中可执行语句总数的百分比。语句覆盖例n取A=2,B=0,X=3A1andB=0A1andB=0X=X/AX=X/AYESYESNONOabced分支覆盖分支覆盖n分支覆盖又称判定覆盖。n分支覆盖:执行足够的测试用例,使得程序中每个判定都获得一次“真”值和“假”值,或者说使得程序中的每一个分支至少都通过一次。n分支覆盖率:已取过“真”和“假”两个值的判定占程序中所有条件判定个数的百分比。分支覆盖例nA=3,B=0,X=1n沿路径acd执行nA=2,B=1,X=3n沿路径abe执行A1andB=0A1andB=0X=X/AX=X/AYESYESNONOabced条件覆盖条件覆盖n条件覆盖:执行足够的测试用例,使得判定中的每个子条件都获得所有可能的结果。条件覆盖例n共有四个条件:A1,B=0,A=2,X1nA=2,B=0,X=4n沿路径ace执行nA=1,B=1,X=1n沿路径abd执行A1andB=0A1andB=0X=X/AX=X/AYESYESNONOabced分支分支/条件覆盖条件覆盖n分支/条件覆盖:执行足够的测试用例,使得判定中每个子条件取到各种可能的值,并使每个判定取到各种可能的结果。分支/条件覆盖例n做练习A1andB=0A1andB=0X=X/AX=X/AYESYESNONOabced条件组合覆盖条件组合覆盖n条件组合覆盖:执行足够的测试用例,使得每个判定中各条件的所有可能的组合都出现一次。条件组合覆盖例n共有8种条件:A1,B=0A1,B0A1,B=0A1,B0A=2,X1A=2,X1A2,X1A2,X1nA=2,B=0,X=4()nA=2,B=1,X=1()nA=1,B=0,X=2()nA=1,B=1,X=1()A1andB=0A1andB=0X=X/AX=X/AYESYESNONOabced路径覆盖路径覆盖n路径覆盖:执行足够的测试用例,使程序所有可能的路径都获得通过。路径覆盖例n四条路径:ace,abd,abe,acdnA=2,B=0,X=3(ace)nA=1,B=0,X=1(abd)nA=2,B=1,X=1(abe)nA=3,B=0,X=1(acd)A1andB=0A1andB=0X=X/AX=X/AYESYESNONOabced覆盖率要求覆盖率要求n对单元测试来说,语句覆盖和分支覆盖是最基本的要求。n由于程序中错误(异常)处理工作的重要性以及其结构相对简单,要求错误处理要做到路径覆盖。n对质量要求高的软件单元,可根据情况提出条件覆盖、分支条件覆盖、条件组合覆盖以及其它更高的覆盖要求。控制流测试的测试用例生成n经验测试法n通过研究程序选择初始测试用例n通过测试执行和覆盖率统计增加测试用例n不断运行直至达到要求的测试覆盖率n与黑盒测试结合n纯粹白盒测试方法n列出为实现覆盖所需的全部路径n根据每个路径设计测试用例n注意测试零次循环、一次循环和最大次数循环黑盒测试n功能分解n等价类划分n边值分析n因果图n猜错法功能分解n使用功能抽象的方法把程序分解为功能单元n使用数据抽象的方法产生测试每个功能单元的数据n注意测试功能序列组合和输入数据组合等价类划分n将输入数据域划分各自具有典型代表意义的有限个等价类,从每个等价类中产生一些代表性测试用例n输入范围的左、中、右n各个离散类别n不同的处理方式n注意划分有效等价类和无效等价类n设计一些仅覆盖一个等价类的测试用例边值分析n经验表明,程序在边界处的处理常常是关键的,也是容易发生错误的n使用正好等于、小于、大于边界值的数据进行测试,发现错误的概率较大,这就是边值分析技术n使用原则:n如果输入条件规定了取值范围或数据个数,则可选择正好等于边界值、刚刚在边界范围内和刚刚超越边界外的值进行测试n针对规格说明的每个输入条件,使用上述原则n对于有序数列,选择第一个和最后一个因果图n通过画因果图,把用自然语言描述的功能说明转换为判断表,然后为判断表的每一列设计一个测试用例:n分析规格说明,引出原因(输入条件)和结果(输出条件),并进行标识n建立连接各个原因和各个结果的因果图n标注不可能出现的原因和结果组合情况n将因果图转换为决策表n对每一列建立一个测试用例随机测试n从所有可能的输入值中随机选取测试输入数据的方法n使数据在规定的取值范围内并服从预期的概率分布n基于运行剖面的测试方法是可靠性测试的主要方法n预期结果可以由人工或定性的方法确定n是强度测试的有效手段猜错法n列出所有可能有的错误和易错情况表,基于该表设计测试用例n有力的补充n充分发挥敏锐、经验等能力n直接切入可能的错误,直接定位n需要丰富的经验和领域知识测试产品(文档)n测试计划n测试说明n测试报告n测试用例单n测试记录n问题报告单软件测试计划1范围1.1标识1.2系统概述1.3文档概述1.4与其它计划的关系2引用文档3软件测试环境3.1软件项3.2硬件和固件项3.3权限3.4安装、测试和控制4 正式合格性测试4.X CSCI名称和项目唯一标识号4.总体测试要求4.测试级4.测试类4.测试定义4.测试名称和项目唯一标识号4.测试进度5 数据记录、整理和分析软件测试说明1范围1.1标识1.2系统概述1.3文档概述1.4与其它计划的关系2引用文档3正式合格性测试准备3.X测试名称和项目唯一标识号3.X.1计划3.X.2测试准备过程3.X.2.1硬件要求3.X.2.2软件准备3.X.2.3其它测试准备4正式合格性测试说明4.X测试名称和项目唯一标识号4.X.Y测试用例名称和项目唯一标识号4.X.Y.1需求可追踪性4.X.Y.2初始化4.X.Y.3测试输入4.X.Y.4预期测试结果4.X.Y.5评估测试结果的标准4.X.Y.6测试过程4.X.Y.7前提和约束软件测试报告1范围1.1标识1.2系统概述1.3文档概述1.4与其它计划的关系2引用文档3测试概述3.1正式合格性测试名称及项目的唯一标识号3.1.1小结3.1.2测试记录4测试结果4.X正式合格性测试名称及项目的唯一标识号测试结果4.X.Y测试用例名称和项目唯一标识号4.X.Y.1测试结果4.X.Y.2测试过程中的差异情况5CSCI评估和建议5.1CSCI评估5.2改进建议测试用例单标识设计者设计完成日期测试特性测试数据测试过程预期结果测试记录表测试用例标识测试完成日期结果问题报告单软件问题报告编号日期提出人1软件项标题:2软件项版本/发布号:3优先级:关键紧急常规(划出选择)4问题描述:5环境描述:6建议解决办法:7评审决定:8备注:谢谢!68389085(O)68389504(H)