


,*,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第三章 单元测试,由安博测试空间技术中心http:/ Down Unit Testing,)的单元测试策略、自底向上的单元测试策略(,Bottom up Unit Testing,)和孤立的单元测试策略自顶向下的单元测试策略,一)步骤:,1.,从最顶层开始,把顶层调用的单元做成桩模块2.,对第二层测试,使用上面已测试的单元做驱动模块3.,依次类推,直到全部单元测试结束二)优点:可以在集成测试之前为系统提供早期的集成途径三)缺点:单元测试被桩模块控制,随着单元测试的不断进行,测试过程也会变得越来越复杂,测试难度以及开发和维护的成本都不断增加;,要求的低层次的结构覆盖率也难以得到保证;由于需求变更或其他原因而必须更改任何一个单元时,就必须重新测试该单元下层调用的所有单元;低层单元测试依赖顶层测试,无法进行并行测试,使测试进度受到不同程度的影响,延长测试周期四)总结:从上述分析中,不难看出该测试策略的成本要高于孤立的单元测试成本,因此从测试成本方面来考虑,并不是最佳的单元测试策略自底向上的单元测试,一)步骤:,1、先对模块调用图上的最底层模块开始测试,模拟调用该模块的模块为驱动模块。
2、其次,对上一层模块进行单元测试,用已经被测试过的模块做桩模块,3、依次类推,直到全部单元测试结束二)优点:不需要单独设计桩模块三)缺点:随着单元测试的不断进行,测试过程会变得越来越复杂,测试周期延长,测试和维护的成本增加;随着各个基本单元逐步加入,系统会变得异常庞大,因此测试人员不容易控制;越接近顶层的模块的测试其结构覆盖率就越难以保证;,另外,顶层测试易受底层模块变更的影响,任何一个模块修改之后,直接或间接调用该模块的所有单元都要重新测试由于只有在底层单元测试完毕之后才能够进行顶层单元的测试,所以并行性不好另外,自底向上的单元测试也不能和详细设计、编码同步进行四)总结:相对其它测试策略而言,该测试策略比较合理,尤其是需要考虑对象或复用时它属于面向功能的测试,而非面向结构的测试对那些以高覆盖率为目标或者软件开发时间紧张的软件项目来说,这种测试方法不适用孤立测试,一)步骤:无需考虑每个模块与其他模块之间的关系,分别为每个模块单独设计桩模块和驱动模块,逐一完成所有单元模块的测试二)优点:该方法简单、容易操作,因此所需测试时间短,能够达到高覆盖率三)缺点:不能为集成测试提供早期的集成途径。
依赖结构设计信息,需要设计多个桩模块和驱动模块,增加了额外的测试成本四)总结:该方法是比较理想的单元测试方法如辅助适当的集成测试策略,有利于缩短项目的开发时间综合测试,在单元测试中,为了有效地减少开发桩模块的工作量,可以考虑综合自底向上测试策略和孤立测试策略3.4,单元测试分析,一般可以从如下几个方面进行分析和测试,即:,1、,判断得到的结果是否正确?,因为,对于测试而言,首要的任务就是察看一下所期望的结果是否正确,即对结果进行验证2、,判断是否满足所有的边界条件?,边界条件是指软件计划的操作界限所在的边缘条件边界条件测试是单元测试中最后也是最重要的一项任务在使用边界值测试的方法时,不妨结合实际项目参考以下测试技巧:输入了完全伪造或者和要求不一致的数据1)输入一个格式错误的数据2)提供一个空值或者不完整的值3)与意料之中的值相差很远的值4)假如一个列表中不允许有重复的数值存在,就可以给它传入一组存在重复数值的列表;如果某个字段的值要求唯一,那么可以输入两个或多个相同的数值来进行测试5)假如一个列表中不允许有重复的数值存在,就可以给它传入一组存在重复数值的列表;如果某个字段的值 要求唯一,那么可以输入两个或多个相同的数值来进行测试。
6)如果要求按照一定的顺序来存储一些数据,那么可以输入一些顺序打乱的数据来做测试7)对于一些做了安全限制的部分,尽量通过各种途径尝试能否绕过安全限制的测试8)如果功能的启用有一定的顺序限制,就用和期望不一致的顺序来进行测试3、分析能否使用反向关联检查?,在实际程序中,有一些方法可以使用反向的逻辑关系来验证它们4、,分析是否能使用其他手段来交叉检查一下结果?,一般而言,对某个值进行计算会有一种以上的算法,但我们会因考虑到运行效率或其他方面的原因而选择其中的一种5、分析是否可以强制一些错误发生?,在实际使用过程当中,总会有意想不到各种各样的情况和错误发生6、,分析模块接口,数据在接口处出错就好像丢掉了进入大门的钥匙,无法进行下一步的工作,只有在数据能正确流入、流出模块的前提下,其他测试才有意义7、,分析局部数据结构,局部数据结构往往是错误的根源,对其检查主要是为了保证临时存储在模块内的数据在程序执行过程中完整、正确,因此应仔细设计测试用例8、,分析独立路径,在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次9、,分析出错处理是否正确,一个好的设计应能预见各种出错条件,并进行适当的出错处理,即预设各种出错处理通路。
3.5,单元测试用例设计,单元测试用例的设计既可以使用白盒测试也可以使用黑盒测试,但以白盒测试为主白盒测试进入的前提条件是测试人员已经对被测试对象有了一定的了解,基本上明确了被测试软件的逻辑结构黑盒测试是要首先了解软件产品具备的功能和性能等需求,再根据需求设计一批测试用例以验证程序内部活动是否符合设计要求的活动测试人员在实际工作中至少应该设计能够覆盖如下需求的基于功能的单元测试用例:,测试程序单元的功能是否实现;,测试程序单元性能是否满足要求(可选);,是否有可选的其它测试特性,如边界、余量、安全性、可靠性、强度测试、人机交互界面测试等无论是白盒测试还是黑盒测试,每个测试用例都应该包含下面,4,个关键元素:,(1),被测单元模块初始状态声明,即测试用例的开始状态(仅适用于被测单元维持了调用中间状态的情况,),;,(2)被测单元的输入,包含由被测单元读入的任何外部数据值;,(3)该测试用例实际测试的代码,用被测单元的功能和测试用例设计中使用的分析来说明,如:单元中哪一个决策条件被测试;,(4),测试用例的期望输出结果(在测试进行之前的测试说明中定义)一、测试用例设计步骤,以下描述进行测试用例设计的,6,步通用过程。
步骤,1,:首先使被测单元运行;,这个阶段适合的技术有:,模块设计说明导出的测试,对等区间划分,步骤,2,:正面测试,(Positive Testing),这个阶段适合的技术:,设计说明导出的测试,对等区间划分,状态转换测试,步骤,3,:负面测试,(Negative Testing),适合的技术有:,错误猜测,边界值分析,内部边界值测试,状态转换测试,步骤,4:,模块设计需求中其它测试特性用例设计,适合的技术:设计说明导出的测试,步骤,5,:覆盖率测试用例设计,适合的技术:,分支测试,条件测试,数据定义使用测试,状态转换测试,步骤,6,:测试执行,步骤,7,:完善代码覆盖,适合的技术:,分支测试,条件测试,设计定义,试验测试,状态转换测试,二、面向对象应用程序的单元测试用例设计,类测试一般也采用传统的两种测试方式:功能性测试和结构性测试,即黑盒测试和白盒测试1,、功能性测试,功能性测试包括两个层次:,类的规格说明和方法的规格说明2,、结构性测试,结构性测试对类中的方法进行测试,它把类作为一个单元来进行测试测试分为两层:第一层考虑类中各独立方法的代码;第二层考虑方法之间的相互作用,每个方法的测试要求能针对其所有的输入情况。
1),方法的单独测试:,(2),方法的综合测试,:,3,、基于对象,状态转移图的面向对象软件测试,面向对象设计方法通常采用状态转移图建立对象的动态行为模型状态转移图用于刻画对象,响应各种事件时状态发生转移的情况,结点表示对象的某个可能状态,结点之间的有向边通常用“事件动作”标出如图,3-3,的示例中,表示当对象处于状态,A,时,若接收到事件,e,则执行相应的操作,a,且转移到状态,B,因此,对象的状态随各种外来事件发生怎样的变化,是考察对象行为的一个重要方面图,3-3,对象,-,状态转换图,下面给出基于状态测试的主要步骤:,依据设计文档,或者通过分析对象数据成员的取值情况空间,得到被测试类的状态转移图;,给被测试的类加入用于设置和检查对象状态的新方法,导出对象的逻辑状态;,对于状态转移图中的每个状态,确定该状态是哪些方法的合法起始状态,即在该状态时,对象允许执行哪些操作;,在每个状态,从类中方法的调用关系图最下层开始,逐一测试类中的方法;,测试每个方法时,根据对象当前状态确定出对方法的执行路径有特殊影响的参数值,将各种可能组合作为参数进行测试4,、类的数据流测试,数据流测试是一种白盒测试方法,它利用程序的数据流之间的关系来指导测试的选择。
数据流分析,当数据流测试用于单个过程的单元测试时,定义,-,引用对可利用传统的迭代的数据流分析方法来计算,这种方法利用一个控制流图,(control flow graph),来表示程序,其中的节点表示程序语句,边表示不同语句的控制流,且每一个控制流图都加上了一个入口和一个出口类及类测试,类是个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分,对象是类的一个实例不失一般性,我们这里构造一个类的模型我们对类进行三级测试,定义如下:,A.,方法内部测试:测试单个方法,这级测试相当,于单元测试;,B.,方法间测试:在类中与其它方法一起测试一个,直接或间接调用的公开方法,这级测试相当于,集成测试;,C.,类内部测试:测试公开方法在各种调用顺序时的,相互作用关系,由于类的调用能够激发一系列不,同顺序的方法,我们可以用类内部测试来确定类,的相互作用关系顺序,但由于公开方法的调用顺,序是无限的,我们只能测试其中一个子集数据流测试,为了支持现有的类内部测试(,Intra-class testing,)技术,我们需要一个基于代码的测试技术来识别需要测试的类的部件,这种技术就是数据流测试,它考虑所有的类变量及程序点说明的定义,-,引用对(,def,use pairs,)。
计算类的数据流信息,为了支持类的数据流测试,我们必须计算类的各种定义-引用对为了计算类的三种定义-引用对,我们可以构造一个类控制流图(class control flow graphCCFG),其算法如下:,为类构造类调用图,作为类控制流图的初值;,把框架(frame)加入到类调用图中;,根据相应的控制流图替换类调用图中的每一,个调用节点,具体实现方法:对于类C 中的每一,个方法M,在类调用图中用方法M 的控制流图,替代方法M 的调用结点,并更新相应的边;,用调用节点和返回节点替换调用点,具体实现方法:对于类调用图中的每一个表示类C 中调用方法M 的调用点S,用一个调用节点和返回节点代替调用点S;,把单个的控制流图连接起来,具体实现方法:对于类控制流图中的每一个方法M,加上一条从框架调用节点到输入节点的边和一条从输出节点到框架返回节点的边,其中输入节点和输出节点都在方法M 的控制流图中;,返回完整的类控制流图3.6单元测试过程,图3-7从宏观的角度概括了单元测试的工作过程图一、单元测试进入和退出准则,如表3-1和表3-2所示:,表,3-1,进入准则,表,3-2,退出准则,二、单元测试过程,图,3-7,单元测试工作过程,(,1,)准备阶段,(,2,)编制阶段,(,3,)代码审查阶段,(,4,)单元测试阶段,(,5,)评审、提交阶段,3.7,单元测试举例,一、单元测试计划,1.,简介,这份文档的目标是详细描述对两票系统的可以实现在二次系统图上进行图形开票模块的功能验证的测试过程。
2.,本测试的总目标:,是否实现了需求文档中定义的所有功能。