单元测试及白盒测试技术_第1页
单元测试及白盒测试技术_第2页
单元测试及白盒测试技术_第3页
单元测试及白盒测试技术_第4页
单元测试及白盒测试技术_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单元测试与白盒测试技术Thursday,February2,2023内容介绍单元测试介绍单元测试设计单元测试用例设计单元测试执行单元测试评估实施时的原则和步骤单元测试中的白盒测试设计内容介绍单元测试介绍单元测试设计单元测试用例设计单元测试执行单元测试评估实施时的原则和步骤单元测试中的白盒测试设计单元测试介绍单元测试是对软件基本组成单元进行测试。基本单元可以是函数,类,类的方法,也可以是任何具有明确的功能、规格定义、明确的接口定义、并且其规模一般比较小。单元测试介绍(与系统测试相比较)单元测试的重点在于发现程序设计或实现的逻辑错误,基本输入白盒测试范畴。使问题及早暴露,便于问题的定位解决。允许多个测试单元的测试并行展开。(与集成测试相比较)单元测试的测试对象是对应详细设计中所描述的设计单位。而集成测试的对象是在概要设计中规划的模块及这些模块间的组合。单元测试介绍单元测试过程分为计划,设计,实现,执行,评估等几个步骤。单元测试介绍单元测试过程分为计划,设计,实现,执行,评估等几个步骤计划:确定测试需求,制定测试策略,确定测试所用资源(人力,设备),创建测试任务的时间表。设计:设计单元测试模型,制定测试方案,确认并结构化测试过程。实现单元测试:参考测试模型和测试方案,制定具体的测试用例,创建可重用的测试脚本。执行:根据单元测试的方案,用例对单元进行测试,验证测试的结果并记录测试过程中出现的缺陷。评估:对单元测试的结果进行评估。主要进行测试完备性评估。内容介绍单元测试介绍单元测试设计单元测试用例设计单元测试执行单元测试评估实施时的原则和步骤单元测试中的白盒测试设计2:单元测试设计主要包括:单元测试模型的设计。测试项目的设计。2.1单元测试模型的设计(1)构造单元测试模型的主要工作构造最小运行调度系统:驱动模块模拟实现单元接口:桩模块模拟生成测试数据或状态,为单元运行准备动态环境。还需要考虑对测试过程的支持测试结果的保留对测试覆盖率的纪录测试过程的自动化2.1单元测试模型的设计(2)单元测试环境示意图驱动模块被测单元桩模块1桩模块2桩模块3测试用例测试结果2.1单元测试模型的设计(3)驱动模块一般只是一个接受测试数据,并把数据传递给被测模块,然后打印相关结果的“主程序”。可以考虑自动获取测试数据的功能。桩模块替代那些被调用的模块,作少量的数据操作。保存或打印入口处的信息。插装代码用以纪录单元测试中覆盖率的信息。如果对某个单元的驱动模块和桩模块很难测试,那么可以考虑把这个单元的测试推迟到集成测试阶段。2.2测试项目的设计(1)测试项目是测试用例的总则,根据测试需求设计测试点。设计测试项目的时候,可以从功能覆盖和代码覆盖两个角度进行考虑。2.2测试项目的设计(2)功能覆盖属于黑盒测试的范畴。指出测试用例是否已经覆盖了程序应该提供的功能。功能覆盖率是考核单元测试质量的一个关键指标。2.2测试项目的设计(3)代码覆盖(逻辑覆盖)是考核单元测试质量的一个关键指标。是常用的白盒测试方法,包括:语句覆盖:设计若干测试用例,使得每一个可执行语句至少执行一次。判断覆盖:设计若干测试用例,使得程序中每个判断的取真分支和取假分支都至少执行一次。条件覆盖:设计若干测试用例,运行被测试程序,使得程序中每个判断的每个条件的可能取值至少执行一次。2.2测试项目的设计(4)代码覆盖(2)对于比较复杂的覆盖标准,难以进行100%的覆盖测试。此时一般使用测试率表示。不同的测试对象可以设定不同的测试覆盖率。比如:核心代码:100%共享资源库:100%非核心代码:90%覆盖率的统计可以用插装代码进行。可以有工具进行自动化插装代码。内容介绍单元测试介绍单元测试设计单元测试用例设计单元测试执行单元测试评估实施时的原则和步骤单元测试中的白盒测试设计3单元测试用例设计3.1单元测试用例编写原则3.2单元测试用例设计方法3.1单元测试用例编写原则(1)单元测试用例设计的根据是软件的设计说明书。完整的单元测试需要测试:被测单元作了它应该做的事情。被测单元没有作不希望它作的事情。设计用例可以按照5个基本步骤进行。3.1单元测试用例编写原则(2)基本步骤如下:为系统运行起来而设计用例单元测试用例中,第一个测试用例一般是使用最简单的方法执行被测单元。当这个用例可以被执行时,说明测试环境和测试单元是可用的。为正向测试而设计用例阅读相关的设计说明,每一个测试用例就是通过有针对性地测试说明书中的一项或者多项内容。用以验证设计说明书所对应的功能或性能能否实现。3.1单元测试用例编写原则(3)为逆向测试而设计用例用来验证被测单元没有做不应该做的事情。主要依靠错误猜测的方法进行测试用例的构造。为满足特殊要求而设计用例从系统的性能、安全性、保密性的角度来设计测试用例。为代码覆盖而设计用例为了保证特定的测试覆盖目标,可能还需要补充一些测试用例。3.2单元测试用例设计方法常用的设计方法有:规范(规格)导出法等价类划分法边界值分析法状态转移测试法分支测试法条件测试法数据定义-使用测试法内部边界值测试法错误猜测法单元测试用例-规范导出法(1)根据相应的规范描述来设计测试用例。每个测试用例被用来测试一个或多个规范陈述句。基本上是根据陈述规范所用语句的顺序来相应地为被测断垣设计测试用例。这个方法在用例和规范陈述之间做到了很好的对应。加强了规范的可读性和可维护性。是一种正向的测试技术,需要逆向的测试技术对测试用例进行补充。当规范中的某种情形需要不同的处理的时候,每个陈述句可能需要多个用例。单元测试用例-规范导出法(2)例子:计算平方根的函数的规范(1)输入:实数;输出:实数规范:当输入一个0或比0大的数的时候,返回其正平方根;当输入一个小于0的数时,显示错误信息“平方根非法-输入值小于0”并返回0;库函数Print-Line可以用来输出错误信息。单元测试用例-规范导出法(3)由规范的3个陈述,可以得到两个用例用例1:输入4,输出应该为2。对应于第一个陈述(当输入一个0或比0大的数时…)用例2:输入-1,输出0,并显示错误提示信息。对应于第二,第三个陈述(当输入一个小于0的数时,显示错误信息“平方根非法-输入值小于0”并返回0;库函数Print-Line可以用来输出错误信息。)单元测试用例-等价类划分法(1)等价类划分法是一种正式的测试用例设计方法.基于对被测单元的输入、输出所作的划分。对每一个划分中的所有输入、被测单元有等价的行为。假设某一特定的等价类中的所有值对于测试目的来说是等价的。那么可以在每个等价类中寻找一个值作为测试用例。当软件比较复杂的时候,等价类的划分也很复杂。基本上是一种正向测试技术。单元测试用例-等价类划分法(2)对于前面的例子:可以考虑作出如下划分输入(i)<0和(ii)>0。输出(a)>=0和(b)Error。测试用例有两个:输入4,输出2。对应于(ii)和b输入-10,输出0和错误提示。对应于(i)和(b)。单元测试用例-等价类划分法(3)实际上,通常复杂程度的程序就难以找到严格的等价类。如果考虑白盒的方法,等价类的划分准则可以是:具有相同(类似)的执行路径的输入。在例子中,如果对于输入大于0的时的处理有不同的方法,那么我们把输入大于0的划分继续细化。单元测试用例-边界值分析法(1)使用等价类测试方法相同的等价类划分。只是边界值分析假定错误更多地存在于划分的边界上,因此在边界上以及两侧的情况设计测试用例。边界值方法在软件变得复杂的时候会变得不实用。对于非向量类型的值(比如枚举值),边界分析没有意义。有些边界值在软件的实际使用中很少出现。由这样的用例找出的错误意义比较小。单元测试用例-边界值分析法(2)对于前面的例子:划分(ii)的边界为0和无穷大;划分(i)的边界为最小负实数和0;划分a有一个边界0。由此得到以下用例:输入{最小负实数}输入{绝对值很小的负数}输入0输入{绝对值很小的实数}输入{最大正实数}单元测试用例-状态转移测试法适用于以状态机作为模型或设计为状态的单元模块。通过能导致状态迁移的事件来测试状态之间的转换。可以设计逆向测试用例。比如状态和事件的非法组合。单元测试用例-分支测试法(1)根据单元中控制流分支或判断点来设计测试用例。通常用来达到一定的覆盖率。“黑盒”形式的分支测试“猜测”那里有分支,并设计相应的用例去测试该分支。类似于等价类划分。“白盒”形式如下:给定一个结构化的规格说明,说明单元中的控制流,就可以设计测试用例来测试其中的分支。单纯使用功能规格说明会导致分支遗漏设计分支测试的时候,不应该忽略整体的功能。单元测试用例-分支测试法(2)对于前面的例子,假设有如下的测试用例:1、输入4;2、输入-10。对于这个单元,有四种不同的实现ifinput<0then callprint_line“Squarerooterror-illegalnegativeinput” return0else calculatetheanswer returntheanswerend_if 实现1单元测试用例-分支测试法(3)例子的不同实现ifinput<0then callprint_line“Squarerooterror-illegalnegativeinput” return0elseifinput==0thenreturn0elsecalculatetheanswerreturntheanswerend_if 实现2callco-processortocalculatetheanswerexamineco-processorstatusregistersifstatus=errorthen callprint_line“Squarerooterror-illegalnegativeinput” return0else returntheanswerend_if 实现3单元测试用例-分支测试法(3)例子的不同实现(续)ifinput<0then callprint_line“Squarerooterror-illegalnegativeinput” return0elseifinput==0thenreturn0elsecalculatethefirstapproximationLOOP calculateerror EXIT_LOOPWHENerror<desiredaccuracy adjustapproximationEND_LOOPreturntheanswerend_if 实现4单元测试用例-条件测试法(1)条件测试法的目标是测试在每个逻辑条件的单个成分及他们的组合情况下,程序是正确的。可以使用多个用例来达到一定的覆盖率。比如:MCDC(ModifiedConditionDecisionCoverage)白盒测试技术。比较适合于有结构化规格说明的单元。它提供了一个全面的测试,包括复杂条件,编程和设计错误多发区域,以及分支测试不能达到的区域。单元测试用例-条件测试法(2)考虑前面的例子:ifinput<0then callprint_line“Squarerooterror-illegalnegativeinput” return0elseifinput==0thenreturn0elsecalculatethefirstapproximationLOOP calculateerror EXIT_LOOPWHEN(error<desiredaccuracy)or(iterations=10) adjustapproximationEND_LOOPreturntheanswerend_if 实现4单元测试用例-条件测试法(3)测试用例就要证明error<desiredaccuracy和iterations=10都能够成立。测试用例1:10次迭代,每次误差都大于期望误差。显示条件iterations=10单独满足。测试用例2:2次迭代后,误差小于期望误差。error<desiredaccuracy单独满足。单元测试用例-数据流法(1)又称为数据定义-使用测试法。数据定义是指数据项被赋值的地方,数据使用是指数据项被读或使用的地方。目的是设计测试用例,以驱动执行数据定义和使用之间的路径。用例设计的第一步是列出所有的数据定义使用对。然后根据定义-使用对来设计相应的用例。单元测试用例-数据流法(2)前面的例子定义使用1InputroutineBythemathsco-processor2Co-processorstatusTestforstatus=error3ErrormessageByPrint_Line4RETURN0Bythecallingunit5Answerbyco-processorRETURNtheanswer6RETURNtheanswerBythecallingunit单元测试用例-数据流法(3)测试用例设计如下:测试用例1:输入4,返回2。测试定义-使用对1,2,5,6。测试用例2:输入-10,返回0,输出“平方根错误…”。测试定义使用对1,2,3,4。单元测试用例-内部边界值法(1)大多数情况下,可以从单元的功能规格说明中导出等价类和边界值测试。但是,在实现的时候可能会引入其他的边界。测试需要增加新的等价类。前面的例子中,如果从效率上考虑,可能会根据输入的大小,调用不同的处理方法。此时,需要按照单元内部的结构再细化等价类。输入的等价类分为:input<0;input>=0&&input<100;input>=100单元测试用例-内部边界值法(2)if(input>=100)then usemethod1tocalculatetherootelse usemethod2tocalculatetheroot.错误猜测法基于经验和其他一些测试技术。在经验的基础上,测试者猜测错误的类型及在特定的软件中错误发生的位置,类型,并设计测试用例去发现他们。可能需要根据经验,得到一个可能错误列表。然后根据这个列表去生成用例。纯粹依赖于经验。一般只能作为辅助方法。内容介绍单元测试介绍单元测试设计单元测试用例设计单元测试执行单元测试评估实施时的原则和步骤单元测试中的白盒测试设计4单元测试的执行(1)测试中模拟运行环境的程序执行精确性和测试结论有关。在单元程序测试的时候,需要考虑所有可能影响单元测试结果的因素。这些因素包括:隐性输入,关联系统。可以考虑使用一些工具来完成设置。4单元测试的执行自动测试可以大大提高测试执行的效率,便于回归测试。可以使用商业化的测试工具。也可以考虑自行开发一些工具。自动测试通过预定义的脚本文件将测试用例逐条放入文件。由驱动程序读取文件,驱动被测单元,将得到的结果存放在文件中(或者自动比较)。和界面有关的测试,可以通过Record&Replay工具进行。但是要注意模块化。内容介绍单元测试介绍单元测试设计单元测试用例设计单元测试执行单元测试评估实施时的原则和步骤单元测试中的白盒测试设计5单元测试的评估单元测试完成后,需要对测试效果进行评估:测试完备性评估:检查测试过程中是否已经执行了所有的测试用例。代码覆盖率评估:根据覆盖率工具提供的覆盖情况进行评估。可能因为某些原因使得覆盖率达不到要求。不可能路径和条件不可达的或者冗余的代码。不充分的测试用例。为了覆盖率而拼凑测试用例是低效率的。内容介绍单元测试介绍单元测试设计测试用例应用方法单元测试执行单元测试评估实施时的原则和步骤单元测试中的白盒测试设计6实施时的原则和步骤(1)总则:排除测试的随意性,使得测试方法化,流程化精心制定测试计划严格评审测试计划严格执行测试计划系统分析测试结果并提交报告。6实施时的原则和步骤(2)制定测试计划/方案重点是测试用例的设计,必须按照有关设计方法进行用例设计。白盒测试法中的逻辑覆盖测试:语句覆盖,判断覆盖,判定-条件覆盖,条件-组合覆盖、路径覆盖,…黑盒测试中的等价类划分法,边界值分析法,错误推测方法等。6实施时的原则和步骤(3)测试计划评审由测试人员进行,开发人员配合,对测试计划进行评审和修改,并最后达成最终计划。评审内容包括:方法性,合理性,全面性和最优性。测试计划执行由测试操作人员按照指定的测试计划流程化地进行。及时反馈问题。保证按照测试计划要求实施。当测试过程比较规整化的时候,可以考虑由开发人员自身执行。6实施时的原则和步骤(4)测试结果分析并提交报告测试人员和开发人员共同对测试结果进行分析,归类,给出错误原因和解决方法,对结果进行报告和归档。测试文档报告包含如下内容:单元名称(id)和描述;单元的目的和功能简单描述;单元和其他单元的依赖关系;测试用例测试环境、过程和步骤地描述实际测试结果错误跟踪分析测试人员和完成时间测试评审其它情况内容介绍单元测试介绍单元测试设计单元测试用例设计单元测试执行单元测试评估实施时的原则和步骤单元测试中的白盒测试设计7单元测试中的白盒测试设计白盒测试主要检查程序的内部结构、逻辑、循环和路径。常用方法有:逻辑覆盖和基本路径覆盖按照覆盖目标不同,逻辑覆盖有可以分为:语句覆盖,判定覆盖,判定-条件覆盖、条件组合覆盖以及路径覆盖。白盒测试的模块例子(1)程序流程框图a(A>1)and(B=0)(A=2)or(X>0)X=X+1X=X/AFFTTbcde白盒测试的模块例子(2)4个可能的路径以及应该满足的表达式L1(ace):MandNL2(abd):~Mand~NL3(abe):~MandNL4(acd):Mand~N其中M={(A>1)and(B=0)};

N={(A=2)or(X/A>1)}语句覆盖语句覆盖:就是指设计若干个测试用例,使得用这些测试用例执行测试之后使得每一条可执行语句至少被执行一遍。对于前面的例子,L1包含了所有的可执行语句,所以根据L1来设计测试用例就可以达到100%语句覆盖。用例如下:{input(A,B,x);output(A,B,x)}={(2,0,4),(2,0,3)}语句覆盖的不足语句覆盖可以保证检验了每一个可执行语句。但是不能保证用于控制的逻辑运算得到充分的检验。比如第一个逻辑运算中的and错写成了or,最后的结果仍然成立。语句覆盖是最弱的逻辑覆盖。if(A>1)and(B=0) x=x/A;if(A=2)or(X>0) x=x+1;判断覆盖又称为分支覆盖:设计若干个测试用例,执行测试,使得被测单元中的每个判断的取值TRUE和FALSE分支至少经历一次。对于判断(A>1)and(B=0)和(A=2)or(X>0)分别测试其true,false分支。可以选择L1,L2组合或者L3,L4组合。对于L1,L2组合,L1:{(2,0,4),(2,0,3)}L2:{(1,0,-1),(1,0,-1)};对于L3,L4组合,L1:{(2,1,1),(2,1,2)}L2:{(3,0,3),(3,1,1)};判断覆盖的不足复合判断中,某个子判断的错误不一定引起整个判断的值的改变。这样的错误可能被漏掉。比如:使用上面定义的测试的时候,如果第二个判断中X>0成为了X<10,最后的结果还是一样的。两组测试用例都不能测试这些值。弥补这个缺陷的是条件覆盖。条件覆盖(1)设计若干个用例,执行测试,使得程序中每个判断的每个条件的可能取值至少执行一次。条件包括:A>1:T1 notA>1:F1B=0:T2 notB=0:F2A=2:T3 notA=2:F3x>1:T4 notx>1:F4if(A>1)and(B=0) x=x/A;if(A=2)or(X>0) x=x+1;条件覆盖(2)下面的两组测试用例都满足条件覆盖要求:测试用例通过路径条件取值覆盖分支{(1,0,3),(1,0,4)}abe(L3)F1,T2,F3,F4b,e{(2,1,1),(2,1,2)}abe(L3)T1,F2,T3,F4b,e测试用例通过路径条件取值覆盖分支{(2,0,4),(2,0,3)}L1T1,T2,T3,T4c,e{(1,0,1),(1,0,1)}L2F1,T2,F3,F4b,d{(2,1,1),(2,1,2)}L3T1,F2,T3,F4b,e条件覆盖(3)不足之处:虽然可以保证每个条件都取不同的值,但是不能保证每个判断都取不同的值。有时甚至不能满足分支覆盖的要求。比如前面的第一组用例。使用判断-条件覆盖来弥补这个不足。判断-条件覆盖(1)判断-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果至少执行一次。测试用例的例子:测试用例通过路径条件取值覆盖分支{(2,0,4),(2,0,3)}ace(L1)T1,T2,T3,T4c,e{(2,1,1),(2,1,2)}abd(L2)F1,F2,F3,F4b,d判断-条件覆盖(2)判断-条件覆盖的不足之处:某些条件的值错误的时候,判断的值依旧可能是正确的。此时,有关这个条件的错误可能没有被发现。(A>1)AND(B=0),如果第一个条件不成立,那么不管

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论