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