《第3章-单元测试-《软件测试技术》课件.ppt》由会员分享,可在线阅读,更多相关《第3章-单元测试-《软件测试技术》课件.ppt(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 第三章第三章 单元测试单元测试 本章要点本章要点 单元测试的定义;单元测试同集成测试和系统测试的区别;单元测试环境的组成;单元测试的分析方法;单元测试的用例设计方法;单元测试的过程;单元测试举例。本章目标本章目标 u掌握单元测试的概念;u了解单元测试的误区;u了解单元测试与集成测试和系统测试的区别;u掌握单元测试的策略;u掌握单元测试分析的方法;u掌握单元测试用例设计方法。3.13.1单元测试概述单元测试概述 通常而言,单元测试是在软件开发过程中要进行的最低级别的测试活动,或者说是针对软件设计的最小单位程序模块,进行正确性检验的测试工作。其目的在于发现每个程序模块内部可能存在的差错。在单元测
2、试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试,主要工作分为两个步骤:人工静态检查和动态执行跟踪。单元测试的分工大致如下:一般由开发组在一般由开发组在开发组组长监督下进行,保证使 其实,在经过了单元测试之后,系统集成过程将会大大地简化。3.1.2 3.1.2单元测试与集成测试区别单元测试与集成测试区别 单元测试与集成测试的主要区别在于测试的对象不同。单元测试对象是实现具体功能的单元,一般对应详细设计中所描述的设计单元。集成测试是针对概要设计所包含的模块以及模块组合进行的测试。单元测试所使用的主要测试方法是基于代码的白盒测试。而集成测试所使用的主要测试方法是基于功能的黑盒测试
3、。因为集成测试要在所有要集成的模块都通过了单元测试之后才能进行,也就是说在测试时间上,集成测试要晚于单元测试,所以单元测试的好坏直接影响着集成测试。单元测试的工作内容包括模块内程序的逻辑、功能、参数传递、变量引用、出错处理、需求和设计中有具体的要求等方面测试。集成测试的工作内容主要是验证各个接口、接口之间的数据传递关系、模块组合后能否达到预期效果。虽然单元测试和集成测试有一些区别,但是二者之间也有着千丝万缕的联系。目前集成测试和单元测试的界限趋向模糊。3.1.33.1.3单元测试与系统测试区别单元测试与系统测试区别 单元测试与系统测试的区别不仅仅在于测试的对象和测试的层次的不同,最重要的区别是
4、测试性质不同。在单元测试过程中,单元测试的执行早于系统测试,测试的是软件单元的具体实现、内部逻辑结构以及数据流向等。系统测试属于后期测试,主要是根据需求规格说明书进行的,是从用户角度来进行的功能测试和性能测试等等,证明系统是否满足用户的需求。单元测试中发现的错误容易进行定位,并且多个单元测试可以并行进行;而系统测试发现的错误比较难定位。图3-2 单元测试环境3.33.3单元测试策略单元测试策略 单元测试涉及到的测试技术通常有:针对被测单元需求的功能测试、用于代码评审和代码走读的静态测试、白盒测试、状态转换测试和非功能测试。为了提高单元测试的质量,只了解这些单元测试技术还远远不够,还要选择合适的
5、测试策略。在选择测试策略时,主要考虑如下3种方式:自顶向下(Top Down Unit Testing)的单元测试策略、自底向上的单元测试策略(Bottom up Unit Testing)和孤立的单元测试策略。要求的低层次的结构覆盖率也难以得到保证;由于需求变更或其他原因而必须更改任何一个单元时,就必须重新测试该单元下层调用的所有单元;低层单元测试依赖顶层测试,无法进行并行测试,使测试进度受到不同程度的影响,延长测试周期。四)总结:从上述分析中,不难看出该测试策略的成本要高于孤立的单元测试成本,因此从测试成本方面来考虑,并不是最佳的单元测试策略。3.3.23.3.2自底向上的单元测试自底向上
6、的单元测试 一)步骤:1、先对模块调用图上的最底层模块开始测试,模拟调用该模块的模块为驱动模块。由于只有在底层单元测试完毕之后才能够进行顶层单元的测试,所以并行性不好。另外,自底向上的单元测试也不能和详细设计、编码同步进行。四)总结:相对其它测试策略而言,该测试策略比较合理,尤其是需要考虑对象或复用时。它属于面向功能的测试,而非面向结构的测试。对那些以高覆盖率为目标或者软件开发时间紧张的软件项目来说,这种测试方法不适用。3.3.3 3.3.3孤立测试孤立测试 一)步骤:无需考虑每个模块与其他模块之间的关系,分别为每个模块单独设计桩模块和驱动模块,逐一完成所有单元模块的测试。二)优点:该方法简单
7、、容易操作,因此所需测试时间短,能够达到高覆盖率。三)缺点:不能为集成测试提供早期的集成途径。依赖结构设计信息,需要设计多个桩模块和驱动模块,增加了额外的测试成本。四)总结:该方法是比较理想的单元测试方法。如辅助适当的集成测试策略,有利于缩短项目的开发时间。3.3.4 3.3.4综合测试综合测试 在单元测试中,为了有效地减少开发桩模块的工作量,可以考虑综合自底向上测试策略和孤立测试策略。2)提供一个空值或者不完整的值。3)与意料之中的值相差很远的值。4)假如一个列表中不允许有重复的数值存在,就可以给它传入一组存在重复数值的列表;如果某个字段的值要求唯一,那么可以输入两个或多个相同的数值来进行测
8、试。5)假如一个列表中不允许有重复的数值存在,就可以给它传入一组存在重复数值的列表;如果某个字段的值 要求唯一,那么可以输入两个或多个相同的数值来进行测试。6)如果要求按照一定的顺序来存储一些数据,那么可以输入一些顺序打乱的数据来做测试。7)对于一些做了安全限制的部分,尽量通过各种途径尝试能否绕过安全限制的测试。8)如果功能的启用有一定的顺序限制,就用和期望不一致的顺序来进行测试。3、分析能否使用反向关联检查?在实际程序中,有一些方法可以使用反向的逻辑关系来验证它们。4、分析是否能使用其他手段来交叉检查一下结果?一般而言,对某个值进行计算会有一种以上的算法,但我们会因考虑到运行效率或其他方面的
9、原因而选择其中的一种。5、分析是否可以强制一些错误发生?在实际使用过程当中,总会有意想不到各种各样的情况和错误发生。6、分析模块接口 数据在接口处出错就好像丢掉了进入大门的钥匙,无法进行下一步的工作,只有在数据能正确流入、流出模块的前提下,其他测试才有意义。7、分析局部数据结构 局部数据结构往往是错误的根源,对其检查主要是为了保证临时存储在模块内的数据在程序执行过程中完整、正确,因此应仔细设计测试用例。8、分析独立路径 在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。9、分析出错处理是否正确 一个好的设计应能预见各种出错条件,并进行适当的出错处理,即
10、预设各种出错处理通路。3.53.5单元测试用例设计单元测试用例设计 单元测试用例的设计既可以使用白盒测试也可以使用黑盒测试,但以白盒测试为主。白盒测试进入的前提条件是测试人员已经对被测试对象有了一定的了解,基本上明确了被测试软件的逻辑结构。黑盒测试是要首先了解软件产品具备的功能和性能等需求,再根据需求设计一批测试用例以验证程序内部活动是否符合设计要求的活动。测试人员在实际工作中至少应该设计能够覆盖如下需求的基于功能的单元测试用例:测试程序单元的功能是否实现;测试程序单元性能是否满足要求(可选);是否有可选的其它测试特性,如边界、余量、安全性、可靠性、强度测试、人机交互界面测试等。无论是白盒测试
11、还是黑盒测试,每个测试用例都应该包含下面4 个关键元素:步骤1:首先使被测单元运行;这个阶段适合的技术有:模块设计说明导出的测试 对等区间划分 步骤2:正面测试(Positive Testing)这个阶段适合的技术:设计说明导出的测试 对等区间划分 状态转换测试 步骤3:负面测试(Negative Testing)适合的技术有:错误猜测 边界值分析 内部边界值测试 状态转换测试 步骤4:模块设计需求中其它测试特性用例设计 适合的技术:设计说明导出的测试 步骤5:覆盖率测试用例设计 适合的技术:分支测试 条件测试 数据定义使用测试 状态转换测试 步骤6:测试执行 步骤7:完善代码覆盖 适合的技术
12、:分支测试 条件测试 设计定义试验测试 状态转换测试 二、面向对象应用程序的单元测试用例设计 类测试一般也采用传统的两种测试方式:功能性测试和结构性测试,即黑盒测试和白盒测试。1、功能性测试 功能性测试包括两个层次:类的规格说明和方法的规格说明。响应各种事件时状态发生转移的情况,结点表示对象的某个可能状态,结点之间的有向边通常用“事件动作”标出。如图3-3的示例中,表示当对象处于状态A 时,若接收到事件e 则执行相应的操作a且转移到状态B。因此,对象的状态随各种外来事件发生怎样的变化,是考察对象行为的一个重要方面。图3-3 对象-状态转换图 下面给出基于状态测试的主要步骤:依据设计文档,或者通
13、过分析对象数据成员的取值情况空间,得到被测试类的状态转移图;给被测试的类加入用于设置和检查对象状态的新方法,导出对象的逻辑状态;对于状态转移图中的每个状态,确定该状态是哪些方法的合法起始状态,即在该状态时,对象允许执行哪些操作;在每个状态,从类中方法的调用关系图最下层开始,逐一测试类中的方法;类及类测试 类是个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分,对象是类的一个实例。不失一般性,我们这里构造一个类的模型。我们对类进行三级测试,定义如下:A.方法内部测试:测试单个方法,这级测试相当 于单元测试;B.方法间测试:在类中与其它方法一起测试一个 直接或间接调用的公开方法
14、,这级测试相当于 集成测试;C.类内部测试:测试公开方法在各种调用顺序时的 相互作用关系,由于类的调用能够激发一系列不 同顺序的方法,我们可以用类内部测试来确定类 的相互作用关系顺序,但由于公开方法的调用顺 序是无限的,我们只能测试其中一个子集。数据流测试 为了支持现有的类内部测试(Intra-class testing)技术,我们需要一个基于代码的测试技术来识别需要测试的类的部件,这种技术就是数据流测试,它考虑所有的类变量及程序点说明的定义-引用对(defuse pairs)。计算类的数据流信息 为了支持类的数据流测试,我们必须计算类的为了支持类的数据流测试,我们必须计算类的各种定义各种定义
15、-引用对。引用对。为了计算类的三种定义为了计算类的三种定义-引用对,我们可以构引用对,我们可以构造一个类控制流图造一个类控制流图(class control flow graph(class control flow graphCCFG)CCFG),其算法如下:,其算法如下:为类构造类调用图,作为类控制流图的初值;为类构造类调用图,作为类控制流图的初值;把框架把框架(frame)(frame)加入到类调用图中;加入到类调用图中;根据相应的控制流图替换类调用图中的每一根据相应的控制流图替换类调用图中的每一 个调用节点,具体实现方法:对于类个调用节点,具体实现方法:对于类C C 中的每一中的每一
16、个方法个方法MM,在类调用图中用方法,在类调用图中用方法M M 的控制流图的控制流图 替代方法替代方法M M 的调用结点,并更新相应的边;的调用结点,并更新相应的边;用调用节点和返回节点替换调用点,具体实用调用节点和返回节点替换调用点,具体实现方法:对于类调用图中的每一个表示类现方法:对于类调用图中的每一个表示类C C 中调中调用方法用方法M M 的调用点的调用点S S,用一个调用节点和返回节,用一个调用节点和返回节点代替调用点点代替调用点S S;把单个的控制流图连接起来,具体实现方法:把单个的控制流图连接起来,具体实现方法:对于类控制流图中的每一个方法对于类控制流图中的每一个方法MM,加上一
17、条从,加上一条从框架调用节点到输入节点的边和一条从输出节点框架调用节点到输入节点的边和一条从输出节点到框架返回节点的边,其中输入节点和输出节点到框架返回节点的边,其中输入节点和输出节点都在方法都在方法M M 的控制流图中;的控制流图中;返回完整的类控制流图。返回完整的类控制流图。3.63.6单元测试过程单元测试过程 图图3-73-7从宏观的角度概括了单元测试的工作过程图。从宏观的角度概括了单元测试的工作过程图。一、单元测试进入和退出准则一、单元测试进入和退出准则 如表如表3-13-1和表和表3-23-2所示:所示:表3-1 进入准则要素要素判断准则判断准则详细设计说明书详细设计说明书单元测试用
18、例单元测试用例n n经过审查经过审查n n获得批准获得批准n n进入配置库进入配置库 要素判断准则源代码文件源代码文件清单源代码文件获得批准源代码文件进入配置库的 源代码区测试用例源代码通过同级评审软件Bug 清单单元测试报告提交测试负责人提交软件产品配置管理表3-2 退出准则二、单元测试过程图3-7 单元测试工作过程(1)准备阶段(2)编制阶段(3)代码审查阶段(4)单元测试阶段(5)评审、提交阶段 3.73.7单元测试举例单元测试举例 一、单元测试计划一、单元测试计划 1.简介 这份文档的目标是详细描述对两票系统的可以实现在二次系统图上进行图形开票模块的功能验证的测试过程。2.本测试的总目
19、标:是否实现了需求文档中定义的所有功能。3.完整性需求 在测试该模块是否实现了需求文档中定义的所有功能之前,应该做如下两项工作:测试数据初始化是否无误;测试二次图开票GUI界面是否与系统维护模块显示一致。4.单元测试终止标准 硬件资源不足或故障造成软件无法运行 软件运行后无法正确显示(如:因数据初始化有误造成GUI界面同系统维护模块显示不一致或不正确等);所有功能测试均已经完成 5.资源需求 软件资源 操作系统:windows 2000 web服务器:Tomcat 5.0 数据库服务器:SQL Server 2000 浏览器:Microsoft IE 6.0 测试工具:Junit 硬件资源 同
20、开发用pc机配置相同即可。测试进度任务开始日期结束日期配置并调试测试环境10/0110/03GUI界面测试10/0410/06所有功能测试10/0710/10表3-3 二次系统图图形开票模块 6.准备测试的特征 以下特征将被测试,以确保该模块能满足需求规格说明书中指定的需求:需求2.2.1 用户界面 需求2.2.2 弹出菜单 需求2.2.3图形开票 7.不准备测试的特征 本次测试将不考虑是否能够同一次系统图图形开票模块的集成。8.测试方法 该单元测试方法包括功能测试、GUI测试。9.通过/失败标准 10.测试结束后须提交的产物包括以下几个文档:本测试计划 测试规格说明文档 测试结果报告 向测试
21、经理和开发经理提交的每日测试状态报告 缺陷报告 11、测试执行人员 12、风险和应急计划 二、测试的设计和开发 测试设计和开发要以测试计划作为输入。在设计测试时,首先应明确测试目标(细化测试的方法和范围);确定每个测试的输入规格说明;确定每个测试使用的测试配置;复查测试设计的覆盖率和测试的准确度。在对本单元进行测试时所采用的方法是:先完成黑盒测试,然后统计白盒覆盖率,针对未覆盖的逻辑单位设计测试用例覆盖它。然后,就应该开发测试用例,应该注意的是在测试用例中应该尽可能详细地描述测试过程,对于耗时的测试进行自动化。最后,验证和调试测试。3.83.8单元测试经验总结单元测试经验总结 测试人员在进行测
22、试的工作过程中,应该注意积累测试工作经验,这样可以缩短单元测试的时间,提高测试效果和效率。如:1、在做单元测试的过程中,要灵活选用测试用例设计技术,如本章中的两票系统单元测试过程中,首先使用黑盒测试用例设计技术,然后根据相应的覆盖率统计再补充白盒测试用例。既减少了测试工作的重复,又保证了单元测试的完整性。2、应该尽量开发简单测试驱动代码,增强其可读性。最重要的是,单元测试代码中不能包含分支和逻辑语句,因为这意味着有多个测试在同时进行。这样将会使测试代码变得难以理解和维护。本章小结本章小结 通过单元测试,我们验证开发人员所书写的编码是可以按照其所设想的方式执行的,产出了符合预期值的结果。这就实现
23、了单元测试的目的。相比后面阶段的测试,单元测试的创建更简单,维护更容易,并且可以更方便的进行重复。从全程的费用来考虑,相比起那些复杂且旷日持久的集成测试,或是不稳定的软件系统来说,单元测试所需的费用是很低的。模块单元设计完毕之后的开发阶段就是单元测试。值得注意的是,如果在书写代码之前就进行单元测试,测试设计就会显得更加灵活,因为一旦代码完成,对软件的测试可能就受制于代码,倾向于测试该段代码完成什么功能,而不是真正的测试,我们需要的做的应该是测试这段代码应该做什么。因此,应该把单元测试的设计放在详细设计阶段。习习 题题1.什么是单元测试?2.测试用例设计的步骤有哪些?3.单元测试的策略有哪些?每种测试策略具有哪些优点和缺点?4.单元测试与集成测试、系统测试各有哪些区别?5.针对你所熟悉的一个简单的小程序,根据其特点考虑一下如何对其进行单元测试。并试着使用基本的黑盒或白盒测试技术设计一些测试用例和测试数据?