




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章白盒测试及其用例的设计3.1白盒测试方法3.2控制流图3.3白盒测试覆盖指标3.4数据流测试3.5白盒测试方法总结第3章白盒测试及其用例的设计3.1白盒测试方法本章教学目标理论环节学习理解白盒测试方法的基本概念学习理解白盒测试的覆盖理论学习掌握白盒测试的路径表达学习掌握白盒测试的基本路径测试法学习掌握白盒测试的数据流测试法实践环节通过案例运用学习掌握覆盖问题的解决方法运用基本路径测试方法进行实际程序测试本章教学目标理论环节3.1白盒测试方法为什么要进行白盒测试?如果所有软件错误的根源都可以追溯到某个唯一原因,那么问题就简单了。然而,事实上一个bug常常是由多个因素共同导致的,如下图所示。假设此时开发工作已结束,程序送交到测试组,没有人知道代码中有一个潜在的被0除的错误。若测试组采用的测试用例的执行路径没有同时经过x=0和y=5/x进行测试,显然测试工作似乎非常完善,测试用例覆盖了所有执行语句,也没有被0除的错误发生。3.1白盒测试方法为什么要进行白盒测试?假白盒测试方法(续)白盒测试也称结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例。白盒测试法检查程序内部逻辑结构,对所有逻辑路径进行测试,是一种穷举路径的测试方法。但即使每条路径都测试过了,仍然可能存在错误。因为:穷举路径测试无法检查出程序本身是否违反了设计规范,即程序是否是一个错误的程序。穷举路径测试不可能查出程序因为遗漏路径而出错。穷举路径测试发现不了一些与数据相关的错误。白盒测试方法(续)白盒测试也称结构测试或逻辑驱动测试,是针对白盒测试方法(续)采用白盒测试方法必须遵循以下几条原则,才能达到测试的目的:保证一个模块中的所有独立路径至少被测试一次。所有逻辑值均需测试真(true)和假(false)两种情况。检查程序的内部数据结构,保证其结构的有效性。在上下边界及可操作范围内运行所有循环。白盒测试方法(续)采用白盒测试方法必须遵循以下几条原则,才能白盒测试常用的测试用例设计方法逻辑覆盖以程序内部的逻辑结构为基础;根据覆盖测试的目标,逻辑覆盖分为:语句、判定、条件、判定/条件、组合、路径基本路径测试为了解决路径庞大难题;在程序控制流程图的基础上,分析控制构造的环路复杂性,导出基本可执行路径集合,设计测试用例的方法。白盒测试常用的测试用例设计方法逻辑覆盖3.3控制流图控制流图(可简称流图)是对程序流程图进行简化后得到的,它可以更加突出的表示程序控制流的结构,唯一的。控制流图中包括两种图形符号:节点和控制流线。节点由带标号的圆圈表示,可代表一个或多个语句、一个处理框序列和一个条件判定框(假设不包含复合条件)。控制流线由带箭头的弧或线表示,可称为边。它代表程序中的控制流。对于复合条件,则可将其分解为多个单个条件,并映射成控制流图。常见结构的控制流图3.3控制流图控制流图(可简称流图)是对程序流程图进行简化常见结构的控制流图其中,包含条件的节点被称为判定节点(也叫谓词节点),由判定节点发出的边必须终止于某一个节点,由边和节点所限定的范围被称为区域。常见结构的控制流图其中,包含条件的节点被称为判定节点(也叫谓软件测试-3白盒测试及其用例的设计课件软件测试-3白盒测试及其用例的设计课件转化程序流程图为控制流图
A>1and
B=0
X=X/A
1
2
3
A>1
B=0
X=X/A
2
3
1
4
YYY转化程序流程图为控制流图A>1andB=0X=X/3.3覆盖测试3.4.1测试覆盖率3.4.2逻辑覆盖法3.4.3功能覆盖3.4.4其他覆盖3.4.5如何使用覆盖率3.4.6测试覆盖准则3.3覆盖测试3.4.1测试覆盖率结构测试中的一个重要问题是,测试进行到什么地步就达到要求,可以结束测试。这需要给出结构测试的覆盖准则。结构测试中的一个重要问题是,测试进行到什么地步就达到要求,可3.3.1测试覆盖率测试覆盖率:用于确定测试所执行到的覆盖项的百分比。其中的覆盖项是指作为测试基础的一个入口或属性,比如语句、分支、条件等。通过覆盖率数据可以知道测试得是否充分,测试的弱点在哪些方面,从而指导我们设计能够增加覆盖率的测试用例。能够有效地提高测试质量,避免设计无效用例。在测试分析报告中可以作为量化指标的依据,测试覆盖率越高效果越好。但覆盖率不是目标,只是一种手段。3.3.1测试覆盖率测试覆盖率:用于确定测试所执行到的覆覆盖率概念覆盖率是用来度量测试完整性的一个手段。本身并不包含测试技术,只是测试技术有效性的一个度量。
覆盖率种类:逻辑覆盖(LogicalCoverage),也叫:代码覆盖率(CodeCoverage)结构化覆盖率(StructuralCoverage)功能覆盖(FunctionCoverage)。
覆盖率概念覆盖率是用来度量测试完整性的一个手段。本身3.3.2逻辑覆盖法根据覆盖目标的不同,逻辑覆盖可分为语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。语句覆盖:选择若干个测试用例,运行被测程序,使得程序中的每个可执行语句至少执行一次。覆盖指标C0判定覆盖(分支覆盖):选择若干个测试用例,运行被测程序,使得程序中的每个判断真假值均曾被满足,也就是使程序中的每个取“真”分支和取“假”分支至少均经历一次。覆盖指标C1条件覆盖:选择若干个测试用例,运行被测程序,使得程序中每个判定包含的每个条件的可能取值(真/假)都至少满足一次。3.3.2逻辑覆盖法根据覆盖目标的不同,逻辑覆盖可分为语逻辑覆盖法(续)判定-条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的所有情况(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。——满足判定-条件覆盖的测试用例一定同时满足判定覆盖和条件覆盖。组合覆盖:通过执行足够的测试用例,使得程序中每个判定的所有可能的条件取值组合都至少出现一次。覆盖指标CMCC
——满足组合覆盖的测试用例一定满足判定覆盖、条件覆盖和判定-条件覆盖。路径覆盖:设计足够多的测试用例,要求覆盖程序中所有可能的路径。覆盖指标C∞逻辑覆盖法(续)判定-条件覆盖:设计足够多的测试用例,使得程逻辑覆盖法(续)组合覆盖判定-条件覆盖判定覆盖条件覆盖语句覆盖逻辑覆盖法(续)组合覆盖判定-条件覆盖判定覆盖条件覆盖语句覆逻辑覆盖法(续)voidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;j=sqrt(k);}//语句块1if((x==4)||(y>5)){j=x*y+10;}//语句块2
j=j%3;//语句块3}逻辑覆盖法(续)voidDoWork(intx,in逻辑覆盖法(续)X>3&&z<10执行语句块1执行语句块2X==4||y>5执行语句块3FFTTabdce逻辑覆盖法(续)X>3&&z<10执行语句块1执行语句块语句覆盖要实现DoWork函数的语句覆盖,只需设计一个测试用例就可以覆盖程序中的所有可执行语句。测试用例输入为:{x=4、y=5、z=5}程序执行的路径是:abd分析:语句覆盖可以保证程序中的每个语句都得到执行,但发现不了判定中逻辑运算的错误,即它并不是一种充分的检验方法。例如在第一个判定((x>3)&&(z<10))中把“&&”错误的写成了“||”,这时仍使用该测试用例,则程序仍会按照流程图上的路径abd执行。可以说语句覆盖是最弱的逻辑覆盖准则。语句覆盖要实现DoWork函数的语句覆盖,只需设计一个测试用判定覆盖注:教材中又称为DD-路径覆盖,测试满足DD-路径覆盖要求可以发现全部缺陷的85%要实现DoWork函数的判定覆盖,需要设计两个测试用例。测试用例的输入为:{x=4、y=5、z=5};{x=2、y=5、z=5}程序执行的路径分别是:abd;ace分析:上述两个测试用例不仅满足了判定覆盖,同时还做到语句覆盖。从这点看似乎判定覆盖比语句覆盖更强一些,但仍然无法确定判定内部条件的错误。例如把第二个判定中的条件y>5错误写为y<5,使用上述测试用例,照样能按原路径执行而不影响结果。因此,需要有更强的逻辑覆盖准则去检验判定内的条件。判定覆盖注:教材中又称为DD-路径覆盖,测试满足DD-路径覆判定覆盖(续)13524说明:以上仅考虑了两出口的判断,我们还应把判定覆盖准则扩充到多出口判断(如Case语句)的情况。因此,判定覆盖更为广泛的含义应该是使得每一个判定获得每一种可能的结果至少一次。6789105’判定覆盖(续)13524说明:以上仅考虑了两出口的判断,我们条件覆盖在实际程序代码中,一个判定中通常都包含若干条件。条件覆盖的目的是设计若干测试用例,在执行被测程序后,要使每个判定中每个条件的可能值至少满足一次。对DoWork函数的各个判定的各种条件取值加以标记。对于第一个判定((x>3)&&(z<10)): 条件x>3取真值记为T1,取假值记为-T1
条件z<10取真值记为T2,取假值记为-T2对于第二个判定((x==4)||(y>5)):条件x==4取真值记为T3,取假值记为-T3条件y>5取真值记为T4,取假值记为-T4条件覆盖在实际程序代码中,一个判定中通常都包含若干条件。条条件覆盖(续)根据条件覆盖的基本思想,要使上述4个条件可能产生的8种情况至少满足一次,设计测试用例如下:分析:上面这组测试用例不但覆盖了4个条件的全部8种情况,而且将两个判定的4个分支b、c、d、e也同时覆盖了,即同时达到了条件覆盖和判定覆盖。条件覆盖(续)根据条件覆盖的基本思想,要使上述4个条件可能产条件覆盖(续)说明:虽然前面的一组测试用例同时达到了条件覆盖和判定覆盖,但是,并不是说满足条件覆盖就一定能满足判定覆盖。如果设计了下表中的这组测试用例,则虽然满足了条件覆盖,但只是覆盖了程序中第一个判定的取假分支c和第二个判定的取真分支d,不满足判定覆盖的要求。条件覆盖(续)说明:虽然前面的一组测试用例同时达到了条件覆盖判定-条件覆盖判定-条件覆盖实际上是将判定覆盖和条件覆盖结合起来的一种方法,即:设计足够的测试用例,使得判定中每个条件的所有可能取值至少满足一次,同时每个判定的可能结果也至少出现一次。根据判定-条件覆盖的基本思想,只需设计以下两个测试用例便可以覆盖4个条件的8种取值以及4个判定分支。判定-条件覆盖判定-条件覆盖实际上是将判定覆盖和条件覆盖结合判定-条件覆盖(续)分析:从表面上看,判定-条件覆盖测试了各个判定中的所有条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某些条件将会被其它条件所掩盖。因此,判定-条件覆盖也不一定能够完全检查出逻辑表达式中的错误。例如:对于第一个判定(x>3)&&(z<10)来说,必须x>3和z<10这两个条件同时满足才能确定该判定为真。如果x>3为假,则编译器将不再检查z<10这个条件,那么即使这个条件有错也无法被发现。对于第二个判定(x==4)||(y>5)来说,若条件x==4满足,就认为该判定为真,这时将不会再检查y>5,那么同样也无法发现这个条件中的错误。判定-条件覆盖(续)分析:从表面上看,判定-条件覆盖测试了各组合覆盖组合覆盖的目的是要使设计的测试用例能覆盖每一个判定的所有可能的条件取值组合。对DoWork函数中的各个判定的条件取值组合加以标记:1、x>3,z<10记做T1T2,第一个判定的取真分支2、x>3,z>=10记做T1-T2,第一个判定的取假分支3、x<=3,z<10记做-T1T2,第一个判定的取假分支4、x<=3,z>=10记做-T1-T2,第一个判定的取假分支5、x==4,y>5记做T3T4,第二个判定的取真分支6、x==4,y<=5记做T3-T4,第二个判定的取真分支7、x!=4,y>5记做-T3T4,第二个判定的取真分支8、x!=4,y<=5记做-T3-T4,第二个判定的取假分支组合覆盖组合覆盖的目的是要使设计的测试用例能覆盖每一个判定的组合覆盖(续)根据组合覆盖的基本思想,设计测试用例如下:分析:上面这组测试用例覆盖了所有8种条件取值的组合,覆盖了所有判定的真假分支,但是却丢失了一条路径abe。组合覆盖(续)根据组合覆盖的基本思想,设计测试用例如下:分析路径覆盖前面提到的5种逻辑覆盖都未涉及到路径的覆盖。事实上,只有当程序中的每一条路径都受到了检验,才能使程序受到全面检验。路径覆盖的目的就是要使设计的测试用例能覆盖被测程序中所有可能的路径。根据路径覆盖的基本思想,在满足组合覆盖的测试用例中修改其中一个测试用例,则可以实现路径覆盖:路径覆盖前面提到的5种逻辑覆盖都未涉及到路径的覆盖。事实上,路径覆盖(续)分析:虽然前面一组测试用例满足了路径覆盖,但并没有覆盖程序中所有的条件组合(丢失了组合3和7),即满足路径覆盖的测试用例并不一定满足组合覆盖。说明:对于比较简单的小程序,实现路径覆盖是可能做到的。但如果程序中出现较多判断和较多循环,可能的路径数目将会急剧增长,要在测试中覆盖所有的路径是无法实现的。为了解决这个难题,只有把覆盖路径数量压缩到一定的限度内,如程序中的循环体只执行一次。在实际测试中,即使对于路径数很有限的程序已经做到路径覆盖,仍然不能保证被测试程序的正确性。路径覆盖(续)分析:虽然前面一组测试用例满足了路径覆盖,但并逻辑覆盖小结各种结构测试方法都不能保证程序的正确性。测试的目的并非要证明程序的正确性,而是要尽可能找出程序中的错误。逻辑覆盖率可以作为测试完整性的一个度量。即使达到100%的逻辑覆盖率,仍然无法保证程序的正确性;确实并不存在一种十全十美的测试方法,能够发现所有的错误。逻辑覆盖小结各种结构测试方法都不能保证程序的正确性。3.4.3功能覆盖 功能覆盖属于黑盒测试范畴。常见的是需求覆盖和接口覆盖。
需求覆盖:通过设计一定的测试用例,要求每个需求点都被测试到。
接口覆盖:也叫入口点覆盖,接口覆盖要求通过设计一定的用例使系统的每个接口都被测试到。
3.4.3功能覆盖 功能覆盖属于黑盒测试范畴。常见的是需求3.4.4其他覆盖率函数覆盖定义:在测试中有哪些函数被测试到了,其被测试到的频率有多大,这些函数在系统所有函数中占的比例有多大。是针对系统或一个子系统而测试的;比较容易自动化(TrueCoveragePureCoverage);易于理解。指令块覆盖是语句覆盖的一个变体。3.4.4其他覆盖率函数覆盖3.4.5如何使用覆盖率 在选择和使用覆盖率时,必须遵循的基本原则:覆盖率不是目的,只是一种手段;不可能针对所有的覆盖率指标去进行测试;只考虑一种覆盖率指标也是不恰当的;不要追求绝对100%的覆盖率。3.4.5如何使用覆盖率 在选择和使用覆盖率时,必须遵循评价标准覆盖率度量覆盖率评价表评价标准覆盖覆盖率评价表课堂练习为以下流程图所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、组合覆盖和路径覆盖。(A>1)and(B=0)(A=2)or(X>1)X=X/AX=X+1TTFFbdcea课堂练习为以下流程图所示的程序段设计一组测试用例,要求分别满A=2,B=0,X=4(沿路径ace执行);语句覆盖测试用例A=2,B=0,X=4(沿路径ace执行);语句覆盖测试用A=3,B=0,X=3(acd);A=2,B=1,X=1(abe);aa判定覆盖测试用例A=3,B=0,X=3(acd);A=2,B=1,X=1A=2,B=1,X=1(abe);A=1,B=0,X=3(abe);条件覆盖测试用例A=2,B=1,X=1(abe);A=1,B=0,X=3判定-条件覆盖测试用例判定-条件覆盖测试用例判定条件的8种组合:A>1,B=0记为T1,T2;A>1,B<>0记为T1,F2;A<=1,B=0记为F1,T2;A<=1,B<>0记为F1,F2;A=2,X>1记为T3,T4;A=2,X<=1记为T3,F4;A<>2,X>1记为F3,T4;A<>2,X<=1记为F3,F4;判定条件的8种组合:组合覆盖测试用例组合覆盖测试用例A=2,B=0,X=4(ace)A=2,B=1,X=1(abe)组合覆盖测试用例A=2,B=0,X=4(ace)A=2,B=1,X=1(abA=1,B=1,X=1(abd)A=1,B=0,X=3(abe)组合覆盖测试用例A=1,B=1,X=1(abd)A=1,B=0,X=3(ab路径覆盖测试用例路径覆盖测试用例3.7数据流测试数据流分析最初是随着编译系统要生成有效的目标码而出现的,这类方法主要用于代码优化。近年来在测试中也得到成功运用,查找引用未定义变量等程序错误,查找对以前未曾使用的变量再次赋值等数据流异常的情况。这常常是常见程序错误的表现形式,如:错拼名字、名字混淆或丢失了语句。3.7数据流测试数据流分析最初是随着编译系统要生成有效的目数据流测试关注变量定义赋值点(语句)和引用或使用这些值的点(语句)的结构性测试。用作路径测试的真实性检查。程序和程序的元素通过它们的数据访问行为关联起来,确定了数据流关系。数据流测试形式:定义/使用测试基于程序片的测试定义/使用路径和片的定义能够非常准确地描述要测试的程序部分数据流测试关注变量定义赋值点(语句)和引用或使用这些值的点(常见的数据流异常包括:变量被定义,但是从来没有使用;所使用的变量没有被定义;变量在使用之前被定义两次;等待一个还没有被安排的进程;安排一个与其自身相同的进程;等待一个先前已经被中止了的进程;引用一个在并行进程中被定义的变量;引用一个值不确定的变量。这些异常通过静态分析发现常见的数据流异常包括:举例:程序Main:program:declareintegerx,y;declarebooleanflag;T1:task;writex;waitforT3;closeT1;T2:task;x=5;y=6;closeT2;T3:task;readx;closeT3;scheduleT1;scheduleT2;readflag;ifflagthenx=8;writex;y=9;waitforT2;ifflagtheny=10;writey;waitforT2;scheduleT1;closeMain;举例:程序Main:program:schedule数据流图(1)Main:Program(15)scheduleT1(16)scheduleT2(17)defflag(18)ifflagthendefx(19)refx(20)defy(21)waitforT2(22)ifflag(23)refy(24)waitforT2(25)scheduleT1(26)closeMainthendefy(8)T2:task(4)T1:task(12)T3:task(13)defx(14)closeT3(5)refx(6)waitforT3(7)closeT1(9)defx(10)defy(11)closeT2数据流图(1)Main:Program(15)sched可能的异常变量x在语句第5行处的引用可能没有被定义,这是因为任务T1可能在任务T2开始前结束;在任务T2(第10行)以及主程序第20行发现的变量y的定义可能没有用,这是因为y会在其可能被引用前在第22行被重新定义;y被两个可能并行执行的进程定义,并且这样在第23行的引用其值可能是无法确定的;变量x在任务T2(第9行)被赋了一个值,然而,同时又在主程序第19行处被引用;可能的异常变量x在语句第5行处的引用可能没有被定义,这是因为可能的异常(续)存在这样一个可能性,即T1可能在第25行被并行安排,因为没有任何保证T1在最初被安排后会终结;第24行的等待是没有必要的,因为T2被保证在第21行终结,并且随后没有再被安排过;第6行的等待永远不会被满足,因为T3从来没有被安排过。可能的异常(续)存在这样一个可能性,即T1可能在第25行被并例如例如第一个语句定义3个变量X,Y和Z;表明它们的值是程序外赋给的。出口语句引用Z,表明Z的值被送给外部环境。第一个语句定义3个变量X,Y和Z;表明它们的值是程序外赋给的该程序含有2个错误:语句2使用了变量W,而在此之前未定义;语句5、6使用变量V,这在第一次执行循环时也未对其定义过。该程序还包含两个异常:语句6对Z的定义从未使用过;语句8对W的定义也从未使用过。可以把程序写得更容易理解,从而能够简化验证工作,以及随后的维护工作。该程序含有2个错误:该方法提供一种检查缺陷可能发生点的严格和系统化方法。假设程序图中的节点代表语句片段,且程序遵循结构化程序设计规则,不允许有从节点到自身的边。P——程序G(P)——P的程序图V——P的一组程序变量,v——P的变量PATHS(P)——P中所有路径集合3.7.1定义/使用测试该方法提供一种检查缺陷可能发生点的严格和系统化方法。3.7.v的定义节点n∈G(P):当且仅当v的值由对应节点n的语句片段处定义,DEF(v,n)v的使用节点n∈G(P):当且仅当v的值由对应节点n的语句片段处使用,USE(v,n)USE(v,n)是谓词使用(P-use,外度≥2):当且仅当语句n是谓词语句,否则是计算使用(C-use,外度≤1)。定义v的定义节点n∈G(P):当且仅当v的值由对应节点n的语句X:=Y+ZIfY>ZthengotoexitREADX//输入语句WRITEX//输出语句X:=Y+Zv的定义-使用路径(du-path):PATHS(P)中的路径,使对v∈V,存在DEF(v,m)和USE(v,n),m,n分别为路径的最初和最终节点v的定义-清除路径(dc-path):PATHS(P)中的具有最初DEF(v,m)和最终节点USE(v,n)的路径,该路径中没有其它节点是v的定义节点。注意:不是定义-清除的定义-使用路径,可能是出问题的地方。v的定义-使用路径(du-path):PATHS(P)中的举例(佣金问题)伪代码、程序图、DD路径表、DD-路径图变量定义节点和使用节点(表10-2)举例(佣金问题)部分变量的定义/使用路径(表10-3)stocks的定义/使用路径(1╳1)locks的定义/使用路径(2╳2)totallocks的定义/使用路径(2╳3)sales的定义/使用路径(1╳6)commission的定义/使用路径(6╳4)注意:机械组合的物理路径逻辑上不一定可行部分变量的定义/使用路径(表10-3)如:commission的定义-使用路径31,37;32,37;33,32;33,37;36,32;36,33;37,32;37,33;38,32;38,33;38,37都不可行如:commission的定义-使用路径31,37;32,3全定义准则:当且仅当T包含从所有v的每个定义节点到v的一个使用的定义清除路径全使用准则:当且仅当T包含从所有v的每个定义节点到v的所有使用,以及到所有USE(v,n)后续节点的定义清除路径定义/使用路径测试覆盖指标假设:定义/使用路径均可行;T:拥有变量集合V的程序P的程序图G(P)中的一个路径集合全定义准则:定义/使用路径测试覆盖指标全谓词使用/部分计算使用准则: 当且仅当T包含从所有v的每个定义节点到v的所有谓词使用的定义清除路径,如果v的一个定义没有谓词使用,则定义清除路径导致至少一个计算使用全计算使用/部分谓词使用准则: 当且仅当T包含从所有v的每个定义节点到v的所有计算使用的定义清除路径,如果v的一个定义没有计算使用,则定义清除路径导致至少一个谓词使用全谓词使用/部分计算使用准则:全定义-使用路径准则: 当且仅当T包含从所有v的每个定义节点到v的 所有使用,以及到所有USE(v,n)后续节点的定义清除路径,并且这些路径要么有一次环路经过,要么没有环路。
定义/使用路径测试覆盖指标以上面5种情况为依据选择路径的集合,这些指标的关系如下:全定义-使用路径准则:定义/使用路径测试覆盖指标关系全路径全定义-使用路径全使用全计算使用/部分谓词使用全谓词使用/部分计算使用全定义全谓词使用全边全节点高低定义/使用路径测试覆盖指标关系全路径全定义-使用路径全使用全程序片是确定或影响某个变量在程序某个点上的取值的一组程序语句;片测试可以消除变量之间的交互对测试的影响;片测试的原则是选择恰当,完整的片,对每个片进行测试。3.7.2基于程序片的测试3.7.2基于程序片的测试定义:P中对V中的变量值作出贡献的所有语句的集合,即V在语句n上的一个片,S(V,n)或P中在n以前对V中的变量值作出贡献的所有语句片段编号的集合,即V在语句片段n上的一个片,S(V,n)程序片程序片片和贡献的含义片:将程序分为具有某种功能/含义的组件;贡献(USE):
谓词使用用在谓词(判断)中 计算使用用在计算中 输出使用用于输出 定位使用用于定位(指针、下标) 迭代使用迭代(内部计数器、循环指示) 输入定义通过输入定义 赋值定义通过赋值定义片内语句片断选择原则:包含和不包含该语句片段,变量v取值不同片和贡献的含义举例1begin2read(x,y);3total:=0.0;4sum:=0.0;5ifx<=16thensum:=y7elsebegin8read(z);9total:=x*y10end;11write(total,sum)12end举例1begin第一个切片1begin2read(x,y);3total:=0.0;4sum:=0.0;5ifx<=16thensum:=y7elsebegin8read(z);9total:=x*y10end;11write(total,sum)12end1begin2read(x,y);5ifx<=16then7elsebegin8read(z);10end;12end变量z的值在语句12的切片:第一个切片1begin1begin变量z的值在语句1第二个切片1begin2read(x,y);3total:=0.0;4sum:=0.0;5ifx<=16thensum:=y7elsebegin8read(z);9total:=x*y10end;11write(total,sum)12end1begin2read(x,y);3total:=0.0;5ifx<=16then7elsebegin9total:=x*y10end;12end变量total的值在语句12的切片:第二个切片1begin1begin变量total的值补充:程序分析技术1.程序插装2.故障插入3.程序变异补充:程序分析技术1.程序插装程序插装(ProgramInstrumentation)是一种基本的测试手段,在软件测试中有着广泛的应用。程序插装(ProgramInstrumentation)是1.程序插装定义:是借助向被测程序中插入操作来实现测试目的的方法。好处:能够按用户的要求,获取程序的各种信息,成为测试工作的有效手段。所带来的负面影响: 插装过的代码比原先的代码大且运行得慢。可能会掩盖时间、规模和位置,尤其对实时系统。1.程序插装定义:是借助向被测程序中插入操作来实现测试目的的程序插装的应用测试覆盖率度量;测试用例有效性度量;断言检测;数据流异常检测;路径智能分解。程序插装的应用测试覆盖率度量;1)用于测试覆盖率度量的程序插装具体实施步骤:在控制流中确定一个点集;在程序中的这些点上插入软件计数器;用一组测试用例测试这个程序;检查计数器的值以确定获得的覆盖率的范围。凡经历的计数语句都能记录下该程序点的实际执行次数1)用于测试覆盖率度量的程序插装具体实施步骤:入口C(1)=C(1)+1Q=XR=YC(2)=C(2)+1Q≠RC(4)=C(4)+1Q>RC(6)=C(6)+1C(5)=C(5)+1Q=Q-RR=R-QC(3)=C(3)+1出口TTFF插装后的求最大公约数程序流程图入口C(1)=C(1)+1Q=XR=YC(2)=C(2)+插装程序中插入的语句插装程序中插入的语句设计插装程序时需考虑的问题探测哪些信息;在程序的什么部位设置探测点;需要设置多少个探测点。 在一般情况,在没有分支的程序段中只需一个计数语句。为了在程序中设置最少的计数语句,需要针对程序的控制结构具体分析。设计插装程序时需考虑的问题探测哪些信息;至少在哪些部位设置计数语句的建议程序块的第一个可执行语句之前;有标号的可执行语句处;BLOCK-IF、ELSEIF、ELSE及ENDIF语句之后;DO、DOWHILE、DOUNTIL及DO终端语句之后;输入/输出语句之后;CALL语句之后;
至少在哪些部位设置计数语句的建议程序块的第一个可执行语句之前2)用于测试用例的有效性度量的程序插装测试用例的有效性是指该用例揭示程序错误的能力;程序的测试用例的单一指数:在一次特定测试执行期间,一个测试用例唯一地关注于遇到的一个多重表达式的次数。单一指数越高,测试用例的有效性越低。2)用于测试用例的有效性度量的程序插装测试用例的有效性是指该例一个语句包含a×(c+(d/e))一个表达式,则这个表达式存在3个需要关注的因子:a、(c+(d/e))、d。设计一个工具用来插装该表达式:
If(a==0)si++;If((c+(d/e))==0)si++;If(d==0)si++;其中si是变量,用于存储测试用例的单一指数例一个语句包含a×(c+(d/e))一个表达式,则这个表达式3)用于断言检测的程序插装在程序的特定部位插入某些用以判断变量特性的语句,使这些语句在程序执行中得以证实,从而使程序的运行特性得以证实;插入的这些语句称为断言(Assertions)。断言是程序插装的一个典型使用;但在实际中不是那么好用; 必须在程序的正确位置放入正确的断言;分析到底是程序错误引起的还是因为不正确的断言引起的违例。3)用于断言检测的程序插装在程序的特定部位插入某些用以判断变例unsignedintDev(intnum1,intnum2,int&ref){intvall,val2,k=0;val1=num1;val2=num2;_ASSERT(num1>=0);_ASSERT(num2>0);while((val1-val2)>0){val1=val1-val2;k++;_ASSERT((num2*k+val1)==num1);}ref=val1;_ASSERT(ref<num2);returnk;}例unsignedintDev(intnum1,int2.故障插入(FaultSeeding)是一个统计的方法,用于评价遗留在一个程序中的故障数量和种类。计算公式:原本错误总数=(插入的错误总数/发现的插入错误数)×发现的原本错误数残留错误数=原本错误总数-发现的原本错误数2.故障插入(FaultSeeding)是一个统计的方法,故障插入用于软件可靠性方面比较广泛(尤其在硬件的测试中);通过有意插入的故障来调用系统的故障容错能力,在一个可控制的环境和期望的时间段内获得完整的测试;与现有测试方法比较:现有的测试是从系统的正确状态开始,测试系统如何转入故障状态。故障注入测试从系统的故障状态开始,测试系统在发生故障后的运行规律;故障插入用于软件可靠性方面比较广泛(尤其在硬件的测试中);故障插入用于验证测试用例有效性原理: 为了检查设计的测试用例是否能发现某一类型的故障,人为地在被测系统中引入该类型的故障,如果在测试过程中能发现这个故障,则应该也可以测试出系统原来就存在的该类故障。故障插入用于验证测试用例有效性原理:经过若干年的测试理论研究和软件测试的实践,人们逐渐发现要想找出程序中所有的错误几乎是不可能的。比较现实的解决办法是将错误的搜索范围尽可能缩小,以利于专门测试某类错误是否存在。经过若干年的测试理论研究和软件测试的实践,人们逐渐发现要想找3.程序变异(MutationAnalysis)定义:使用故障插入来分析测试数据的属性。变异:带有插入错误的程序;产物:关于测试数据能够在多大程度上杀死变体的度量;变体通过使用一个变体操作产生。3.程序变异(MutationAnalysis)定义:使用程序P的变异因子m(P)也是一个程序,它是对P进行微小改动而得到的。如果程序P是正确的,m(P)是一个几乎正确的程序。如果P不正确,则P的某一个变异因子m(P)可能是正确的。假设P有一组测试数据,为D。我们现在关心的是P在D上无错误的情况。怎样确定程序的正确程度呢?程序P的变异因子m(P)也是一个程序,它是对P进行微小改动而程序变异思想若P在D上是正确的,可以找出P的变异因子的某一集合:m={M(P)|m(P)是P的变异因子}若m中每一元素在D上都存在错误,则可认为程序的正确程度较高。若m中某些元素在D上不存在错误,则可能存在3种情况:这些变异因子与P在功能上是等价的;现有的测试数据不足以找出P与其变异因子间的差别;P可能含有错误,而其某些变异因子却是正确的。程序变异思想若P在D上是正确的,可以找出P的变异因子的某一集仔细核对P及其m(P),避免的一种情况出现;P与某些m(P)都正确时,可能测试数据太少、不够典型造成。应该增加测试数据,直到所有m(P)都出错;第三种情况提醒我们,当许多典型的测试数据仍然不能使某一m(P)出错时,此m(P)可能是程序的正确形式。仔细核对P及其m(P),避免的一种情况出现;考虑下面的C程序main(){inti;floate,sum,term,x;scanf(“%f%f”x,e);printf(“x=%10.6fe=%10.6f\n”x,e);term=x;for(i=3;i<=100&&term>e;i=i+2){term=term*x*x/(i*(i-1));if(i%2==0)sum=sum+term;elsesum=sum-term;}printf(“sin(x)=%8.6f\n”sum);}考虑下面的C程序main()把x设成常量0,产生一个变体main(){inti;floate,sum,term,x;scanf(“%f%f”x,e);printf(“x=%10.6fe=%10.6f\n”x,e);term=0;for(i=3;i<=100&&term>e;i=i+2){term=term*x*x/(i*(i-1));if(i%2==0)sum=sum+term;elsesum=sum-term;}printf(“sin(x)=%8.6f\n”sum);}把x设成常量0,产生一个变体main()另一个变体main(){inti;floate,sum,term,x;scanf(“%f%f”x,e);printf(“x=%10.6fe=%10.6f\n”x,e);term=x;for(i=3;i>=100&&term>e;i=i+2){term=term*x*x/(i*(i-1));if(i%2==0)sum=sum+term;elsesum=sum-term;}printf(“sin(x)=%8.6f\n”sum);}另一个变体main()把0换成1,产生一个变体main(){inti;floate,sum,term,x;scanf(“%f%f”x,e);printf(“x=%10.6fe=%10.6f\n”x,e);term=x;for(i=3;i<=100&&term>e;i=i+2){term=term*x*x/(i*(i-1));if(i%2==1)sum=sum+term;elsesum=sum-term;}printf(“sin(x)=%8.6f\n”sum);}把0换成1,产生一个变体main()关键:要求测试数据集D和变异因子集m(P)都需精心挑选。怎样建立变异因子?可将其看作是变异操作符作用在被测程序上的结果。关键:要求测试数据集D和变异因子集m(P)都需精心挑选。变体操作的构造与程序设计语言密切相关;关于Fortran程序的变体操作:常量替换A=0→A=1标量替换A=B-1→A=D-1标量替换常量/常量替换标量用数组引用替换常量A=2→A=B(2)求负操作替换A=X→A=-X数学操作符替换A=B+C→A=B-C语句删除GOTO语句替换GOTO20→GOTO30…变体操作的构造与程序设计语言密切相关; 通过变异分析构造测试数据的过程是一个循环过程。测试人员提供被测程序以及初始数据、变异运算符。当P和m(P)被初始测试数据测试后,可能会有变异因子未被发现错误。可以增加测试数据。若所有的m(P)均出错,也可以增加新的m(P)。然后进行下一轮变异测试。 通过变异分析构造测试数据的过程是一个循环过程。 Budd等人统计了他们设计的程序变异系统在辅助测试人员进行测试的效果。被测程序13个,共包含30个错误。统计结果如下图: Budd等人统计了他们设计的程序变异系统在辅助测试人员进行程序变异由于其针对性强、系统性强,正成为软件测试中一种相当活跃的办法。特别是在变异测试系统支持下,用户可以更有效地测试自己的程序。程序变异由于其针对性强、系统性强,正成为软件测试中一种相当活习题1、使用基本路径测试方法,为以下程序段设计测试用例。voidDo(intX,intA,intB){1if((A>1)&&(B=0))2X=X/A;3if((A=2)||(X>1))4X=X+1;5}习题1、使用基本路径测试方法,为以下程序段设计测试用例。2、某程序所画出的N-S图如右图所示的,至少需要多少个测试用例才能对该程序实现逻辑覆盖?习题2、某程序所画出的N-S图如右图所示的,至少需要多少个测试用3、判断正误并说明理由(可以举例):在没有产品说明书和需求文档的条件下可以进行动态黑盒测试;静态白盒测试可以找出软件的遗漏之处和问题;白盒测试的条件覆盖标准强于判定覆盖。4、试分析动态白盒子测试(dynamicwhite-boxtesting)和调试(debugging)有何异同。习题3、判断正误并说明理由(可以举例):习题第3章白盒测试及其用例的设计3.1白盒测试方法3.2控制流图3.3白盒测试覆盖指标3.4数据流测试3.5白盒测试方法总结第3章白盒测试及其用例的设计3.1白盒测试方法本章教学目标理论环节学习理解白盒测试方法的基本概念学习理解白盒测试的覆盖理论学习掌握白盒测试的路径表达学习掌握白盒测试的基本路径测试法学习掌握白盒测试的数据流测试法实践环节通过案例运用学习掌握覆盖问题的解决方法运用基本路径测试方法进行实际程序测试本章教学目标理论环节3.1白盒测试方法为什么要进行白盒测试?如果所有软件错误的根源都可以追溯到某个唯一原因,那么问题就简单了。然而,事实上一个bug常常是由多个因素共同导致的,如下图所示。假设此时开发工作已结束,程序送交到测试组,没有人知道代码中有一个潜在的被0除的错误。若测试组采用的测试用例的执行路径没有同时经过x=0和y=5/x进行测试,显然测试工作似乎非常完善,测试用例覆盖了所有执行语句,也没有被0除的错误发生。3.1白盒测试方法为什么要进行白盒测试?假白盒测试方法(续)白盒测试也称结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例。白盒测试法检查程序内部逻辑结构,对所有逻辑路径进行测试,是一种穷举路径的测试方法。但即使每条路径都测试过了,仍然可能存在错误。因为:穷举路径测试无法检查出程序本身是否违反了设计规范,即程序是否是一个错误的程序。穷举路径测试不可能查出程序因为遗漏路径而出错。穷举路径测试发现不了一些与数据相关的错误。白盒测试方法(续)白盒测试也称结构测试或逻辑驱动测试,是针对白盒测试方法(续)采用白盒测试方法必须遵循以下几条原则,才能达到测试的目的:保证一个模块中的所有独立路径至少被测试一次。所有逻辑值均需测试真(true)和假(false)两种情况。检查程序的内部数据结构,保证其结构的有效性。在上下边界及可操作范围内运行所有循环。白盒测试方法(续)采用白盒测试方法必须遵循以下几条原则,才能白盒测试常用的测试用例设计方法逻辑覆盖以程序内部的逻辑结构为基础;根据覆盖测试的目标,逻辑覆盖分为:语句、判定、条件、判定/条件、组合、路径基本路径测试为了解决路径庞大难题;在程序控制流程图的基础上,分析控制构造的环路复杂性,导出基本可执行路径集合,设计测试用例的方法。白盒测试常用的测试用例设计方法逻辑覆盖3.3控制流图控制流图(可简称流图)是对程序流程图进行简化后得到的,它可以更加突出的表示程序控制流的结构,唯一的。控制流图中包括两种图形符号:节点和控制流线。节点由带标号的圆圈表示,可代表一个或多个语句、一个处理框序列和一个条件判定框(假设不包含复合条件)。控制流线由带箭头的弧或线表示,可称为边。它代表程序中的控制流。对于复合条件,则可将其分解为多个单个条件,并映射成控制流图。常见结构的控制流图3.3控制流图控制流图(可简称流图)是对程序流程图进行简化常见结构的控制流图其中,包含条件的节点被称为判定节点(也叫谓词节点),由判定节点发出的边必须终止于某一个节点,由边和节点所限定的范围被称为区域。常见结构的控制流图其中,包含条件的节点被称为判定节点(也叫谓软件测试-3白盒测试及其用例的设计课件软件测试-3白盒测试及其用例的设计课件转化程序流程图为控制流图
A>1and
B=0
X=X/A
1
2
3
A>1
B=0
X=X/A
2
3
1
4
YYY转化程序流程图为控制流图A>1andB=0X=X/3.3覆盖测试3.4.1测试覆盖率3.4.2逻辑覆盖法3.4.3功能覆盖3.4.4其他覆盖3.4.5如何使用覆盖率3.4.6测试覆盖准则3.3覆盖测试3.4.1测试覆盖率结构测试中的一个重要问题是,测试进行到什么地步就达到要求,可以结束测试。这需要给出结构测试的覆盖准则。结构测试中的一个重要问题是,测试进行到什么地步就达到要求,可3.3.1测试覆盖率测试覆盖率:用于确定测试所执行到的覆盖项的百分比。其中的覆盖项是指作为测试基础的一个入口或属性,比如语句、分支、条件等。通过覆盖率数据可以知道测试得是否充分,测试的弱点在哪些方面,从而指导我们设计能够增加覆盖率的测试用例。能够有效地提高测试质量,避免设计无效用例。在测试分析报告中可以作为量化指标的依据,测试覆盖率越高效果越好。但覆盖率不是目标,只是一种手段。3.3.1测试覆盖率测试覆盖率:用于确定测试所执行到的覆覆盖率概念覆盖率是用来度量测试完整性的一个手段。本身并不包含测试技术,只是测试技术有效性的一个度量。
覆盖率种类:逻辑覆盖(LogicalCoverage),也叫:代码覆盖率(CodeCoverage)结构化覆盖率(StructuralCoverage)功能覆盖(FunctionCoverage)。
覆盖率概念覆盖率是用来度量测试完整性的一个手段。本身3.3.2逻辑覆盖法根据覆盖目标的不同,逻辑覆盖可分为语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。语句覆盖:选择若干个测试用例,运行被测程序,使得程序中的每个可执行语句至少执行一次。覆盖指标C0判定覆盖(分支覆盖):选择若干个测试用例,运行被测程序,使得程序中的每个判断真假值均曾被满足,也就是使程序中的每个取“真”分支和取“假”分支至少均经历一次。覆盖指标C1条件覆盖:选择若干个测试用例,运行被测程序,使得程序中每个判定包含的每个条件的可能取值(真/假)都至少满足一次。3.3.2逻辑覆盖法根据覆盖目标的不同,逻辑覆盖可分为语逻辑覆盖法(续)判定-条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的所有情况(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。——满足判定-条件覆盖的测试用例一定同时满足判定覆盖和条件覆盖。组合覆盖:通过执行足够的测试用例,使得程序中每个判定的所有可能的条件取值组合都至少出现一次。覆盖指标CMCC
——满足组合覆盖的测试用例一定满足判定覆盖、条件覆盖和判定-条件覆盖。路径覆盖:设计足够多的测试用例,要求覆盖程序中所有可能的路径。覆盖指标C∞逻辑覆盖法(续)判定-条件覆盖:设计足够多的测试用例,使得程逻辑覆盖法(续)组合覆盖判定-条件覆盖判定覆盖条件覆盖语句覆盖逻辑覆盖法(续)组合覆盖判定-条件覆盖判定覆盖条件覆盖语句覆逻辑覆盖法(续)voidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;j=sqrt(k);}//语句块1if((x==4)||(y>5)){j=x*y+10;}//语句块2
j=j%3;//语句块3}逻辑覆盖法(续)voidDoWork(intx,in逻辑覆盖法(续)X>3&&z<10执行语句块1执行语句块2X==4||y>5执行语句块3FFTTabdce逻辑覆盖法(续)X>3&&z<10执行语句块1执行语句块语句覆盖要实现DoWork函数的语句覆盖,只需设计一个测试用例就可以覆盖程序中的所有可执行语句。测试用例输入为:{x=4、y=5、z=5}程序执行的路径是:abd分析:语句覆盖可以保证程序中的每个语句都得到执行,但发现不了判定中逻辑运算的错误,即它并不是一种充分的检验方法。例如在第一个判定((x>3)&&(z<10))中把“&&”错误的写成了“||”,这时仍使用该测试用例,则程序仍会按照流程图上的路径abd执行。可以说语句覆盖是最弱的逻辑覆盖准则。语句覆盖要实现DoWork函数的语句覆盖,只需设计一个测试用判定覆盖注:教材中又称为DD-路径覆盖,测试满足DD-路径覆盖要求可以发现全部缺陷的85%要实现DoWork函数的判定覆盖,需要设计两个测试用例。测试用例的输入为:{x=4、y=5、z=5};{x=2、y=5、z=5}程序执行的路径分别是:abd;ace分析:上述两个测试用例不仅满足了判定覆盖,同时还做到语句覆盖。从这点看似乎判定覆盖比语句覆盖更强一些,但仍然无法确定判定内部条件的错误。例如把第二个判定中的条件y>5错误写为y<5,使用上述测试用例,照样能按原路径执行而不影响结果。因此,需要有更强的逻辑覆盖准则去检验判定内的条件。判定覆盖注:教材中又称为DD-路径覆盖,测试满足DD-路径覆判定覆盖(续)13524说明:以上仅考虑了两出口的判断,我们还应把判定覆盖准则扩充到多出口判断(如Case语句)的情况。因此,判定覆盖更为广泛的含义应该是使得每一个判定获得每一种可能的结果至少一次。6789105’判定覆盖(续)13524说明:以上仅考虑了两出口的判断,我们条件覆盖在实际程序代码中,一个判定中通常都包含若干条件。条件覆盖的目的是设计若干测试用例,在执行被测程序后,要使每个判定中每个条件的可能值至少满足一次。对DoWork函数的各个判定的各种条件取值加以标记。对于第一个判定((x>3)&&(z<10)): 条件x>3取真值记为T1,取假值记为-T1
条件z<10取真值记为T2,取假值记为-T2对于第二个判定((x==4)||(y>5)):条件x==4取真值记为T3,取假值记为-T3条件y>5取真值记为T4,取假值记为-T4条件覆盖在实际程序代码中,一个判定中通常都包含若干条件。条条件覆盖(续)根据条件覆盖的基本思想,要使上述4个条件可能产生的8种情况至少满足一次,设计测试用例如下:分析:上面这组测试用例不但覆盖了4个条件的全部8种情况,而且将两个判定的4个分支b、c、d、e也同时覆盖了,即同时达到了条件覆盖和判定覆盖。条件覆盖(续)根据条件覆盖的基本思想,要使上述4个条件可能产条件覆盖(续)说明:虽然前面的一组测试用例同时达到了条件覆盖和判定覆盖,但是,并不是说满足条件覆盖就一定能满足判定覆盖。如果设计了下表中的这组测试用例,则虽然满足了条件覆盖,但只是覆盖了程序中第一个判定的取假分支c和第二个判定的取真分支d,不满足判定覆盖的要求。条件覆盖(续)说明:虽然前面的一组测试用例同时达到了条件覆盖判定-条件覆盖判定-条件覆盖实际上是将判定覆盖和条件覆盖结合起来的一种方法,即:设计足够的测试用例,使得判定中每个条件的所有可能取值至少满足一次,同时每个判定的可能结果也至少出现一次。根据判定-条件覆盖的基本思想,只需设计以下两个测试用例便可以覆盖4个条件的8种取值以及4个判定分支。判定-条件覆盖判定-条件覆盖实际上是将判定覆盖和条件覆盖结合判定-条件覆盖(续)分析:从表面上看,判定-条件覆盖测试了各个判定中的所有条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某些条件将会被其它条件所掩盖。因此,判定-条件覆盖也不一定能够完全检查出逻辑表达式中的错误。例如:对于第一个判定(x>3)&&(z<10)来说,必须x>3和z<10这两个条件同时满足才能确定该判定为真。如果x>3为假,则编译器将不再检查z<10这个条件,那么即使这个条件有错也无法被发现。对于第二个判定(x==4)||(y>5)来说,若条件x==4满足,就认为该判定为真,这时将不会再检查y>5,那么同样也无法发现这个条件中的错误。判定-条件覆盖(续)分析:从表面上看,判定-条件覆盖测试了各组合覆盖组合覆盖的目的是要使设计的测试用例能覆盖每一个判定的所有可能的条件取值组合。对DoWork函数中的各个判定的条件取值组合加以标记:1、x>3,z<10记做T1T2,第一个判定的取真分支2、x>3,z>=10记做T1-T2,第一个判定的取假分支3、x<=3,z<10记做-T1T2,第一个判定的取假分支4、x<=3,z>=10记做-T1-T2,第一个判定的取假分支5、x==4,y>5记做T3T4,第二个判定的取真分支6、x==4,y<=5记做T3-T4,第二个判定的取真分支7、x!=4,y>5记做-T3T4,第二个判定的取真分支8、x!=4,y<=5记做-T3-T4,第二个判定的取假分支组合覆盖组合覆盖的目的是要使设计的测试用例能覆盖每一个判定的组合覆盖(续)根据组合覆盖的基本思想,设计测试用例如下:分析:上面这组测试用例覆盖了所有8种条件取值的组合,覆盖了所有判定的真假分支,但是却丢失了一条路径abe。组合覆盖(续)根据组合覆盖的基本思想,设计测试用例如下:分析路径覆盖前面提到的5种逻辑覆盖都未涉及到路径的覆盖。事实上,只有当程序中的每一条路径都受到了检验,才能使程序受到全面检验。路径覆盖的目的就是要使设计的测试用例能覆盖被测程序中所有可能的路径。根据路径覆盖的基本思想,在满足组合覆盖的测试用例中修改其中一个测试用例,则可以实现路径覆盖:路径覆盖前面提到的5种逻辑覆盖都未涉及到路径的覆盖。事实上,路径覆盖(续)分析:虽然前面一组测试用例满足了路径覆盖,但并没有覆盖程序中所有的条件组合(丢失了组合3和7),即满足路径覆盖的测试用例并不一定满足组合覆盖。说明:对于比较简单的小程序,实现路径覆盖是可能做到的。但如果程序中出现较多判断和较多循环,可能的路径数目将会急剧增长,要在测试中覆盖所有的路径是无法实现的。为了解决这个难题,只有把覆盖路径数量压缩到一定的限度内,如程序中的循环体只执行一次。在实际测试中,即使对于路径数很有限的程序已经做到路径覆盖,仍然不能保证被测试程序的正确性。路径覆盖(续)分析:虽然前面一组测试用例满足了路径覆盖,但并逻辑覆盖小结各种结构测试方法都不能保证程序的正确性。测试的目的并非要证明程序的正确性,而是要尽可能找出程序中的错误。逻辑覆盖率可以作为测试完整性的一个度量。即使达到100%的逻辑覆盖率,仍然无法保证程序的正确性;确实并不存在一种十全十美的测试方法,能够发现所有的错误。逻辑覆盖小结各种结构测试方法都不能保证程序的正确性。3.4.3功能覆盖 功能覆盖属于黑盒测试范畴。常见的是需求覆盖和接口覆盖。
需求覆盖:通过设计一定的测试用例,要求每个需求点都被测试到。
接口覆盖:也叫入口点覆盖,接口覆盖要求通过设计一定的用例使系统的每个接口都被测试到。
3.4.3功能覆盖 功能覆盖属于黑盒测试范畴。常见的是需求3.4.4其他覆盖率函数覆盖定义:在测试中有哪些函数被测试到了,其被测试到的频率有多大,这些函数在系统所有函数中占的比例有多大。是针对系统或一个子系统而测试的;比较容易自动化(TrueCoveragePureCoverage);易于理解。指令块覆盖是语句覆盖的一个变体。3.4.4其他覆盖率函数覆盖3.4.5如何使用覆盖率 在选择和使用覆盖率时,必须遵循的基本原则:覆盖率不是目的,只是一种手段;不可能针对所有的覆盖率指标去进行测试;只考虑一种覆盖率指标也是不恰当的;不要追求绝对100%的覆盖率。3.4.5如何使用覆盖率 在选择和使用覆盖率时,必须遵循评价标准覆盖率度量覆盖率评价表评价标准覆盖覆盖率评价表课堂练习为以下流程图所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、组合覆盖和路径覆盖。(A>1)and(B=0)(A=2)or(X>1)X=X/AX=X+1TTFFbdcea课堂练习为以下流程图所示的程序段设计一组测试用例,要求分别满A=2,B=0,X=4(沿路径ace执行);语句覆盖测试用例A=2,B=0,X=4(沿路径ace执行);语句覆盖测试用A=3,B=0,X=3(acd);A=2,B=1,X=1(abe);aa判定覆盖测试用例A=3,B=0,X=3(acd);A=2,B=1,X=1A=2,B=1,X=1(abe);A=1,B=0,X=3(abe);条件覆盖测试用例A=2,B=1,X=1(abe);A=1,B=0,X=3判定-条件覆盖测试用例判定-条件覆盖测试用例判定条件的8种组合:A>1,B=0记为T1,T2;A>1,B<>0记为T1,F2;A<=1,B=0记为F1,T2;A<=1,B<>0记为F1,F2;A=2,X>1记为T3,T4;A=2,X<=1记为T3,F4;A<>2,X>1记为F3,T4;A<>2,X<=1记为F3,F4;判定条件的8种组合:组合覆盖测试用例组合覆盖测试用例A=2,B=0,X=4(ace)A=2,B=1,X=1(abe)组合覆盖测试用例A=2,B=0,X=4(ace)A=2,B=1,X=1(abA=1,B=1,X=1(abd)A=1,B=0,X=3(abe)组合覆盖测试用例A=1,B=1,X=1(abd)A=1,B=0,X=3(ab路径覆盖测试用例路径覆盖测试用例3.7数据流测试数据流分析最初是随着编译系统要生成有效的目标码而出现的,这类方法主要用于代码优化。近年来在测试中也得到成功运用,查找引用未定义变量等程序错误,查找对以前未曾使用的变量再次赋值等数据流异常的情况。这常常是常见程序错误的表现形式,如:错拼名字、名字混淆或丢失了语句。3.7数据流测试数据流分析最初是随着编译系统要生成有效的目数据流测试关注变量定义赋值点(语句)和引用或使用这些值的点(语句)的结构性测试。用作路径测试的真实性检查。程序和程序的元素通过它们的数据访问行为关联起来,确定了数据流关系。数据流测试形式:定义/使用测试基于程序片的测试定义/使用路径和片的定义能够非常准确地描述要测试的程序部分数据流测试关注变量定义赋值点(语句)和引用或使用这些值的点(常见的数据流异常包括:变量被定义,但是从来没有使用;所使用的变量没有被定义;变量在使用之前被定义两次;等待一个还没有被安排的进程;安排一个与其自身相同的进程;等待一个先前已经被中止了的进程;引用一个在并行进程中被定义的变量;引用一个值不确定的变量。这些
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 运动装备定制销售合同
- 2023-2024学年高中信息技术选修2(浙教版2019)-网络基础-教学设计-2.1-网络拓扑结构
- 13-2《上图书馆》 教学设计 2024-2025学年统编版高中语文必修上册
- Lesson 1 Nice to meet you. Period 1(教学设计)-2024-2025学年接力版英语四年级上册
- 11 四通八达的交通(教学设计)-2023-2024学年道德与法治三年级下册统编版
- 2 点亮小灯泡 教学设计-2023-2024学年科学四年级下册教科版
- 2025年激光隧道断面测量系统项目发展计划
- 餐车订购合同范本
- 婚礼公司合同范本
- 17要是你在野外迷了路 教学设计-2023-2024学年语文二年级下册统编版
- 2025四川宜宾市高县县属国企业第一次招聘3人易考易错模拟试题(共500题)试卷后附参考答案
- 2024年沈阳职业技术学院高职单招语文历年参考题库含答案解析
- 《榜样9》观后感心得体会一
- 2024年上海普陀区司法局招聘人民调解员考试真题
- 驾照考试题库及答案(完整版)
- 2024年3、6、9月青少年软件编程Python等级考试一级真题(全3套 含答案)
- 大族激光打标机培训
- 2025中国铁塔公司社会招聘85人高频重点提升(共500题)附带答案详解
- 专题06 现代文阅读(解析版)2015-2024单招考试语文(四川真题)
- 创伤中心临床路径管理制度
- 《教育研究方法》课程教学大纲
评论
0/150
提交评论