单元测试方法介绍内容1.单元测试内容2.不同等级的软件的单元测试类型的要求3.常用单元测试的几种测试方法4.单元测试的重点及其对策5.单元测试的测试用例设计方法6.六种逻辑覆盖测试方法什么是单元测试•单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。•通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。•执行单元测试,是为了证明某段代码的行为确实和开发者所期望的一致。不同等级的软件的单元测试类型的要求对不同等级的软件测试要求参照GJB/Z102,软件按其可靠性、安全性关键程度可划分为如下四个等级:A级:软件的故障将导致人员死亡或系统报废B级:软件的故障将导致人员严重受伤、严重职业病、系统严重损坏或任务失败C级:软件的故障将导致人员轻度受伤、轻度职业病、系统轻度损坏或任务受影响D级:软件的故障轻于C级的损伤,但任务不受影响。软件测试的分类测试技术静态测试代码审查代码走查桌面检查技术评审静态分析控制流分析接口分析表达式分析动态测试黑盒测试技术白盒测试技术软件测试的分类动态测试控制流覆盖语句覆盖分支覆盖路径覆盖错误处理路径黑盒测试技术白盒测试技术功能测试等价类划分边值分析因果图随机测试猜错法桌面检查•桌面检查:程序员对自己的代码进行一次自我检查。查变量的交叉引用表检1)检查代码和设计的一致性。2)代码对标准的遵循、可读性。3)代码逻辑表达的正确性。4)代码结构的合理性。5)程序编写与编写标准的符合性。6)程序中不安全、不明确和模糊的部分。7)编程风格问题等。代码审查代码审查的测试内容:检查代码和设计的一致性;检查代码执行标准的情况;检查代码逻辑表达的正确性;检查代码结构的合理性;检查代码的可读性。代码审查的组织:由四人以上组成,分别为组长、资深程序员、程序编写者与专职测试人员。组长不能是被测试程序的编写者,组长负责分配资料、安排计划、主持开会、记录并保存被发现的错误。代码审查代码审查的过程:a)准备阶段:组长分发有关材料,被测程序的设计和编码人员向审查组详细说明有关材料,并回答审查组成员所提出的有关问题。b)程序阅读:审查组人员仔细阅读代码和相关材料,对照代码审查单,记录问题及明显缺陷。c)会议审查:组长主持会议,程序员逐句阐明程序的逻辑,其他人员提出问题,利用代码审查单进行分析讨论,对讨论的各个问题形成结论性意见。d)形成报告:会后将发现的错误形成代码审查问题表,并交给程序开发人员。对发现错误较多或发现重大错误,在改正错误之后再次进行会议审查。代码审查单代码走查代码走查的过程:不是简单地读程序和对照错误检查表进行检查,而是让与会者“充当”计算机。即首先由测试组成员为所测程序准备一批有代表性的测试用例,提交给走查小组。走查小组开会,集体扮演计算机角色,让测试用例沿程序的逻辑运行一遍,随时记录程序的踪迹,供分析和讨论用。人们借助于测试用例的媒介作用,对程序的逻辑和功能提出各种疑问,结合问题开展热烈的讨论和争议,能够发现更多的问题。代码走查桌面检查、代码走查和代码审查•桌面检查:程序员对自己的代码进行一次自我检查。•代码走查:程序员和测试员组成审查小组,通过逻辑运行程序。第一步:小组成员提前阅读设计规格书、程序文本等相关文档。第二步:利用测试用例,使程序逻辑运行,记录程序的踪迹,发现、讨论、解决问题•代码审查:程序员和测试员组成审查小组。第一步:小组成员提前阅读设计规格书、程序文本等相关文档;第二步:召开程序审查会,开发人员读程序,审查小组讨论、发现、解决问题。•两者的区别:代码审查是一种正式的评审活动,而代码走查的讨论过程是非正式的。静态分析•静态分析一般包括控制流分析、数据流分析、接口分析、表达式分析。•静态分析常需要使用软件工具进行。静态分析是在程序编译通过之后,其它静态测试之前进行的。静态分析的技术要求静态分析的技术要求静态分析的有关质量度量功能测试编写测试辅助程序(如驱动程序和桩模块),对被测软件单元逐一进行测试。功能测试检查程序代码,通过驱动程序、桩程序来调用、驱动被测程序的运行,并设计测试用例。主要是检查模块输入、输出量的正确性。(1)实际输入与定义的输入是否一致,包括参数个数、类型、顺序;(2)对于非内部(局部)的变量使用是否合理;(3)调用其他模块时是否检查了本模块的可用性和处理结果;(4)调用外部资源是否检查了可用性,是否及时释放了资源。性能测试a、运行时间单元测试的运行时间分析可以采用记时点的方法进行,如利用软件方式的系统调用,测试程序完成功能的时间。b、占用空间软件单元的占用空间主要由代码空间、数据空间、堆和栈构成。代码空间和数据空间在编译连接完成的地址映射表得出,堆和栈可以根据具体开发环境和地址总线监控器得到最大使用空间。c、精度单元测试的精度分析可以采用软件测试工具或开发环境和地址总线监控器辅助完成,测试程序在获得定量结果时程序计算的精确性。单元测试的重点及其对策局部数据结构测试(1)变量是否从来没有使用过;(2)变量是否被初始化;(3)程序中是否包含了错误的类型转换;(4)程序中是否存在数组越界;(5)程序中是否存在非法指针;(6)程序中是否存在变量或函数的拼写错误;(7)程序中是否使用了外部变量或函数;单元测试的重点及其对策模块边界条件测试(1)普通合法数据处理是否正确;(2)普通非法数据处理是否正确;(3)边界附近的合法数据处理是否正确;(4)边界附近的非法数据处理是否正确。单元测试的重点及其对策模块独立路径测试通过对独立路径的测试,检查计算错误、逻辑错误和控制流错误。(1)程序中是否存在死代码;(2)程序中是否存在错误的计算优先级;(3)程序中是否存在计算精度错误;(4)表达式使用的符号是否正确;(5)循环变量的初始值是否正确。单元测试的重点及其对策内部错误处理测试(1)程序中是否存在检查出错的措施;(2)程序中是否存在处理出错的措施;(3)程序出错的处理措施是否有效。白盒测试的理想目标:(1)保证每个模块中的所有独立路径都被执行一次;(2)所有的逻辑值都要测试True和False;(3)在上下边界及可操作范围内运行所有循环;(4)检查内部数据结构,确保数据的有效性。常用逻辑覆盖语句覆盖率程序清单中的每一个语句均能在测试用例执行中运行过,以此发现语句中的错误或缺陷;这就可能要执行若干个测试用例,一般要求100%语句覆盖率;分支覆盖率要求执行足够的测试用例,使程序清单中每一个分叉至少都获得一次“真”值和“假”值,即每一个分支都执行到一次。这个要求看似简单,但当多重分支时,情况就显得非常复杂。一般要求80—90%的分支覆盖率;条件覆盖率要求执行足够的测试用例,使程序清单中每个条件获得各种可能的结果。因此,所需要的测试用例则更多。一般要求在60—80%的条件覆盖率;常用逻辑覆盖分支/条件覆盖率它要求执行足够的测试用例,使得程序清单中每个条件获得各种可能的值,并使得每个分支取到各种可能的结果。它似乎比较合理,但实际上并不一定能检查到这种程度;条件组合覆盖率它要求执行足够的测试用例,使得每个分支中条件的各种可能组合执行一次。当然,它的要求级别最高,测试用例的设计就更加困难。逻辑测试的技术要求单元测试的测试用例设计方法逻辑覆盖If(a1)and(b=0)thenx=x/aIf(a=2)or(x1)thenx=x+1开始x=x/aMx=x+1结束(a=2)or(x1)TTFF(a1)and(b=0)NKJTTFF单元测试的测试用例设计方法逻辑覆盖P1:(M-K-N-J),M=.T.andN=.T.;P2:(M-K-N),M=.T.andN=.F.;P3:(M-N-J),M=.F.andN=.T.;P4:(M-N),M=.F.andN=.F.。单元测试的测试用例设计方法逻辑覆盖1.语句覆盖语句覆盖是指设计足够的测试用例,使被测试程序中每个语句至少执行一次。M={a1and(b=0)}、N={a=2or(x1)}设计测试用例:①a=.T.,b=.T.,x=.T.(执行了所有语句)②a=.T.,b=.F.,x=.T.(K过程的语句没有执行)③a=.F.,b=.T.,x=.F.(K、J过程语句都没执行)单元测试的测试用例设计方法逻辑覆盖2.判定覆盖判定覆盖指设计足够的测试用例,使得被测程序中每个判定表达式至少获得一次“真”值和“假”值,从而使程序的每一个分支至少都通过一次。设计测试用例方法:每一个判定都取到T和F值,将多个判定进行组合。组合中的判定一定是一次为T一次为F。单元测试的测试用例设计方法M={a1and(b=0)},N={a=2or(x1)}M=.T.andN=.T.(P1)M=.F.andN=.F.(P4)M=.T.andN=.F.(P2)M=.F.andN=.T.(P3)输入数据{a=2,b=0,x=3}{a=1,b=0,x=1}输入数据{a=3,b=0,x=1}{a=2,b=1,x=3}判定覆盖的用例也满足了语句覆盖。但是,判定覆盖同样不能完全测出逻辑条件的错误。逻辑覆盖2.判定覆盖单元测试的测试用例设计方法3.条件覆盖条件覆盖是指设计足够的测试用例,使得判定表达式中每个条件的各种可能的值至少出现一次。四种条件:a1、b=0、a=2、x1。八种取值:T1、F1、T2、F2、T3、F3、T4、F4。设计测试用例:①a=F,b=T,x=F②a=T,b=F,x=T测试用例(输入数据)条件取值判定取值通过路径a=2,b=-1,x=-2T1,F2,T3,F4M:T1andF2=.F.N:T3orF4=.T.P3:(M-N-J)a=-1,b=0,x=3F1,T2,F3,T4M:F1andT2=.F.N:F3orT4=.T.P3:(M-N-J)单元测试的测试用例设计方法逻辑覆盖3.条件覆盖测试用例(输入数据)条件取值判定取值通过路径a=2,b=0,x=6T1,T2,T3,T4M:T1andT2=.T.N:T3orT4=.T.P1:(M-K-N-J)a=-1,b=-2,x=-3F1,F2,F3,F4M:F1andF2=.F.N:F3orF4=.F.P4:(M-N)单元测试的测试用例设计方法4.判定-条件覆盖判定-条件覆盖是指设计足够的测试用例,使得判定表达式的每个条件的所有可能取值至少出现一次,并使每个判定表达式所有可能的结果也至少出现一次。单元测试的测试用例设计方法逻辑覆盖5.条件组合覆盖条件组合覆盖是指设计足够的测试用例,使判定中的每个条件的所有可能至少出现一次,并且每种判定结果也至少出现一次。在实际的逻辑覆盖测试中,一般以条件组合覆盖为主来设计测试用例,然后再补充部分用例。以上a和b、a和x分别对应了4种组合。编号组合条件判定取值1T1,T2M=.T.2T1,F2M=.F.3F1,T2M=.F.4F1,F2M=.F.5T3,T4N=.T.6T3,F4N=.T.7F3,T4N=.T.8F3,F4N=.F.单元测试的测试用例设计方法5.条件组合覆盖测试用例(输入数据)取值条件覆盖路径编号组合输入:a=2,b=0,x=6T1,T2,T3,T4P1:(M-K-N-J)1,5输入:a=2,b=-1,x=-2T1,F2,T3,F4P3:(M-N-J)2,6输入:a=-1,b=0,x=3F1,T2,F3,T4P3:(M-N-J)3,7输入:a=-1,b=-2,x=-3F1,F2,F3,F4P4:(M-N)4,8M={a1and(b=0)},N={a=2or(x1)}单元测试的测试用例设计方法5.条件组合覆盖单元测试的测试用例设计方法路径测试路径测试是以程序控制流图为基础,通过分析控制结构的环路复杂性,导出可执行的路径集,设计对应各路径的测试用例进行测试。应当将覆盖的路径集合压缩到一定的限度内。工作步骤如下:(1)描述程序控制流图;(2)导出程序基本路径集合中的独立路径条数;(3)根据独立路径和结构,设计输入数据和预期结果;(4)利用测试用例进行测试。控制流图的画法:顺序结构if选择结构while循环结构until循环结构