《单元测试理论基础.ppt》由会员分享,可在线阅读,更多相关《单元测试理论基础.ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、单元测试理论基础李振学单元测试理论基础测试是软件开发的重要环节之一。按照软件开发的过程测试可分为:单元测试、集成测试、系统测试、域测试(Fieldtest)等。我们这里将讨论面向程序员的单元测试。l单元测试定义l单元测试目的l单元测试的特点l单元测试的范畴l进行单元测试的时机l单元测试任务l单元测试方法l单元测试过程什么是单元测试l单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。例如,你可能把一个很大的值放入一个有序list中去,然后确认该值出现在list的尾部。或者,你可能会从
2、字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。什么是单元测试l单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。为什么要使用单元测试我们编写代码时,一定会反复调试保证它能够编译通过。如果是编译没有通过的代码,没有任何人会愿意交付给自己的老板。但代码通过编译,只是说明了它的语法正确;我们却无法保证它的语义也一定正确,没有任何人可以轻易承诺这段代码的行为一定是正确的。幸运,单元测试会为我们的承诺做保证。编写单元测试就是用来验证这段代码
3、的行为是否与我们期望的一致。有了单元测试,我们可以自信的交付自己的代码,而没有任何的后顾之忧。单元测试的优点l它是一种验证行为l它是一种设计行为l它是一种编写文档的行为l它具有回归性单元测试的优点l它是一种验证行为。程序中的每一项功能都是测试来验证它的正确性。它为以后的开发提供支缓。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更自由的对程序进行改进。单元测试的优点l它是一种设计行为。编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的
4、,即迫使我们解除软件中的耦合。单元测试的优点l它是一种编写文档的行为。单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。单元测试的优点l它具有回归性。自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。单元测试的范畴l如果要给单元测试定义一个明确的范畴,指出哪些功能是属于单元测试,这似乎很难。但下面讨论的四个问题,基本上可以说明单元测试的范畴,单元测试所要做的工作。它的行为和我期望的一致吗?这是单元测试最根本的目的,我们就是用单元测试的代码来证明它所做的就是我们所期望的。单元测试的范畴l它的行为一
5、直和我期望的一致吗?编写单元测试,如果只测试代码的一条正确路径,让它正确走一遍,并不算是真正的完成。软件开发是一个项复杂的工程,在测试某段代码的行为是否和你的期望一致时,你需要确认:在任何情况下,这段代码是否都和你的期望一致;譬如参数很可疑、硬盘没有剩余空间、缓冲区溢出、网络掉线的时候。单元测试的范畴l我可以依赖单元测试吗?不能依赖的代码是没有多大用处的。既然单元测试是用来保证代码的正确性,那么单元测试也一定要值得依赖。单元测试的范畴l单元测试说明我的意图了吗?单元测试能够帮我们充分了解代码的用法,从效果上而言,单元测试就像是能执行的文档,说明了在你用各种条件调用代码时,你所能期望这段代码完成
6、的功能。单元测试方法l单元测试的依据是详细设计,单元测试应对模块内所有重要的控制路径设计测试用例,以便发现模块内部的错误。单元测试多采用白盒测试技术,系统内多个模块可以并行地进行测试。单元测试任务l单元测试任务包括:l1模块接口测试;l2模块局部数据结构测试;l3模块边界条件测试;l4模块中所有独立执行通路测试;l5模块的各条错误处理通路测试。单元测试任务l模块接口测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下,其他测试才有意义。测试接口正确与否应该考虑下列因素:1输入的实际参数与形式参数的个数是否相同;2输入的实际参数与形式参数的属性是否匹配;3输入的实际参数与形式参数的量纲是
7、否一致;4调用其他模块时所给实际参数的个数是否与被调模块的形参个数相同;单元测试任务l5调用其他模块时所给实际参数的属性是否与被调模块的形参属性匹配;6调用其他模块时所给实际参数的量纲是否与被调模块的形参量纲一致;7调用预定义函数时所用参数的个数、属性和次序是否正确;8是否存在与当前入口点无关的参数引用;9是否修改了只读型参数;10对全程变量的定义各模块是否一致;11是否把某些约束作为参数传递。单元测试任务l检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过程中完整、正确。局部数据结构往往是错误的根源,应仔细设计测试用例,力求发现下面几类错误:1不合适或不相容的类型说明;2变量无初值
8、;3变量初始化或省缺值有错;4不正确的变量名(拼错或不正确地截断);5出现上溢、下溢和地址异常。除了局部数据结构外,如果可能,单元测试时还应该查清全局数据(例如FORTRAN的公用区)对模块的影响。单元测试任务l在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。此时设计测试用例是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误。此时基本路径测试和循环测试是最常用且最有效的测试技术。计算中常见的错误包括:1误解或用错了算符优先级;2混合类型或优先级;3因计算机表示的局限性,运算;3变量初值错;4精度不够;5表达式符号错。单元测试任务l比较判断与
9、控制流常常紧密相关,测试用例还应致力于发现下列错误:1不同数据类型的对象之间进行比较;2错误地使用逻辑运算符期望理论上相等而实际上不相等的两个量相等;4比较运算或变量出错;5循环终止条件或不可能出现;6迭代发散时不能退出;7错误地修改了循环变量。单元测试任务l一个好的设计应能预见各种出错条件,并预设各种出错处理通路,出错处理通路同样需要认真测试,测试应着重检查下列问题:1输出的出错信息难以理解;2记录的错误与实际遇到的错误不相符;3在程序自定义的出错处理段运行之前,系统已介入;4异常处理不当;5错误陈述中未能提供足够的定位出错信息。单元测试任务l边界条件测试是单元测试中最后,也是最重要的一项任
10、务。众所周知,软件经常在边界上失效,采用边界值分析技术,针对边界值及其左、右设计测试用例,很有可能发现新的错误。单元测试策略桩模块(Stub):用以模拟被测模块工作过程中所调用的模块,他们一般只进行很少的数据处理,例如打印入口和返回;驱动模块(Driver):用以模拟被测模块的上级模块,它接受测试数据,把相关的数据传送给被测模块,启动被测模块,并打印相应的结果;单元测试策略 由顶向下的单元测试策略;-先对最顶层的单元进行测试,把顶层所调用的单元做成桩模块,其次对第二层进行测试,使用上面已测试的单元做驱动模块,以此类推;由底向上的单元测试策略;-先对模块调用层次图上最底层的模块进行单元测试,为该
11、模块建立驱动模块,其次对上一层做单元测试,下面测试过的模块做桩模块,以此类推;孤立测试 -不考虑每个模块与其他模块之间的关系,为每个模块设计桩模块和驱动模块;单元测试用例设计 为正向测试设计用例;-验证设计说明书所对应的功能项或性能指标能否兑现;为逆向测试设计用例;-验证被测的软件单元有没有做它不应该做的事情;为满足特殊需求设计用例;为代码覆盖设计用例;为覆盖率指标完成设计用例;单元测试用例设计主要采用的方法:等价类划分;边界值分析;定义/使用测试;路径测试;单元测试过程单元测试过程测试计划测试设计测试执行测试记录分析测试总结完毕缺陷跟踪针对测试目标,规定测试任务、资源分配、人员角色、进度安排
12、等。根据测试计划,设计测试用例,包括:测试步骤、测试场景、测试代码、测试数据(包括预期结果)。根据测试计划,配置测试环境,并手动或者自动执行测试设计。根据测试计划,忠实地记录测试执行的过程和结果。分析测试记录,如果发现与预期结果不同,确定并重现缺陷。检查测试设计是否全部执行完毕,缺陷是否全部关闭。记录、分发、评估、关闭缺陷报告。分析测试过程和缺陷报告,评估测试质量和测试效果,给出是否通过测试的建议。单元测试过程单元测试过程测试文档:测试计划测试设计测试执行测试记录分析测试总结完毕缺陷跟踪测试计划文档测试用例文档测试记录文档缺陷跟踪报告测试总结报告 单元测试过程单元测试过程测试计划内容:1)概要
13、:明确测试目的和主要任务,被测系统的简单描述,被测系统依赖的其它系统描述2)领域:定义测试和不需要测试的内容,描述与测试计划相关的重要术语和缩略语,测试场所3)建议的重大事件时间表:列出阶段性进度4)转换标准:允许系统进入一个特定的测试阶段所必须具备的条件。定义可能会导致测试执行挂起的状态和事件。说明如何决定测试何时可以结束5)测试配置和环境:6)测试执行:测试人员与分工,错误管理,测试周期等;单元测试过程单元测试过程测试计划内容:7)风险和意外事故:意外事件的对策8)更改记录:到目前为止对测试计划本身所作的更改和修订。内容可包括:编号、更改人、更改内容、修订的发布时间等。9)参考文档:测试计
14、划引用的其他文档。如:需求规范、设计规范、操作手册、标准、其他相关信息。单元测试过程单元测试过程测试方案内容:1)概要2)被测试特性:进一步明确和细化被测试的特性3)测试需求:分析和明确功能等各方面的测试需求4)测试方法:拟采用的具体测试技术和方法5)需求规范追踪:把测试需求转化为测试设计6)测试用例集描述:对测试用例分层次说明7)更改记录8)参考文档单元测试过程单元测试过程测试用例内容:测试用例内容:1 用例编号10用例类别2 用例名称11用例状态3 测试目的12用例设计人4 输入数据13创建时间5 测试步骤14用例评审人6 测试脚本15评审时间7 预期结果16评审结果8 响应时间17执行结
15、果9 实际输出18相关模块单元测试过程单元测试过程错误管理-缺陷的级别:1)致命性错误(Critical)数据丢失,数据计算错误、系统崩溃和非常死机 2)严重功能性错误(Serious)规定的功能没有实现或不完整、设计不合理造成性能低下,影响系统的运营 3)警告性错误(Moderate)不影响业务运营的功能问题 4)建议性错误(Suggestion,Cosmetic)软件设计和功能实现等不甚合理之处提出建议单元测试过程单元测试过程错误管理-修改级别:1)高2)中3)低单元测试过程单元测试过程错误管理错误管理-错误描述:错误描述:1 分配给错误的ID号2 提交错误的时间3 错误提交人4 版本号发
16、生错误的子系统或模块5 错误发生的条件6 对错误的详细描述7 所使用的测试用例号8 错误被发现的数据库9 使用的机器号10 错误的重要性11 错误的改正优先级12发生错误的子系统或模块及相关的模块13 错误是否易再现14 其他单元测试过程单元测试过程错误管理错误管理-错误跟踪:错误跟踪:1 错误负责人6 错误改正后需要重新做的测试2 严重性7 改正错误所影响的组件3 优先级8 目前错误的状态4 估计改正错误的日期9 错误类别5 估计改正错误所要花费的时间10 解决办法单元测试过程单元测试过程错误管理-错误分发:项目管理者测试管理者被分配修改错误的人组件代码的编写人测试小组中的其他成员单元测试过
17、程单元测试过程错误管理-益处:有利于缺陷的清楚传达依据错误的相对和绝对重要性来修复问题对错误实现全生命周期管理当错误变化时相关人员及时获悉新的信息错误的统计分析报告提供更多的信息单元测试过程单元测试过程错误管理-方法:使用商业错误跟踪与管理系统 -testdirector -IBM Rational自行开发专用错误跟踪与管理系统 -NEUSOFT bugbase单元测试过程单元测试过程测试报告内容:测试报告内容:1 测试活动概述6 结果描述2 测试环境描述7 意外事件3 测试资源使用情况8 遗留问题4 差异描述9 评价5 测试充分性的评价10 测试总结单元测试应坚持的原则单元测试应坚持的原则 应当尽早和不断地进行软件测试;对全新的代码或修改过的代码一定要进行单元测试;被测试的对象为实现一组相关功能的代码;单元测试最好根据单元测试计划和方案进行,排除测试的随意性;当测试用例的测试结果与预期结果不一致时,单元测试的执行人员需如实记录实际的测试结果;当测试计划中的结束标准达到时,单元测试结束;项目管理者保证测试用例经过审核;当程序进行了修改,测试执行人员执行回归测试以保证对发现错误的修改没有引入新的错误;小结小结 单元测试的定义、目的;单元测试的内容;如何进行单元测试用例设计;单元测试应遵循的原则;