1、1本章安排8.1“白盒”测试8.2“黑盒”测试8.3“灰盒”测试8.4 测试用例设计8.5 单元测试8.6 集成测试8.7 确认测试8.8 系统测试8.9 动态测试工具介绍1Introduction28.5 单元测试38.5 单元测试3Text in hereTexinherere单元测试单元测试单元测试单元测试单元测试单元测试单元测试单元测试集成集成测试测试确认确认测试测试系统系统测试测试单元单元单元单元单元单元单元单元已测已测单元单元设计设计信息信息组装的组装的软件软件软件软件需求需求确认的确认的软件软件其他系统其他系统元素元素 对单元测试的误解太浪费时间了,现在要赶进度,时间不允许,或者
2、随便做做应付领导软件开发人员不应参与单元测试它仅仅证明代码做了什么我是很棒的程序员,我写的代码肯定没有问题不管怎样,集成测试或系统测试将会抓住所有的bug8.5.1 单元测试的意义单元测试的意义单元测试效率不高太浪费时间了,现在要赶进度,时间不允许,或者随便做做应付领导软件开发人员不应参与单元测试它仅仅证明代码做了什么 单元测试的好处程序最小组成部分可以并行开展规模小,复杂性低做好单元测试后,后续的集成测试和系统测试会很顺利不管怎样,集成测试或系统测试将会抓住所有的bug8.5.1 单元测试的意义单元测试的意义尽早的发现缺陷,降低测试成本惠普国际软件人才基地教材惠普国际软件人才基地教材8.5.
3、2 单元测试的内容单元测试的内容 1 模块接口测试模块各输入的参数数目、属性、类型与对应的形参数目、属性、类型是否一致?传到被调用模块的实际参数的数目、属性、类型是否与被调用模块形式参数的数目、属性、类型相同?8.5.2 单元测试的内容单元测试的内容 1 模块接口测试是否引用了与当前入口无关的参数?用于输入的变量有没有改变?在经过不同模块时,全局变量的定义是否一致?限制条件是否以形参的形式传递?8.5.2 单元测试的内容单元测试的内容使用外部资源时,是否检查可用性并及时释放资源,如内存、文件、硬盘、端口等引用内部函数时,实参的次序和数目是否正确?1 模块接口测试 -外部设备文件的属性是否正确O
4、pen 与 Close 语句是否正确规定的格式是否与 I/O 语句相符缓冲区的大小与记录的大小是否相配合文件结束的条件是否安排好了8.5.2 单元测试的内容单元测试的内容I/O 错误是否检查并做了处理在使用文件前,文件是否打开在输出信息中是否有文字错误文件的属性是否正确缓冲区的大小与记录的大小是否相配合文件结束的条件是否安排好了I/O 错误是否检查并做了处理在使用文件前,文件是否打开 2 局部数据结构测试不正确或不一致的数据类型说明使用尚未赋值或尚未初始化的变量错误的初始值或错误的缺省值变量名拼写错或书写错使用了外部变量或函数全局数据对模块的影响8.5.2 单元测试的内容单元测试的内容数组越界
5、不一致的数据类型非法指针 3 路径测试不同数据类型的比较不正确的逻辑运算符或优先次序因浮点运算精度问题而造成的两值比较不等关系表达式中不正确的变量和比较符当遇到发散的循环时无法跳出循环8.5.2 单元测试的内容单元测试的内容当遇到发散的迭代时不能终止循环“差 1 错”,即不正常的或不存在的循环中之条件错误地修改循环变量 4 错误处理测试出错的描述是否难以理解,是否能够对错误定位显示的错误与实际的错误是否相符对错误条件的处理正确与否在对错误进行处理之前,错误条件是否已经引起系统的干预等出现错误后,是否可以进行错误处理,如引发错误、通知用户、进行记录8.5.2 单元测试的内容单元测试的内容在系统干
6、预前,错误处理是否有效,报告和记录的错误是否真实详细在资源使用前后或其他模块使用前后,程序是否进行错误出现检查 5 边界测试普通合法数据是否正确处理普通非法数据是否正确处理边界内最接近边界的(合法)数据是否正确处理边界外最接近边界的(非法)数据是否正确处理等运算或判断中取最大最小值时是否有错误8.5.2 单元测试的内容单元测试的内容数据流、控制流中刚好等于、大于、小于确定的比较值时是否出现错误在 n 次循环的第 0 次、第 1 次、第 n 次是否有错误148.5.2 单元测试的内容单元测试的内容14各种数据特性覆盖单元的软件特性覆盖re反语句覆盖达到 100%分支覆盖达到 100%错误处理路径
7、达到 100%单元测试要求158.5.3 单元测试方法和步骤单元测试方法和步骤15使用静态分析方法一次就能揭示一批错误,并且随后就可以立即纠正错误使用代码审查技术,一旦发现错误,就知道错误的性质和位置,调试代价较低re使用动态测试技术要准备测试用例,进行结果记录和分析,工作量大,发现错误太多会降低动态测试效率目前的动态测试技术局限性比较大,有相当类型的错误靠动态测试是难以发现的有些错误在动态测试时无法检查到单元测试-静态分析和代码审查168.5.3 单元测试方法和步骤单元测试方法和步骤16IntroductionText in hereTextinherere单元测试方法178.5.3 单元测
8、试方法和步骤单元测试方法和步骤17 单元测试步骤构造测试用例的运行环境设计设计“黑盒黑盒”测试用例测试用例设计“白盒”测试用例(覆盖测试用例)注意,在进行“白盒”测试期间,不要匆忙地删除所发现的死代码或者冗余代码,因为这很可能导致错误的产生。因为在测试别人的代码时,很可能由于测试用例不够,或者没有对被测程序整体结构的把握,而出现错误理解。188.5 总结为什么进行单元测试单元测试内容单元测试的方法单元测试的步骤19作业1.软件开发过程必须进行单元测试吗?2.不同模块,单元测试的优先级、粒度如何选择?3.单元测试和集成测试是并行的还是串行的?4.单元测试是否是测试生命周期中必须的步骤?208.6
9、 集成测试 为什么要开展集成测试把各个单元模块连接起来的时候,穿越模块接口的数据是否会丢失一个单元模块的功能是否会对另一个单元模块的功能产生不利的影响各个子功能组合起来,能否达到预期要求的父功能全局数据结构是否有问题共享资源访问是否有问题8.6.1 集成测试的概念单个模块的误差积累起来,是否会放大,从而达到不能接受的程度引入一个模块后,是否对其他与之相关的模块产生负面影响 集成测试有以下不可替代的特点单元测试对于模块间接口信息内容的正确性、相互调用关系是否符合设计无能为力。只能靠集成测试来进行保障同系统测试相比,由于集成测试用例是从程序结构出发的,目的性、针对性更强,测试发现问题的效率更高,定
10、位问题的效率也较高能够较容易地测试到系统测试用例难以模拟的特殊异常流程,从纯理论的角度来讲,集成测试能够模拟所有实际情况定位问题较快,由于集成测试具有可重复性强、对测试人员透明的特点,发现问题后容易定位,所以能够有效地加快进度,减少隐患8.6.1 集成测试的概念 集成测试在软件分级测试中的意义在单元测试和系统测试间起到承上启下的作用,既能发现大量单元测试阶段不易发现的接口类错误,又可以保证在进入系统测试前及早发现错误,减少损失(事实上,对系统而言,接口错误是最常见的错误);能够较容易地测试到系统测试用例难以模拟的特殊异常流程,从纯理论的角度来讲,集成测试能够模拟所有实际情况8.6.1 集成测试
11、的概念 集成测试在软件分级测试中的意义8.6.1 集成测试的概念 集成测试的内容集成后的功能性测试接口测试全局数据结构测试资源测试(共享资源测试和资源极限测试)性能测试8.6.1 集成测试的概念稳定性测试 集成测试的步骤体系结构分析模块分析接口分析风险分析可测试性分析8.6.1 集成测试的概念集成测试策略分析一次性组装8.6.2 集成测试方法渐增式组装自自顶顶向下向下自底向上自底向上深度深度深度深度288.6.2 集成测试方法28集成策略优点缺点非递增式不需要设计开发测试工具复杂系统,故障定位困难类似系统测试,难以发挥集成测试的优势单元测试中,不必关心模块次序递增式测试层次清晰,可以快速定位问
12、题需开发驱动模块和桩模块单元测试需考虑模块次序单元测试和集成测试可以并行进行需考虑模块组装优先级298.6.2 集成测试方法29 自顶向下的原则关键模块能尽早地组装关键模块是:一个复杂的模块,或者包含有新的算法的模块,又或者是怀疑有错误的模块尽早使I/O 模块加入序列,形成输入处理输出的骨架,会使以后的测试工作简化,并减少测试的辅助性工作和人为因素所造成的测试错误和问题 自顶向下组装测试的具体步骤以主控模块作为测试驱动模块,把对主控模块进行单元测试时引入的所有桩模块用实际模块替代依据所选的集成策略以及新模块的选择原则,每次用一个实际单元替换一个被调用的桩模块,并开发该单元可能需要的桩模块每集成
13、一个模块的同时立即进行测试判断系统的组装测试是否完成,若没有完成则转到循环进行直到集成结束。8.6.2 集成测试方法 自顶向下组装测试的优点8.6.2 集成测试方法在测试过程早期,对主要的控制点或判决点进行检验只有在个别情况下才需要驱动程序,减少了测试驱动程序开发和维护的费用选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能每集成一个模块的同时立即进行测试判断系统的组装测试是否完成能够较早地验证功能可行性,给开发者和用户带来成功的信心可以和开发设计工作一起并行执行集成测试,能够灵活地适应目标环境容易进行故障隔离和错误定位 自顶向下组装测试的缺点在测试时需要为每个模块的下层模块提供桩
14、模块,桩模块的开发和维护费用大底层组件的需求变更可能会影响到全局组件,需要修改整个系统的多个上层模块要求控制模块具有比较高的可测试性在测试较高层模块时,低层处理采用桩模块替代,不能反映真实情况,重要数据不能及时回送到上层模块,可能导致测试不充分。8.6.2 集成测试方法 自顶向下组装测试的解决方案把某些测试推迟到用真实模块替代桩模块之后进行开发能模拟真实模块的桩模块8.6.2 集成测试方法在极限编程(Extreme Programming)中使用测试优先的开发方法 自顶向下组装测试的适用范围控制结构比较清晰和稳定的应用程序系统高层的模块接口变化的可能性比较小产品的低层模块接口还未定义或可能会经
15、常因需求变更等原因被修改产品中的控制模块技术风险较大,需要尽可能提前验证需要尽早看到产品的系统功能行为8.6.2 集成测试方法 自底向上组装测试的具体步骤开发一个测试驱动模块,由驱动模块控制最底层模块的并行测试;也可以把最底层模块组合成实现某个子功能的模块群,由驱动模块控制它进行测试用真实模块代替驱动模块,与它已经通过测试的下属模块组装成为完成更大功能的新模块群。每集成一个模块的同时立即进行测试判断程序组装的过程是否已经达到主模块,如果是则代表完成组装结束测试,否则从(1)开始循环执行直到组装结束8.6.2 集成测试方法 自底向上组装测试的优点由于驱动模块模拟了所有调用参数,测试模块返回结果不
16、影响驱动模块,生成测试数据也没有困难可以尽早地验证底层模块的行为,如果关键模块是在结构图的底部,自底向上的测试是有优越性的自底向上的组装测试不必开发桩模块,提高了测试效率对实际被测模块的可测试性要求要少,容易对错误进行定位。8.6.2 集成测试方法 自底向上组装测试的缺点当最后一个模块尚未测试时,还没有呈现出被测软件系统的雏形只有到测试过程的后期才能发现时序问题和资源竞争问题驱动模块的设计工作量大不能及时发现高层模块设计上的错8.6.2 集成测试方法 自底向上组装测试的适用范围底层模块接口比较稳定的产品高层模块接口变更比较频繁的产品底层模块开发和单元测试工作完成较早的产品8.6.2 集成测试方
17、法 混合渐增式集成测试方法(或称三明治集成方法)衍变的自顶向下的渐增式测试自底向上自顶向下的渐增式测试回归测试组装测试8.6.2 集成测试方法 衍变的自顶向下的渐增式测试8.6.2 集成测试方法1)强化对输入/输出模块和引入新算法模块进行测试,自底向上组装成为功能相当完整且相对独立的子系统,2)然后由主模块开始自顶向下进行渐增式测试。自底向上自顶向下的渐增式测试8.6.2 集成测试方法1)首先对含读操作的子系统自底向上直至根节点模块进行组装和测试2)然后对含写操作的子系统做自顶向下的组装与测试 回归测试8.6.2 集成测试方法1)这种方式采取自顶向下的方式测试被修改的模块及其子模块,然后将这一
18、部分视为子系统2)再自底向上测试,以检查该子系统与其上级模块的接口是否匹配 组装测试8.6.2 集成测试方法1)测试者应当确定关键模块,对这些关键模块及早进行测试(对该模块及其所在层下面的各层使用自底向上的集成策略2)然后再对该模块所在层上面的层次使用自顶向下的集成策略3)最后对系统进行整体测试)448.6.2 集成测试方法44 混合渐增式集成测试方法的优缺点运用一定的技巧,能够减少桩模块和驱动模块的开发缺点集成之前中间层不能尽早得到充分的测试 优点混合渐增式集成测试方法的适用范围多数软件开发项目都可以应用此集成测试策略 集成测试各阶段集成测试计划阶段(5W)+资源、测试进度及测试用例集成测试
19、设计与开发阶段执行阶段评估阶段8.6.3 集成测试过程 度量数据8.6.3 集成测试过程集成测试对象的数量运行的用例数量通过/失败的用例数量发现的缺陷数量遗留的缺陷数量集成测试执行的工作量 评估工作8.6.3 集成测试过程按照集成测试报告模板出具集成测试报告如有必要对集成测试报告进行评审将所有测试相关工作产品纳入配置管理 集成测试工作开展的原则集成测试是产品研发中的重要工作,需要为其分配足够的资源和时间集成测试需要经过严密的计划,并严格按计划执行;应采取增量式的分步集成方式,逐步进行软件部件的集成和测试应重视测试自动化技术的引入与应用,不断提高集成测试效率应该注意测试用例的积累和管理,方便进行回归并进行测试用例补充8.6.3 集成测试过程 集成测试工作完成的标志成功地执行了测试计划中规定的所有集成测试修正了所有发现的错误测试结果通过了专门小组的评审8.6.3 集成测试过程508.6 总结为什么开展集成测试集成测试的内容集成测试的方法集成测试的步骤集成测试过程 51作业1.软件开发过程必须进行集成测试吗?2.集成策略对集成测试用例设计开发及实施的影响?