《单元测试与集成测试.ppt》由会员分享,可在线阅读,更多相关《单元测试与集成测试.ppt(62页珍藏版)》请在三一办公上搜索。
1、第五讲:单元测试与集成测试,0C202 Software Testing,5-1,提纲,导言 单元测试单元测试考虑事项单元测试规程 单元测试局限性 集成测试自顶向下集成自底向上集成 混合式集成 端到端集成测试,0C202 Software Testing,5-2,导言(1/2),按阶段进行测试是一种基本的测试策略。单元测试(大量使用白盒测试)。集成测试(大量使用黑盒测试,白盒测试辅助);系统测试(软、硬件环境)确认测试(按照需求确认),0C202 Software Testing,5-3,提纲,导言 单元测试单元测试考虑事项单元测试规程 单元测试局限性 集成测试自顶向下集成自底向上集成 混合式
2、集成 端到端集成测试,0C202 Software Testing,5-4,单元测试,单元测试(Unit testing)是对最小的软件设计单元(模块或源程序单元)的验证工作。面向过程的设计:一个单元可能是单独的程序、函数、过程、网页以及菜单等。面向对象的设计:单元是类,可能是基/父类、抽象类或派生/子类。,0C202 Software Testing,5-5,单元测试,使用构件级别的设计规格说明书作为指南,对重要的控制路径进行测试以发现模块内的错误。重点放到内部处理逻辑和构件边界内的数据结构。这种测试可以对多个构件并行进行。通常情况下,由开发者执行测试而不是由最终用户执行测试,主要使用白盒测
3、试技术,并辅助使用黑盒测试技术,如边界值分析法。,0C202 Software Testing,5-6,单元测试考虑事项,单元测试对构件的五方面进行测试:模块或构件接口;局部数据结构;边界条件;独立路径;处理错误的路径。,0C202 Software Testing,5-7,模块或构件接口,对模块接口的测试保证在测试时进出程序单元的数据流是正确的,接口名称,传入参数的个数、类型、顺序等是否与模块接口匹配;模块输出或返回值或类型是否正确。重点关注模块之间的数据输入与输出,优先开展穿越模块接口的数据流的测试。,0C202 Software Testing,5-8,局部数据结构,对局部数据结构的检查
4、保证临时存储的数据在算法执行的整个过程中都能维持其完整性。另外,应该测试局部数据结构,并在单元测试时确认对于全局数据的局部影响执行。,0C202 Software Testing,5-9,边界条件,保证模块在所限定或约束处理的条件边界上能够正确执行。边界条件的测试是利用黑盒测试技术中的边界值分析法。,0C202 Software Testing,5-10,独立路径(1/3),覆盖控制结构中的独立路径(基本路径)。关注循环测试。,0C202 Software Testing,5-11,独立路径(2/3),计算中常见的错误有:(1)误解的或者不正确的算术优先级;(2)混合模式的操作;(3)不正确的
5、初始化;(4)精度不够精确;(5)表达式的不正确符号表示。,0C202 Software Testing,5-12,独立路径(3/3),比较和控制流是紧密地耦合在一起的(也就是说,控制流的转移是在比较之后发生的),测试用例应当能够发现下列错误:(1)不同数据类型的比较;(2)不正确的逻辑操作或优先级;(3)应该相等的地方由于精度的错误而不能相等;(4)不正确的比较或者变量;(5)不正常的或者不存在的循环中止;(6)当遇到分支循环的时候不能退出;(7)不适当地修改循环变量。,0C202 Software Testing,5-13,处理错误的路径(1/2),对所有处理错误的路径进行测试(Try C
6、atch,Throw处理机制)。好的软件设计中错误条件是可以预料的,而且当错误真的发生的时候,错误处理路径被建立,以重定向或者干脆终止处理。但要避免把错误处理过程加到软件中去,但从不进行测试。,0C202 Software Testing,5-14,处理错误的路径(2/2),在错误处理部分应当考虑的潜在错误:(1)对错误描述费解。(2)所报的错误与真正遇到的错误不一致。(3)在错误处理之前错误条件先引起系统干涉造成系统异常。(4)例外条件处理不正确。(5)错误描述没有提供足够的信息来帮助确定错误发生的位置(程序设计中建立错误日志、运行日志、出错信息表)。,0C202 Software Test
7、ing,5-15,单元测试规程(1/5),单元测试通常看成为是附属于编码步骤。在源代码级的代码被开发、复审、和语法正确性验证之后,单元测试用例设计就开始了。对设计信息的复审可能能够为建立前面讨论过的每一类错误的测试用例提供指导,每一个测试用例都应当和一系列的预期结果联系在一起。,0C202 Software Testing,5-16,单元测试规程(2/5),开发驱动器(driver)或/和程序桩(stub)。在面向对象的程序里,模仿对象(mock objects)技术取代程序桩(stub)。模仿对象是以一种可控方式来模拟真实对象行为的仿真对象。(模仿外接数据源),0C202 Software
8、Testing,5-17,单元测试规程(3/5),驱动器和程序桩都是单元测试中的额外的开销,必须开发但又不和最终软件一起交付。驱动器和程序桩的简单程度反映了模块设计高内聚、低耦合的程度。,0C202 Software Testing,5-18,单元测试规程(4/5),单元测试通常是被自动执行,但可能仍由手工进行的。自动化方法能有效地实现隔离一个单元并验证其正确性。,0C202 Software Testing,5-19,单元测试规程(5/5),成为程序员创建具有松偶合高内聚代码体的一个动力。设计模式、单元测试和重构常结合使用以便形成最理想解决方案。,0C202 Software Testing
9、,5-20,单元测试局限性,单元测试不能捕获程序中的每一个错误。根据定义,单元测试只测试单元自身的功能。因此它不捕获集成错误、性能问题或其它任何系统范围的问题。另外,要预料现实中被测程序可能接受到的输入的所有特殊情况是一项不易之事。对于任何非平凡的软件块要测试所用的输入组合是不现实的。,0C202 Software Testing,5-21,提纲,导言 单元测试单元测试考虑事项单元测试规程 单元测试局限性 集成测试自顶向下集成自底向上集成 混合式集成 端到端集成测试,0C202 Software Testing,5-22,集成测试(1/3),单独的软件模块被结合在一起,作为一个群接受测试。什么
10、时候进行集成测试?(1)由若干单元或模块要组成一个构件;(2)由若干构件组成为一个工件;(3)由若干工件组成为一个系统。集成测试被定义为在单元测试与系统测试之间级别的测试。,0C202 Software Testing,5-23,集成测试(2/3),接口连接问题:数据可能在通过接口的时候丢失;一个模块可能对另外一个模块产生无法预料的副作用;当子函数被联到一起的时候,可能不能达到期望中的功能;累计单个模块中可以接受的不精确性;全局数据结构可能也会存在问题。,0C202 Software Testing,5-24,集成测试(3/3),集成测试构造程序并实施测试以发现与接口连接有关的错误,目标是把通
11、过了单元测试的模块拿来,构造一个在设计中所描述的程序结构。有两种集成测试策略:瞬时集成测试和增量集成测试。,0C202 Software Testing,5-25,瞬时集成测试(1/2),经历单元测试阶段,把模块组合成一个最终系统,并观察它是否运转正常。难于定位错误。错误修正过程中错误无限循环。,0C202 Software Testing,5-26,瞬时集成测试(2/2),开发小程序的时候都会用到瞬时集成测试技术,但对大型程序不太适用。瞬时集成方法有这样几个缺点:(1)对独立组件测试需要驱动程序和树桩程序的支持;(2)由于组件一次性结合,很难找出错误的原因;(3)不容易辨别接口错误和其他类型
12、的错误。所以,我们推荐使用增量集成策略。,0C202 Software Testing,5-27,增量集成,程序先分成小的部分进行构造和测试,这个时候错误比较容易分离和修正;接口也更容易进行彻底地测试;而且也可以应用一种系统化的测试方法。增量集成测试会有格外的开销,但会大大减少发现和改正错误的时间。,0C202 Software Testing,5-28,0C202 Software Testing,5-29,自顶向下的集成集成方式:深度优先、广度优先,自顶向下集成,在现实中一般是结合使用深度优先、宽度优先进行测试。初始阶段所有的模块可能只是提供部分功能,这可以用宽度优先技术进行测试。当模块越
13、来越精化,模块的功能也越来越全,可以对一个模块进行深度优先测试而同时所有的模块进行宽度优先测试。,0C202 Software Testing,5-30,自顶向下集成,集成过程:主控模块作为测试驱动器,所有的程序桩由直接隶属于主控模块的各模块替换。根据深度或广度优先,子模块的程序桩依次地被替换为真正的模块。在每一个模块集成的时候都要进行测试。在完成了每一次测试之后,又一个程序桩被真正的模块替换。可以用回归测试来保证没有引进新的错误。循环继续进行,直至这个系统结构被构造完成。,0C202 Software Testing,5-31,自顶向下集成,自顶向下的优点:(1)对高层行为进行早期确认:(2
14、)至多只需一个驱动程序;(3)每步可以只加一个模块;(4)支持深度优先和宽度优先。自顶向下的缺点:(1)对低层行为确认比较晚;(2)对缺少的元素需要编写树桩程序;(3)测试案例的输入和输出可能很难明确表示。,0C202 Software Testing,5-32,自底向上集成(1/3),一旦各个独立的模块测试完毕,把它们组合起来形成一组模块,称为造件(build)。一组造件再由第二个测试装置进行测试。这个过程将继续直到造件中包括整个应用系统。因为自底向上集成,在进行时要求所有隶属于某个给定层次的模块已经开发,不再需要程序桩。,0C202 Software Testing,5-33,自底向上集成
15、(2/3),步骤:低层模块组合成能够实现软件特定子功能的造件(builds),有时也称为簇(clusters)。编写测试装置(供测试用的控制程序)来协调测试用例的输入输出。对簇进行测试。撤去测试装置,沿着程序结构的层次向上对造件进行组合。,0C202 Software Testing,5-34,0C202 Software Testing,5-35,自底向上的集成示例,自底向上集成(3/3),优点:(1)对底层行为早期进行确认;(2)不需要写程序桩;(3)对一些子树而言比较容易明确表示输入,比较容易解释对其他的输出。缺点:(1)推迟对高层行为的确认;(2)需要驱动程序;(3)当组合子树的时候,
16、一大堆元素要进行集成。,0C202 Software Testing,5-36,混合式集成(1/2),结合了自顶向下和自底向上。如:小组或个人可以对自己开发的模块采用自底向上测试,然后再由集成小组进行自顶向下测试。,0C202 Software Testing,5-37,混合式集成(2/2),步骤:用程序桩独立地测试用户界面。用驱动程序测试最低层功能模块。集成整个系统对中间层进行测试。,0C202 Software Testing,5-38,0C202 Software Testing,5-39,混合式集成示例,三种增量测试策略的比较,0C202 Software Testing,5-40,混
17、和增量集成,风险驱动:从最关键或最复杂的模块开始进行集成,逐步加入它们调用或被调用的模块。进度驱动:一旦模块就绪,比如,以某种方式可以获得或编码完成,就马上进行集成。功能或线程驱动:选择跟某一个功能或线程有关的模块进行集成,逐步加入其他功能或线程。,0C202 Software Testing,5-41,端到端集成测试(1/3),端到端集成测试从最终用户的角度出发,强调对系统或应用程序进行端到端的功能测试。这一测试过程用于验证由一组相互连接的系统形成的集成系统是否正常运行,其中每个被连接的系统现在是集成系统的一个子系统。一般是面向大型系统。假设子系统的模块(或单元)测试和集成测试都已被执行并得
18、到认可,但可能依然存在未被观察到的错误其中集成测试可能包括多层次的集成测试。,0C202 Software Testing,5-42,端到端(E2E)集成测试(2/3),提供以下功能:辅助生成测试用例,改进软件项目的生产率支持风险分析,通过确定风险领域从而进行全面的测试支持变化管理,使回归测试和波漪效应测试可以被正确和有效的执行支持数据质量评估,决策者可以从数量上客观的评估测试成果支持远程项目管理和分布式协作,工程师和项目经理可以通过网络一起工作,0C202 Software Testing,5-43,端到端集成测试(3/3),终端到终端(E2E)的测试过程:测试计划:确定主要任务及与其相关的
19、进度安排和资源测试设计:开发测试规范、测试场景、测试案例和测试进度表测试执行:执行测试案例和文档结果测试结果分析:分析测试结果覆盖率,评估测试并确定过失重新测试和回归测试:在改进后的系统上进行附加测试,0C202 Software Testing,5-44,E2E集成测试计划,E集成测试计划的核心是确定集成系统的范围,包括系统构架和功能;确定处理方法和工具以便于完成集成测试,并在实际测试之前制定结果评估标准。(P94),0C202 Software Testing,5-45,E2E集成测试设计,E2E测试设计包括在测试环境下定义集成系统的任务和定义测试程序的任务。可以通过如下两种观点来定义被测
20、的集成系统:(1)E2E功能视图;(2)结构视图,包括物理结构和逻辑结构。通过一个细线程树及所附条件来给出被测系统规范。,0C202 Software Testing,5-46,细线程(thin thread)(1/2),定义:一个完整的数据或消息的踪迹,使用最低限度的具有代表性质的外部输入数据样本,通过系统的内部的相互连接部分的转换,产生最低限度的具有代表性质的外部输出数据样本.使用细线主要是用来阐释某一方法具有指定的功能的.细线程是集成的系统中最小的场景,从最终用户角度看,它是一个完整的场景,系统接受输入数据,经过计算,并输出处理的结果。它描述了整个场景,而且只描述一个功能。,0C202
21、Software Testing,5-47,细线程(thin thread)(2/2),细线程间的关系,组/子组,一些共享某些公共数据的细线可以组成一个细线组。这些组是具有层次结构的。细线组中的所有细线和子细线组可以构成一棵细线树。树的根是整个被测的集成系统,它的分支节点代表相关的细线集合,它的叶子代表一个具体的细线。,0C202 Software Testing,5-48,E2E集成测试规格书,E2E测试规格书是E2E测试的核心,表述系统需求,从最终用户的角度出发的使用情景,测试观点出发的详细系统行为描述:正常的输入,非正常输入,常规案例和特殊处理。E2E测试规格书是一种半规范化,等级的构架
22、,案例生成的相关数据,追溯到其他软件工件上,主要有两部分信息:细线程和条件。,0C202 Software Testing,5-49,细线程的定义模版:ID、名字、描述、输入/输出、前提条件/后续条件、隐藏的成分、状态、代理以及风险。细线程组:一组具有特定公共部分的细线程的集合,递归分组,重组为一个树结构。细线程树:自顶向下构建,按功能性进行分解;自低向上构建,利用提取和合成。,0C202 Software Testing,5-50,细线程的发现方法,通过条件分析发现新的细线程,通过发现不完全/不一致的条件,发现附属于矛盾条件的细线程。,0C202 Software Testing,5-51,
23、条件定义模版:ID、名字、描述、受影响的细线程等。条件组:具有特定公共属性的条件的集合。递归分组,重组为一个树结构。条件树,自顶向下分解,自底向上提取和合成。条件间的关系:独立条件,互斥条件,引发/被引发的条件。相关条件。,0C202 Software Testing,5-52,E2E集成测试风险分析,风险分析是系统和软件开发中的一项重要活动。基于风险分析,系统的临界条件可以被彻底的测试。当资源有限的时候,测试应该把那些重要的线程放在首位。一种排列细线程的方法是至少基于以下两种因素给每一个细线程分配一个风险。系统可能舍弃一个已给定的细线程。,0C202 Software Testing,5-5
24、3,下面几个构件常有很高的失败可能性:在先前的模块或综合测试中就显现出不可靠性的成分具有复杂的实现过程或者具有合并的复杂功能的成分与许多其他成分相连的成分由于错误或功能的变更而最近刚刚修改过的成分,0C202 Software Testing,5-54,E2E测试执行,测试执行准备。识别出以下组件:要测的子系统;支持系统:包括硬件,固件,数据库,第3方组件,确保子系统合适地执行。备份系统和程序,保持系统可恢复性;测试数据,包括测试输入数据,数据库,执行测试案例所需要的文件;测试工具,包括自动输入数据生成工具,测试驱动,测试结果记录工具;测试组;,0C202 Software Testing,5
25、-55,模仿环境下进行E2E测试,在模仿环境下的步骤:开发或取得模拟程序,把模拟程序的参数调成跟要测试的系统一样;执行应用系统;选择测试案例,生成输入数据,记录执行结果;重复选择和执行测试案例的过程,在必要的时候恢复系统和模拟状态,直到所有安排的测试案例执行了为止。,0C202 Software Testing,5-56,操作环境中进行E2E测试,在操作环境中进行E2E测试包括以下步骤:建立环境,调用应用系统,选择测试案例,根据系统外部接口生成输入数据;重复选择和执行测试案例的过程,在必要的时候恢复系统和模拟状态,直到所有安排的测试案例执行了为止。退出标准,所有的测试用例都被执行,测试覆盖率要
26、求被满足,0C202 Software Testing,5-57,测试结果分析,缺陷识别和改正,缺陷是当执行的时候可能会产生不正确结果的代码错误。要找出缺陷,测试输出要跟预期输出进行比较。在测试过程中缺陷识别可以被优先并改正。评估波漪效应,软件工件的一部分改动会影响其他相关部分的现象叫做波漪效应,而迭代的分析而且去除改变的副作用的过程就叫做波漪效应分析。,0C202 Software Testing,5-58,波漪效应分析,波漪效应分析过程包括以下步骤:提出软件修改识别依赖于被改变部分的其他模块决定是否要改变依赖部分来保持一致性如果需要改变,从第一步开始循环进行REA如果不需要改变,停止并等待
27、修改软件,0C202 Software Testing,5-59,远程测试(Remote Testing),0C202 Software Testing,5-60,回归测试,回归测试是在修改过的软件上重新运行测试用例,普遍用于软件程序被修改的情况 一个要点就是回归测试只能保证这些应该保留的部分保持不变。需要在不同的层面上进行回归测试,首先是模块测试层面,之后是在集成测试层面,最后是终端到终端测试层面。在回归分析的每一个层面,测试人员有不同的任务。,0C202 Software Testing,5-61,总结,单元测试是测试的基础级别。单元测试着眼于程序或系统的较小组件模块,执行每个模块以证实其履行了指定功能。单元测试的优势在于它容许对小单元的测试和调试,从小单元到大单元的集成过程提供了更好的管理方式。把组件聚合后,必须通过测试确认所有的组件之间能够正确地协作运行。因此集成测试的目标是暴露接口的缺陷,以及聚合后的组件之间相互作用的缺陷。,0C202 Software Testing,5-62,