您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > 软件测试第3章单元测试
第三章单元测试[本章要点]•单元测试的定义;•单元测试同集成测试和系统测试的区别;•单元测试环境的组成;•单元测试的分析方法;•单元测试的用例设计方法;•单元测试的过程;•单元测试举例。[本章目标]掌握单元测试的概念;了解单元测试的误区;了解单元测试与集成测试和系统测试的区别;掌握单元测试的策略;掌握单元测试分析的方法;掌握单元测试用例设计方法。3.1单元测试概述通常而言,单元测试是在软件开发过程中要进行的最低级别的测试活动,或者说是针对软件设计的最小单位——程序模块,进行正确性检验的测试工作。其目的在于发现每个程序模块内部可能存在的差错。在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试,主要工作分为两个步骤:人工静态检查和动态执行跟踪。单元测试的分工大致如下:一般由开发组在一般由开发组在开发组组长监督下进行,保证使用合适的测试技术,根据单元测试计划和测试说明文档中制定的要求,执行充分的测试;由编写该单元的开发组中的成员设计所需要的测试用例,测试该单元并修改缺陷。3.1.1单元测试误区1、单元测试是一种浪费时间的工作2、单元测试只能证明代码做了什么3、我是个很棒的程序员,我是不是可以不进行单元测试?4、集成测试能捕捉到所有的Bug5、单元测试的成本效率不高其实,在经过了单元测试之后,系统集成过程将会大大地简化。3.1.2单元测试与集成测试区别单元测试与集成测试的主要区别在于测试的对象不同。单元测试对象是实现具体功能的单元,一般对应详细设计中所描述的设计单元。集成测试是针对概要设计所包含的模块以及模块组合进行的测试。单元测试所使用的主要测试方法是基于代码的白盒测试。而集成测试所使用的主要测试方法是基于功能的黑盒测试。因为集成测试要在所有要集成的模块都通过了单元测试之后才能进行,也就是说在测试时间上,集成测试要晚于单元测试,所以单元测试的好坏直接影响着集成测试。单元测试的工作内容包括模块内程序的逻辑、功能、参数传递、变量引用、出错处理、需求和设计中有具体的要求等方面测试。集成测试的工作内容主要是验证各个接口、接口之间的数据传递关系、模块组合后能否达到预期效果。虽然单元测试和集成测试有一些区别,但是二者之间也有着千丝万缕的联系。目前集成测试和单元测试的界限趋向模糊。3.1.3单元测试与系统测试区别单元测试与系统测试的区别不仅仅在于测试的对象和测试的层次的不同,最重要的区别是测试性质不同。在单元测试过程中,单元测试的执行早于系统测试,测试的是软件单元的具体实现、内部逻辑结构以及数据流向等。系统测试属于后期测试,主要是根据需求规格说明书进行的,是从用户角度来进行的功能测试和性能测试等等,证明系统是否满足用户的需求。单元测试中发现的错误容易进行定位,并且多个单元测试可以并列进行;而系统测试发现的错误比较难于定位。3.2单元测试环境由于一个模块或一个方法(Method)并不是一个独立的程序,在考虑测试它时要同时考虑它和外界的联系,因此要用到一些辅助模块,来模拟与所测模块相联系的其他模块。一般把这些辅助模块分为两种:1、驱动模块(driver):相当于所测模块的主程序。2、桩模块(stub):用于代替所测模块调用的子模块。那么,所测模块和与它相关的驱动模块及桩模块共同构成了一个“测试环境”,如图3-2所示。被测单元驱动模块桩模块1桩模块2桩模块N测试结果……测试用例图3-2单元测试环境3.3单元测试策略单元测试涉及到的测试技术通常有:针对被测单元需求的功能测试、用于代码评审和代码走读的静态测试、白盒测试、状态转换测试和非功能测试。为了提高单元测试的质量,只了解这些单元测试技术还远远不够,还要选择合适的测试策略。在选择测试策略时,主要考虑如下3种方式:自顶向下(TopDownUnitTesting)的单元测试策略、自底向上的单元测试策略(BottomupUnitTesting)和孤立的单元测试策略。3.3.1自顶向下的单元测试策略一)步骤:1.从最顶层开始,把顶层调用的单元做成桩模块。2.对第二层测试,使用上面已测试的单元做驱动模块。3.依次类推,直到全部单元测试结束。二)优点:可以在集成测试之前为系统提供早期的集成途径。三)缺点:单元测试被桩模块控制,随着单元测试的不断进行,测试过程也会变得越来越复杂,测试难度以及开发和维护的成本都不断增加;所要求的低层次的结构覆盖率也难以得到保证;由于需求变更或其他原因而必须更改任何一个单元时,就必须重新测试该单元下层调用的所有单元;低层单元测试依赖顶层测试,无法进行并行测试,使测试进度受到不同程度的影响,延长测试周期。四)总结:从上述分析中,不难看出该测试策略的成本要高于孤立的单元测试成本,因此从测试成本方面来考虑,并不是最佳的单元测试策略。3.3.2自底向上的单元测试一)步骤:1、先对模块调用图上的最底层模块开始测试,模拟调用该模块的模块为驱动模块。2、其次,对上一层模块进行单元测试,用已经被测试过的模块做桩模块。3、依次类推,直到全部单元测试结束。二)优点:不需要单独设计桩模块。三)缺点:随着单元测试的不断进行,测试过程会变得越来越复杂,测试周期延长,测试和维护的成本增加;随着各个基本单元逐步加入,系统会变得异常庞大,因此测试人员不容易控制;越接近顶层的模块的测试其结构覆盖率就越难以保证;另外,顶层测试易受底层模块变更的影响,任何一个模块修改之后,直接或间接调用该模块的所有单元都要重新测试。由于只有在底层单元测试完毕之后才能够进行顶层单元的测试,所以并行性不好。另外,自底向上的单元测试也不能和详细设计、编码同步进行。四)总结:相对其它测试策略而言,该测试策略比较合理,尤其是需要考虑对象或复用时。它属于面向功能的测试,而非面向结构的测试。对那些以高覆盖率为目标或者软件开发时间紧张的软件项目来说,这种测试方法不适用。3.3.3孤立测试一)步骤:无需考虑每个模块与其他模块之间的关系,分别为每个模块单独设计桩模块和驱动模块,逐一完成所有单元模块的测试。二)优点:该方法简单、容易操作,因此所需测试时间短,能够达到高覆盖率。三)缺点:不能为集成测试提供早期的集成途径。依赖结构设计信息,需要设计多个桩模块和驱动模块,增加了额外的测试成本。四)总结:该方法是比较理想的单元测试方法。如辅助适当的集成测试策略,有利于缩短项目的开发时间。3.3.4综合测试在单元测试中,为了有效地减少开发桩模块的工作量,可以考虑综合自底向上测试策略和孤立测试策略。3.4单元测试分析一般可以从如下几个方面进行分析和测试,即:1、判断得到的结果是否正确?对于测试而言,首要的任务就是察看一下所期望的结果是否正确,即对结果进行验证。2、判断是否满足所有的边界条件?边界条件是指软件计划的操作界限所在的边缘条件。边界条件测试是单元测试中最后也是最重要的一项任务。在使用边界值测试的方法时,不妨结合实际项目参考以下测试技巧:输入了完全伪造或者和要求不一致的数据。1)输入一个格式错误的数据。2)提供一个空值或者不完整的值。3)与意料之中的值相差很远的值。4)假如一个列表中不允许有重复的数值存在,就可以给它传入一组存在重复数值的列表;如果某个字段的值要求唯一,那么可以输入两个或多个相同的数值来进行测试。5)假如一个列表中不允许有重复的数值存在,就可以给它传入一组存在重复数值的列表;如果某个字段的值要求唯一,那么可以输入两个或多个相同的数值来进行测试。6)如果要求按照一定的顺序来存储一些数据,那么可以输入一些顺序打乱的数据来做测试。7)对于一些做了安全限制的部分,尽量通过各种途径尝试能否绕过安全限制的测试。8)如果功能的启用有一定的顺序限制,就用和期望不一致的顺序来进行测试。3、分析能否使用反向关联检查?在实际程序中,有一些方法可以使用反向的逻辑关系来验证它们。4、分析是否能使用其他手段来交叉检查一下结果?一般而言,对某个值进行计算会有一种以上的算法,但我们会因考虑到运行效率或其他方面的原因而选择其中的一种。5、分析是否可以强制一些错误发生?在实际使用过程当中,总会有意想不到各种各样的情况和错误发生。6、分析模块接口数据在接口处出错就好像丢掉了进入大门的钥匙,无法进行下一步的工作,只有在数据能正确流入、流出模块的前提下,其他测试才有意义。7、分析局部数据结构局部数据结构往往是错误的根源,对其检查主要是为了保证临时存储在模块内的数据在程序执行过程中完整、正确,因此应仔细设计测试用例。8、分析独立路径在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。9、分析出错处理是否正确一个好的设计应能预见各种出错条件,并进行适当的出错处理,即预设各种出错处理通路。3.5单元测试用例设计单元测试用例的设计既可以使用白盒测试也可以使用黑盒测试,但以白盒测试为主。白盒测试进入的前提条件是测试人员已经对被测试对象有了一定的了解,基本上明确了被测试软件的逻辑结构。黑盒测试是要首先了解软件产品具备的功能和性能等需求,再根据需求设计一批测试用例以验证程序内部活动是否符合设计要求的活动。测试人员在实际工作中至少应该设计能够覆盖如下需求的基于功能的单元测试用例:1测试程序单元的功能是否实现;2测试程序单元性能是否满足要求(可选);3是否有可选的其它测试特性,如边界、余量、安全性、可靠性、强度测试、人机交互界面测试等。无论是白盒测试还是黑盒测试,每个测试用例都应该包含下面4个关键元素:(1)被测单元模块初始状态声明,即测试用例的开始状态(仅适用于被测单元维持了调用中间状态的情况);(2)被测单元的输入,包含由被测单元读入的任何外部数据值;(3)该测试用例实际测试的代码,用被测单元的功能和测试用例设计中使用的分析来说明,如:单元中哪一个决策条件被测试;(4)测试用例的期望输出结果(在测试进行之前的测试说明中定义)。一、测试用例设计步骤以下描述进行测试用例设计的6步通用过程。步骤1:首先使被测单元运行;这个阶段适合的技术有:①模块设计说明导出的测试②对等区间划分步骤2:正面测试(PositiveTesting)这个阶段适合的技术:①设计说明导出的测试②对等区间划分③状态转换测试步骤3:负面测试(NegativeTesting)适合的技术有:①错误猜测②边界值分析③内部边界值测试④状态转换测试步骤4:模块设计需求中其它测试特性用例设计适合的技术:设计说明导出的测试步骤5:覆盖率测试用例设计适合的技术:①分支测试②条件测试③数据定义-使用测试④状态转换测试步骤6:测试执行步骤7:完善代码覆盖适合的技术:①分支测试②条件测试③设计定义――试验测试④状态转换测试二、面向对象应用程序的单元测试用例设计类测试一般也采用传统的两种测试方式:功能性测试和结构性测试,即黑盒测试和白盒测试。1、功能性测试功能性测试包括两个层次:类的规格说明和方法的规格说明。2、结构性测试结构性测试对类中的方法进行测试,它把类作为一个单元来进行测试。测试分为两层:第一层考虑类中各独立方法的代码;第二层考虑方法之间的相互作用,每个方法的测试要求应能针对其所有的输入情况。(1)方法的单独测试:(2)方法的综合测试:3、基于对象—状态转移图的面向对象软件测试面向对象设计方法通常采用状态转移图建立对象的动态行为模型。状态转移图用于刻画对象响应各种事件时状态发生转移的情况,结点表示对象的某个可能状态,结点之间的有向边通常用“事件/动作”标出。如图3-3的示例中,表示当对象处于状态A时,若接收到事件e则执行相应的操作a且转移到状态B。因此,对象的状态随各种外来事件发生怎样的变化,是考察对象行为的一个重要方面。图3-3对象-状态转换图ABe/a下面给出基于状态测试的主要步骤:①依据设计文档,或者通过分析对象数据成员的取值情况空间,得到被测试类的状态转移图;②给被测试的类加入用于设置和检查对象状态的新方法,导出对象的逻辑状态;③对于状态转移图中的每个状态,确定该状态是哪些方法的合法起始状态,即在该状态时,对象允许执行哪些操作;④在每个状态,从类中
本文标题:软件测试第3章单元测试
链接地址:https://www.777doc.com/doc-5543366 .html