白盒测试及测试案例设计(已经看)
白盒测试案例
软件测试用例测试测试用例由测试输入数据以及与之对应的输出结果组成.测试用例设计的好坏直接决定了测试的效果和结果.以说在软件测试活动中最关键的步骤就是设计有效的测试用例.测试用例可以针对黑盒测试设计用例,也可以针对白盒测试设计用例,我们今天只讲针对白盒测试的用例设语句覆:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次;判定覆盖(也称为分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次;条件覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次;判定-条件覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的所有可能取值至少执行一次,并且每个可能的判断结果也至少执行一次,换句话说,即是要求各个判断的所有可能的条件取值组合至少执行一次;条件组合测试:设计足够多的测试用例,运行所测程序,使程序中每个判断的所有可能的条件取值组合至少执行一次;路径测试:设计足够多的测试用例,运行所测程序,要覆盖程序中所有可能的路径.下面以例子进行分析讲解:void DoWork(int x,int y,int z){int k=0,j=0;if((x>3)&&(z5)){j=x*y+10; //语句块2}j=j%3; //语句块3}画出上面函数的流程图如下:语句覆盖:为了说明简略,分别对各个判断的取真,取假分支编号为b,c,d,e.为了测试语句覆盖率只要设计一个测试用例就可以把三个执行语句块中的语句覆盖了.测试用例输入为:{ x=4,y=5,z=5}程序执行的路径是:abd该测试用例虽然覆盖了可执行语句,但并不能检查判断逻辑是否有问题,例如在第一个判断中把&&错误的写成了||,则上面的测试用例仍可以覆盖所有的执行语句.可以说语句覆盖率是最弱的逻辑覆盖准则.分支覆盖对于上面的程序,如果设计两个测试用例则可以满足条件覆盖的要求.测试用例的输入为:{ x=4,y=5,z=5}{ x=2,y=5,z=5}上面的两个测试用例虽然能够满足条件覆盖的要求,但是也不能对判断条件进行检查,例如把第二个条件y>5错误的写成y3 取真值为T1,取假值为-T1条件z5 取真值为T4,取假值为-T4则可以设计测试用例如下cdT1,-T2,T3,-T4acdx=4,y=5,z=15ce-T1,T2,-T3,-T4acex=2,y=5,z=5bdT1,T2,T3,T4abdx=4,y=6,z=5覆盖分支条件取值通过路径测试用例上面的测试用例不但覆盖了所有分支的真假两个分支,而且覆盖了判断中的所有条件的可能值.但是如果设计了下面的测试用例,则虽然满足了条件覆盖,但只覆盖了第一个条件的取假分支和第二个条件的取真分支,不满足分支覆盖的要求.cdT1,-T2,T3,-T4acdx=4,y=5,z=5cd-T1,T2,-T3,T4acdx=2,y=6,z=5覆盖分支条件取值通过路径测试用例分支条件覆盖:分支条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果至少执行,即要求各个判断的所有可能的条件取值组合至少执行一次.根据定义只需设计以下两个测试用例便可以覆盖8个条件值以及4个判断分支.ce-T1,-T2,-T3,-T4acex=2,y=5,z=11bdT1,T2,T3,T4abdx=4,y=6,z=5覆盖分支条件取值通过路径测试用例分支条件覆盖从表面来看,它测试了所有条件的取值,但是实际上某些条件掩盖了另一些条件.例如对于条件表达式(x>3)&&(z3)为假则一般的编译器不在判断是否z5)来说,若x==4测试结果为真,就认为表达式的结果为真,这时不再检查(y>5)条件了.因此,采用分支条件覆盖,逻辑表达式中的错误不一定能够查出来了. 条件组合覆盖:条件组合覆盖就是设计足够的测试用例,运行被测试对象,使得每一个判断的所有可能的条件取值组合至少执行一次.现在对例子中的各个判断的条件取值组合加以标记如下:x>3,z3,z>=10 记做T1 -T2, 第一个判断的取假分支x<=3,z<0 记做-T1 T2, 第一个判断的取假分支x=10 记做-T1 -T2,第一个判断的取假分支x=4,y>5 记做T3 T4, 第二个判断的取真分支x=4,y5 记做-T3 T4, 第二个判断的取真分支x!=4,y 0)5 {6 if(0= =iType)7 x=y+2;8 else9 if(1= =iType)10 x=y+10;11 else12 x=y+20;13 }14 }第一步:画出控制流图c/c++语句中的控制语句表示含义如下:图中的每一个圆称为流图的结点,代表一条或多条语句.流图中的箭头称为边或连接,代表控制流.为了说明流图的用法,我们采用过程设计表示法,此处,流程图用来描述程序控制结构.可将流程图映射到一个相应的流图(假设流程图的菱形决定框中不包含复合条件).在流图中,每一个圆,称为流图的结点,代表一个或多个语句.一个处理方框序列和一个菱形决测框可被映射为一个结点,流图中的箭头,称为边或连接,代表控制流,类似于流程图中的箭头.一条边必须终止于一个结点,即使该结点并不代表任何语句(例如:参见if-else-then结构的符号).由边和结点限定的范围称为区域.计算区域时应包括图外部的范围.任何过程设计都要被翻译成控制流图.画出其程序流程图和对应的控制流图如下:程序设计中遇到复合条件时,生成的流图变得更为复杂.当条件语句中用到一个或多个布尔运算符(逻辑OR,AND,NAND,NOR)时,就出现了复合条件.下图为语句IF a OR b中的每一个a和b创建了一个独立的结点,包含条件的结点被称为判定结点,从每一个判定结点发出两条或多条边.例如:1 if a or b2 x3 else4 y对应的逻辑为:第二步:计算圈复杂度圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界.独立路径必须包含一条在定义之前不曾用到的边.有以下三种方法计算圈复杂度:流图中区域的数量对应于环型的复杂性;给定流图G的圈复杂度-V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量;给定流图G的圈复杂度-V(G),定义为V(G)=P+1,P是流图G中判定结点的数量.对应上面图中的圈复杂度,计算如下:流图中有四个区域;V(G)=11条边-9结点+2=4;V(G)=3个判定结点+1=4.第三步:导出测试用例根据上面的计算方法,可得出四个独立的路径:路径1:4-14路径2:4-6-7-14路径3:4-6-8-10-13-4-14路径4:4-6-8-11-13-4-14根据上面的独立路径,去设计输入数据,使程序分别执行到上面四条路径.第四步:准备测试用例为了确保基本路径集中的每一条路径的执行,根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到,满足上面例子基本路径集的测试用例是:路径1:4-14输入数据:iRecordNum=0,或者取iRecordNum<0的某一个值预期结果:x=0路径2:4-6-7-14输入数据:iRecordNum=1,iType=0预期结果:x=2路径3:4-6-8-10-13-4-14输入数据:iRecordNum=1,iType=1预期结果:x=10路径4:4-6-8-11-13-4-14输入数据:iRecordNum=1,iType=2预期结果:x=20工具方法:图形矩阵导出控制流图和决定基本测试路径的过程均需要机械化,为了开发辅助基本路径测试的软件工具,称为图形矩阵(graph matrix)的数据结构很有用.利用图形矩阵可以实现自动地确定一个基本路径集.一个图形矩阵是一个方阵,其行/列数控制流图中的结点数,每行和每列依次对应到一个被标识的结点,矩阵元素对应到结点间的连接(即边).在图中,控制流图的每一个结点都用数字加以标识,每一条边都用字母加以标识.如果在控制流图中第i个结点到第j个结点有一个名为x的边相连接,则在对应的图形矩阵中第i行/第j列有一个非空的元素x.对每个矩阵项加入连接权值(link weight),图矩阵就可以用于在测试中评估程序的控制结构,连接权值为控制流提供了另外的信息.最简单情况下,连接权值是1(存在连接)或0(不存在连接),但是,连接权值可以赋予更有趣的属性:执行连接(边)的概率.穿越连接的处理时间.穿越连接时所需的内存.穿越连接时所需的资源.根据上面的方法对例子画出图形矩阵如下:连接权为"1"表示存在一个连接,在图中如果一行有两个或更多的元素"1",则这行所代表的结点一定是一个判定结点,通过连接矩阵中有两个以上(包括两个)元素为"1"的个数,就可以得到确定该图圈复杂度的另一种算法.小结:从上面的概念和例子可以看出要进行上面的白盒测试是需要投入巨大的测试资源,包括人力,物力和时间等.但是为什么还要进行白盒测试呢原因如下:逻辑错误和不正确假设与一条程序路径被运行的可能性成反比.当我们设计和实现主流之外的功能,条件或控制时,错误往往开始出现在我们的工作中.日常处理往往被很好地了解(和很好地细查),而"特殊情况"的处理则难于发现.我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的基础上被执行.程序的逻辑流有时是违反直觉的,这意味着我们关于控制流和数据流的一些无意识的假设可能导致设计错误,只有路径测试才能发现这些错误.印刷上的错误是随机的.当一个程序被翻译为程序设计语言源代码时,有可能产生某些打印错误,很多将被语法检查机制发现,但是,其他的会在测试开始时才会被发现.打印错误出现在主流上和不明显的逻辑路径上的可能性是一样的.上述任何一条原因都是该进行白盒测试的论据,黑盒测试,不管它多么全面,都可能忽略前面提到的某些类型的错误.正如Beizer所说:"错误潜伏在角落里,聚集在边界上".白盒测试更可能发现它们.前面所述的基本路径测试技术是控制结构测试技术之一.尽管基本路径测试简单高效,但是,其本身并不充分.下面讨论控制结构测试的其他变种,这些测试覆盖并提高了白盒测试的质量.包括:条件测试数据流测试循环测试.1,条件测试条件测试是检查程序模块中所包含逻辑条件的测试用例设计方法.一个简单条件是一个布尔变量或一个可能带有NOT("!")操作符的关系表达式.关系表达式的形式如:E1E2其中E1和E2是算术表达式,而是下列之一:"",或"≥".复杂条件由简单条件,布尔操作符和括弧组成.我们假定可用于复杂条件的布尔算子包括OR"|",AND"&"和NOT"!",不含关系表达式的条件称为布尔表达式.所以条件的成分类型包括布尔操作符,布尔变量,布尔括弧(括住简单或复杂条件),关系操作符或算术表达式. 如果条件不正确,则至少有一个条件成分不正确,这样,条件的错误类型如下:布尔操作符错误(遗漏布尔操作符,布尔操作符多余或布尔操作符不正确);布尔变量错误;布尔括弧错误;关系操作符错误;算术表达式错误.条件测试方法注重于测试程序中的条件.条件测试策略主要有两个优点:首先,测度条件测试的覆盖率是简单的;其次,程序的条件测试覆盖率为产生另外的程序测试提供了指导.条件测试的目的条件测试是测试程序条件错误和程序的其他错误.如果程序的测试集能够有效地检测程序中的条件错误,则该测试集可能也会有效地检测程序中的其他错误.此外,如果测试策略对检测条件错误有效,则它也可能有效地检测程序错误.条件测试策略分支测试可能是最简单的条件测试策略,对于复合条件C,C的真分支和假分支以及C中的每个简单条件都需要至少执行一次.域测试(Domain testing)要求从有理表达式中导出三个或四个测试,有理表达式的形式如:E1E2需要三个测试分别用于计算E1的值是大于,等于或小于E2的值.如果错误,而E1和E2正确,则这三个测试能够发现关系算子的错误.为了发现E1和E2的错误,计算E1小于或大于E2的测试应使两个值间的差别尽可能小.有n个变量的布尔表达式需要2n个可能的测试(n>0).这种策略可以发现布尔操作符,变量和括弧的错误,但是只有在n很小时实用.也可以派生出敏感布尔表达式错误的测试.对于有n个布尔变量(n>0)的单布尔表达式(每个布尔变量只出现一次),可以很容易地产生测试数小于2n的测试集,该测试集能够发现多个布尔操作符错误和其他错误. 建议在上述技术之上建立条件测试策略,称为BRO(branch and relational)测试集.测试保证能发现布尔变量和关系操作符只出现一次而且没有公共变量的条件中的分支和条件操作符错误.BRO策略利用条件C的条件约束.有n个简单条件的条件C的条件约束定义为(D1,D2,…,Dn),其中Di(0<I≤N)表示条件C中第I个简单条件的输出约束.如果C的执行过程中C的每个简单条件的输出都满足D中对应的约束,则称条件C的条件约束D由C的执行所覆盖.对于布尔变量B,B输出的约束说明B必须是真(T)或假(F).类似地,对于关系表达式,符号用于指定表达式输出的约束.作为简单的例子,考虑条件C1:B1&B2其中B1和B2是布尔变量.C1的条件约束式如(D1,D2),其中D1和D2是"T"或"F",值(T,F)是C1的条件约束,由使B1为真,B2为假的测试所覆盖.BRO测试策略要求约束集{(T,T),(F,T),(T,F)}由C1的执行所覆盖,如果C1由于布尔算子的错误而不正确,至少有一个约束强制C1失败.作为第二个例子,考虑C2:B1&(E3=E4)其中B1是布尔表达式,而E3和E4是算术表达式.C2的条件约束形式如(D1,D2),其中D1是"T"或"F",D2是.除了C2的第二个简单条件是关系表达式以外,C2和C1相同,所以可以修改C1的约束集{(T,T),(F,T),(T,F)},得到C2的约束集,注意(E3=E4)的"T"意味着"=",而(E3=E4)的"F"意味着">"或"<".分别用(T,=)和(F,=)替换(T,T)和(F,T),并用(T,<\)和(T,>)替换(T,F),就得到C2的约束集{(T,=),(F,=),(T,)}.上述条件约束集的覆盖率将保证检测C2的布尔和关系算子的错误.作为第三个例子,考虑C3:(E1>E2)&(E3=E4)其中E1,E2,E3和E4是算术表达式.C3的条件约束形式如(D1,D2),其中D1和D2是.除了C3的第一个简单条件是关系表达式以外,C3和C2相同,所以可以修改C2的约束集得到C3的约束集,结果为{(>,=),(=,=),(,>),(>,<)}上述条件约束集能够保证检测C3的关系操作符的错误.2, 数据流测试数据流测试方法按照程序中的变量定义和使用的位置来选择程序的测试路径.为了说明数据流测试方法,假设程序的每条语句都赋予了独特的语句号,而且每个函数都不改变其参数和全局变量.对于语句号为S的语句,DEF(S)={X|语句S包含X的定义}USE(S)={X|语句S包含X的使用}如果语句S是if或循环语句,它的DEF集为空,而USE集取决于S的条件.如果存在从S到S′的路径,并且该路径不含X的其他定义,则称变量X在语句S处的定义在语句S′仍有效.变量X的定义―使用链(或称DU链)形式如[X,S,S′],其中S和S′是语句号,X在DEF(S)和USE(S′)中,而且语句S定义的X在语句S′有效.一种简单的数据流测试策略是要求覆盖每个DU链至少一次.我们将这种策略称为DU测试策略.已经证明DU测试并不能保证覆盖程序的所有分支,但是,DU测试不覆盖某个分支仅仅在于如下之类的情况:if-then-else中的then没有定义变量,而且不存在else部分.这种情况下,if语句的else分支并不需要由DU测试覆盖.数据流测试策略可用于为包含嵌套if和循环语句的程序选择测试路径,为此,考虑使用DU测试为如下的PDL选择测试路径:proc xB1;do while C1if C2thenif C4thenB4;elseB5;endif;elseif C3thenB2;elseB3;endif;endif;enddo;B6;end proc;为了用DU测试选择控制流图的测试路径,需要知道PDL条件或块中的变量定义和使用.假设变量X定义在块B1,B2,B3,B4和B5的最后一条语句之中,并在块B2,B3,B4,B5和B6的第一条语句中使用.DU测试策略要求执行从每个B(0<I≤5)到BJ(0<J≤6)的最短路径(这样的测试也覆盖了条件C1,C2,C3和C4中的变量使用).尽管有25条X的DU链,只需5条路径覆盖这些DU链.原因在于可用5条从BI(0<I≤5)到B6的路径覆盖X的链,而这5条链包含循环的迭代就可以覆盖其他的DU链.注意如果要用分支测试策略为上述的PDL选择测试路径,并不需要另外的信息.为了选择BRO测试的路径,只需知道每个条件和块的结构.(选择程序的路径之后,需要决定该路径是否实用于该程序,即是否存在执行该路径的至少一个输入).由于变量的定义和使用,程序中的语句都彼此相关,所以数据流测试方法能够有效地发现错误,但是,数据流测试的覆盖率测度和路径选择比条件测试更为困难.3,循环测试循环测试是一种白盒测试技术,注重于循环构造的有效性.有四种循环:简单循环,串接循环,嵌套循环和不规则循环.简单循环嵌套循环串接循环不规则循环简单循环:下列测试集用于简单循环,其中n是允许通过循环的最大次数.整个跳过循环;只有一次通过循环;两次通过循环;m次通过循环,其中m<N;n-1,n,n+1次通过循环.嵌套循环:如果将简单循环的测试方法用于嵌套循环,可能的测试数就会随嵌套层数成几何级增加,这会导致不实际的测试数目,下面是一种减少测试数的方法:从最内层循环开始,将其它循环设置为最小值;对最内层循环使用简单循环,而使外层循环的跌代参数(即循环计数)最小,并为范围外或排除的值增加其它测试;由内向外构造下以个循环的测试,但其它的外层循环为最小值,并使其它的嵌套循环为"典型"值;继续直到测试所有的循环.串接循环:如果串接循环的循环都彼此独立,可是使用嵌套的策略测试.但是如果两个循环串接起来,而第一个循环是第二个循环的初始值,则这两个循环并不是独立的.如果循环不独立,则推荐使用的嵌套循环的方法进行测试. 不规则循环:不能测试,尽量重新设计给结构化的程序结构后再进行测试.面向对象的白盒测试对OO软件的类测试相当于传统软件的单元测试.和传统软件的单元测试不同,他往往关注模块的算法细节和模块接口间流动的数据,OO软件的类测试是由封装在类中的操作和类的状态行为所驱动的.OO软件测试的特点:因为属性和操作是被封装的,对类之外操作的测试通常是徒劳的.封装使对对象的状态快照难于获得.继承也给测试带来了难度,即使是彻底复用的,对每个新的使用语境也需要重新测试.多重继承更增加了需要测试的语境的数量,使测试进一步复杂化.如果从超类导出的测试用例被用于相同的问题域,有可能对超类导出的测试用例集可以用于子类的测试,然而,如果子类被用于完全不同的语境,则超类的测试用例将没有多大用途,必须设计新的测试用例集.类测试一般有两种主要的方式:功能性测试和结构性测试,即对应于传统结构化软件的黑盒测试和白盒测试.功能性测试以类的规格说明为基础,它主要检查类是否符合其规格说明的要求.例如,对于Stack类,即检查它的操作是否满足LIFO规则;结构性测试则从程序出发,它需要考虑其中的代码是否正确,同样是Stack类,就要检查其中代码是否动作正确且至少执行过一次.结构性测试方法(白盒测试)结构性测试对类中的方法进行测试,它把类作为一个单元来进行测试.测试分为两层:第一层考虑类中各独立方法的代码;第二层考虑方法之间的相互作用.每个方法的测试要求能针对其所有的输入情况,但这样还不够,只有对这些方法之间的接口也做同样测试,才能认为测试是完整的.对于一个类的测试要保证类在其状态的代表集上能够正确工作,构造函数的参数选择以及消息序列的选择都要满足这一准则.因此,在这两个不同的测试层次上应分别做到:方法的单独测试:结构性测试的第一层是考虑各独立的方法,这可以与过程的测试采用同样的方法,两者之间最大的差别在于方法改变了它所在实例的状态,这就要取得隐藏的状态信息来估算测试的结果,传给其它对象的消息被忽略,而以桩来代替,并根据所传的消息返回相应的值,测试数据要求能完全覆盖类中代码,可以用传统的测试技术来获取.方法的综合测试:第二层要考虑一个方法调用本对象类中的其它方法和从一个类向其它类发送信息的情况.单独测试一个方法时,只考虑其本身执行的情况.而没有考虑动作的顺序问题,测试用例中加入了激发这些调用的信息,以检查它们是否正确运行了.对于同一类中方法之间的调用,一般只需要极少甚至不用附加数据,因为方法都是对类进行存取,故这一类测试的准则是要求遍历类的所有主要状态.白盒测试工具:内存资源泄漏检查:Numega中的bouncechecker,Rational的Purify等;代码覆盖率检查:Numega中的truecoverage,Rational的Purecoverage,Telelogic公司的logiscope,Macabe公司的Macabe等;开源覆盖率测试软件gCov等.总结:"白盒"法全面了解程序内部逻辑结构,对所有逻辑路径进行测试."白盒"法是穷举路径测试.在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据.贯穿程序的独立路径数是天文数字.但即使每条路径都测试了仍然可能有错误.第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序;第二,穷举路径测试不可能查出程序中因遗漏路径而出错.第三,穷举路径测试可能发现不了一些与数据相关的错误.。
白盒测试及其实测案例设计
4.2 路径分析测试
4.2.1 控制流图
白盒测试是针对软件产品内部逻辑结构进行测试的,测试人员必须对测试中的软件有深入的理解,包括 其内部结构、各单元部分及之间的内在联系,还有程序运行原理等等。因而这是一项庞大并且复杂的工 作。为了更加突出程序的内部结构,便于测试人员理解源代码,可以对程序流程图进行简化,生成控制 流图(Control Flow Graph)。简化后的控制流图是由节点和控制边组成的。 控制流图有以下几个特点: 具有唯一入口节点,即源节点,表示程序段的开始语句; 具有唯一出口节点,即汇节点,表示程序段的结束语句; 节点由带有标号的圆圈表示,表示一个或多个无分支的源程序语句; 控制边由带箭头的直线或弧表示,代表控制流的方向。
白盒测试及其实测案例设计
路径覆盖 路径覆盖(Path Coverage)要求设计若干测试用例,执行被测试程 序时,能够覆盖程序中所有的可能路径。 测试用例组8: Test Case 1:x=2000,y=600,z=6000 Test Case 3:x=50,y=600,z=2000 Test Case 4:x=2000,y=600,z=2000 Test Case 7:x=2000,y=200,z=1000
1 main ()
2{
3 int num1=0, num2=0, score=100;
4 int i;
5 char str;
6 scanf (“%d, %c\n”, &i, &str);
7 while (i<5)
8{
9 if (str=’T’)
10
num1++;
11 else if (str=’F’)
例如,在如图4-3所示的控制流图中,一组独立的路径是 path1:1 - 11 path2:1 - 2 - 3 - 4 - 5 - 10 - 1 - 11 path3:1 - 2 - 3 - 6 - 8 - 9 - 10 - 1 - 11 path4:1 - 2 - 3 - 6 - 7 - 9 - 10 - 1 - 11
白盒测试及测试案例设计(已经看)
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 15
4.3.2 逻辑覆盖法
根据覆盖目标的不同,逻辑覆盖又可分为语句覆盖、判定 覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。 语句覆盖:选择足够多的测试用例,使得程序中的每个可 执行语句至少执行一次。 判定覆盖:通过执行足够的测试用例,使得程序中的每个 判定至少都获得一次“真”值和“假”值, 也就是使程序 中的每个取“真”分支和取“假”分支至少均经历一次, 也称为“分支覆盖”。 条件覆盖:设计足够多的测试用例,使得程序中每个判定 包含的每个条件的可能取值(真/假)都至少满足一次。
第四章 白盒测试及其用例的设计
Slide 14
4.3.1 测试覆盖率
测试覆盖率:用于确定测试所执行到的覆盖项的百分比。 其中的覆盖项是指作为测试基础的一个入口或属性,比如 语句、分支、条件等。 测试覆盖率可以表示出测试的充分性,在测试分析报告中 可以作为量化指标的依据,测试覆盖率越高效果越好。但 覆盖率不是目标,只是一种手段。 测试覆盖率包括功能点覆盖率和结构覆盖率: 功能点覆盖率大致用于表示软件已经实现的功能与软件需 要实现的功能之间的比例关系。 结构覆盖率包括语句覆盖率、分支覆盖率、循环覆盖率、 路径覆盖率等等。
Slide 2
本章教学目标
理论环节
学习理解白盒测试方法的基本概念 学习理解白盒测试的覆盖理论
学习掌握白盒测试的路径表达 学习掌握白盒测试的基本路径测试法
实践环节
通过案例运用学习掌握覆盖问题的解决方法 运用基本路径测试方法进行实际程序测试
第四章 白盒测试及其用例的设计
软件测试-实验2-白盒测试案例分析
实验2 白盒测试一、实验目的与要求1、掌握白盒测试的语句覆盖和判定覆盖测试方法的原理及应用2、掌握条件覆盖、条件组合覆盖的方法,提高应用能力3、掌握路径法测试二、实验设备1、电脑PC三、实验原理白盒测试原理:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否已经过检查。
它是把测试对象看作装在一个透明的白盒子里,也就是完全了解程序的结构和处理过程。
这种方法按照程序内部的逻辑测试程序,检验程序中的每条通路是否都能按预定要求正确工作,其又称为结构测试。
1、语句覆盖语句覆盖指代码中的所有语句都至少执行一遍,用于检查测试用例是否有遗漏,如果检查到没有执行到的语句时要补充测试用例。
无须细分每条判定表达式,该测试虽然覆盖了可执行语句,但是不能检查判断逻辑是否有问题。
2、判定覆盖又称判断覆盖、分支覆盖,指设计足够的测试用例,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断真假取值均曾被满足。
判定覆盖比语句覆盖强,但是对程序逻辑的覆盖度仍然不高,比如由多个逻辑条件组合而成的判定,仅判定整体结果而忽略了每个条件的取值情况。
3、条件覆盖、条件判定覆盖条件覆盖指程序中每个判断中的每个条件的所有可能的取值至少要执行一次,但是条件覆盖不能保证判定覆盖,条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。
条件判定覆盖是条件覆盖和判定覆盖的组合,指设计足够的测试用例,使得判定中每个条件的所有可能的取值至少出现一次,并且每个判定取到的各种可能的结果也至少出现一次。
条件判定覆盖弥补了条件和判定覆盖的不足,但是未考虑条件的组合情况。
4、条件组合覆盖又称多条件覆盖,设计足够的测试用例,使得判定条件中每一个条件的可能组合至少出现一次。
线性地增加了测试用例的数量。
5、基本路径法在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行的路径集合,从而设计测试用例的方法。
白盒测试技术案例详解
白盒测试技术案例详解白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。
其中运用最为广泛的是基本路径测试法。
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。
设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。
在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例。
包括以下4个步骤和一个工具方法:1.程序的控制流图:描述程序控制流的一种图示方法。
2.程序圈复杂度:McCabe复杂性度量。
从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。
3.导出测试用例:根据圈复杂度和程序结构设计用例数据输入和预期结果。
4.准备测试用例:确保基本路径集中的每一条路径的执行。
工具方法:图形矩阵:是在基本路径测试中起辅助作用的软件工具,利用它可以实现自动地确定一个基本路径集。
程序的控制流图:描述程序控制流的一种图示方法。
圆圈称为控制流图的一个结点,表示一个或多个无分支的语句或源程序语句流图只有二种图形符号:图中的每一个圆称为流图的结点,代表一条或多条语句。
流图中的箭头称为边或连接,代表控制流任何过程设计都要被翻译成控制流图。
如何根据程序流程图画出控制流程图?在将程序流程图简化成控制流图时,应注意:n在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。
n边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。
如下图所示n如果判断中的条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的复合条件表达式,则需要改为一系列只有单条件的嵌套的判断。
例如:1if a or b2x3else4y对应的逻辑为:独立路径:至少沿一条新的边移动的路径基本路径测试法的步骤:o第一步:画出控制流图流程图用来描述程序控制结构。
第十章 白盒测试用例设计方法PPT课件
• 独立路径是指包括一组之前没有处理的语句或条件的一条 路径。如上图的控制流图中,所包含的一组独立路径如下:
• Path1:1-11 • Path2:1-2-3-4-5-10-1-11 • Path3:1-2-3-6-7-9-10-1-11 • Path4:1-2-3-6-8-9-10-1-11
18
4
逻辑覆盖法
IT@ANY
• 对于一个多重选择和逻辑嵌套的程序,不同的路径数目可能是天文数 字,如下图包含了一个执行达20次的循环,包含的不同执行路径数高 达5的20次方,每条路径测试需要1ms,假设一天工作24h,一年365天, 若要穷举测试,需要3024年的时间
5
逻辑覆盖法
IT@ANY
• 逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例 的技术。属白盒测试。
• 为把问题简化,避免出现测试用例极多组合爆炸,可以把循环操作的 重复型结构用选择结构代替,也就是说,并不指望测试循环体所有的 重复执行,而只对循环体检验一次。这样,任一循环便改造成进入循 环体或不进入循环体的分支操作了
25
最少测试用例数计算
• 用N-S图表示基本控制结构 • A、B、C、D、S:表示要执行的操作 • P是可取真假值的谓词 • Y表示真值,N表示假值
• 例:程序流程图
IT@ANY
16
基本路径测试法
• 由基本流程图转 化控制流程图
IT@ANY
17
基本路径测试法 - 环路复杂性
IT@ANY
• 程序的环路复杂性即McCabe复杂性度量,在进行程序的 基本路径测试时,从程序的环路复杂性可导出程序基本路
径集合中的独立路径条数,这是确保程序中每个可执行语 句至少执行一次所必须得测试用例数目的上界
3-10白盒测试_综合案例分析
拓展训练
请综合考虑使用各 白盒测试方法对下面 的程序代码段进行测 试。
void ReadPara( CString temp) { if ( temp == ">=")
m_oper.SetCurSel(0); else{
案例分析
2. 路径2(1-2-9-11-12)的测试用例:
score[ 1 ]= – 1 ; 期望的结果:average = – 1 ,其他量保持初值。 3. 路径3(1-2-3-9-10-12)的测试用例: 输入多于50个有效分数,即试图处理51个分数,要求前51个为有效 分数; 期望结果:n1=50、且算出正确的总分和平均分。 4. 路径4(1-2-3-4-5-8-2…)的测试用例: score[i]=有效分数,当i<50; score[k]<0, k< i ; 期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和 平均分average。
} }
return;
谢谢大家!
the
end
ቤተ መጻሕፍቲ ባይዱ
score[i]=有效分数, 当i<50; 期望结果:根据输入的有效分 数算出正确的分数个数n1、总分sum和平均分average。
本路径测试一样满足100%的语句覆盖、条件覆盖和路径覆 盖。
案例小结
1. 由于路径测试一般来说会满足逻辑覆盖的指标,因 此在实际中较多采用,但是路径测试会随着条件节 点的增多而急剧增多,对于环形复杂度>10的程序, 一般会认为过于复杂而难以测试。
案例分析
案例分析
1. V(G)= 6 (个区域) 2. V(G)=E–N+2=16–12+2=6 其中E为流图中的边数,N为结点数; 3. V(G)=P+1=5+1=6 其中P为谓词结点的个数。在流图中,结点2、3、5、6、 9是谓词结点。
软件测试案例-白盒测试覆盖案例
测试用例 通过路径
条件取值
x=4、y=6、z=5 abd
T1、T2、T3、T4
覆盖分支 bd
x=2、y=5、z=11 ace
-T1、-T2、-T3、- ce T4
分支条件覆盖从表面来看,它测试了所有条件的取值,
但是实际上某些条件掩盖了另一些条件。例如对于条件表达 式(x>3)&&(z<10)来说,必须两个条件都满足才能确定表达 式为真。如果(x>3)为假则一般的编译器不在判断是否 z<10了。对于第二个表达式(x= =4)||(y>5)来说,若 x==4测试结果为真,就认为表达式的结果为真,这时不再检 查(y>5)条件了。因此,采用分支条件覆盖,逻辑表达式 中的错误不一定能够查出来了。
ace
-T1、-T2、-T3、-T4 4和8
上面的测试用例覆盖了所有条件的可能取值的组合,覆 盖了所有判断的可取分支,但是却丢失了一条路径abe。
路径测试:
路径测试就是设计足够多的测试用例,覆盖被测试对象 中的所有可能路径。
在上面的测试用例中再添加一个测试用例则可对程序进 行了全部的路径覆盖。
测试用例 x=4、y=6、z=5 x=4、y=5、z=15 x=2、y=6、z=15 x=5、y=6、z=5
测试用例的输入为: { x=4、y=5、z=5} { x=2、y=5、z=5}
上面的两个测试用例虽然能够满足条件覆盖的要求,但 是也不能对判断条件进行检查,例如把第二个条件y>5错误 的写成y<5,、上面的测试用例同样满足了分支覆盖。
条件覆盖
条件覆盖就是设计若干个测试用例,运行被测试对象, 使得程序中每个判断的每个条件的可能取值至少执行一次。
软件测试-实验2-白盒测试案例分析
实验2 白盒测试一、实验目的与要求1、掌握白盒测试的语句覆盖和判定覆盖测试方法的原理及应用2、掌握条件覆盖、条件组合覆盖的方法,提高应用能力3、掌握路径法测试二、实验设备1、电脑PC三、实验原理白盒测试原理:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否已经过检查。
它是把测试对象看作装在一个透明的白盒子里,也就是完全了解程序的结构和处理过程。
这种方法按照程序内部的逻辑测试程序,检验程序中的每条通路是否都能按预定要求正确工作,其又称为结构测试。
1、语句覆盖语句覆盖指代码中的所有语句都至少执行一遍,用于检查测试用例是否有遗漏,如果检查到没有执行到的语句时要补充测试用例。
无须细分每条判定表达式,该测试虽然覆盖了可执行语句,但是不能检查判断逻辑是否有问题。
2、判定覆盖又称判断覆盖、分支覆盖,指设计足够的测试用例,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断真假取值均曾被满足。
判定覆盖比语句覆盖强,但是对程序逻辑的覆盖度仍然不高,比如由多个逻辑条件组合而成的判定,仅判定整体结果而忽略了每个条件的取值情况。
3、条件覆盖、条件判定覆盖条件覆盖指程序中每个判断中的每个条件的所有可能的取值至少要执行一次,但是条件覆盖不能保证判定覆盖,条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。
条件判定覆盖是条件覆盖和判定覆盖的组合,指设计足够的测试用例,使得判定中每个条件的所有可能的取值至少出现一次,并且每个判定取到的各种可能的结果也至少出现一次。
条件判定覆盖弥补了条件和判定覆盖的不足,但是未考虑条件的组合情况。
4、条件组合覆盖又称多条件覆盖,设计足够的测试用例,使得判定条件中每一个条件的可能组合至少出现一次。
线性地增加了测试用例的数量。
5、基本路径法在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行的路径集合,从而设计测试用例的方法。
白盒测试设计用例的方法
白盒测试设计用例的方法
1. 等价类划分法呀!这就像是把东西分类一样,把可能的情况分成几大类。
比如说测试一个登录功能,那就可以把用户名和密码的正确、错误情况进行分类,分别设计用例。
哇塞,这样不就能全面覆盖各种情况了嘛!
2. 边界值分析法,嘿,这个可重要啦!就像走路到了边界处特别要小心一样。
比如规定输入年龄在 18 到 60 岁,那 18 和 60 这两个边界值就得好好测试呀,这不是很容易理解嘛!
3. 因果图法呢,哎呀,就像是顺着线索找原因和结果。
比如有多个条件影响一个结果,那咱就得好好分析这些条件之间的关系,然后设计用例,不是挺有意思嘛!
4. 判定表法呀,这就好像是做一个决策表格似的。
对于复杂的条件组合,通过判定表清晰地列出来,然后得出对应的用例,是不是很厉害呢!
5. 正交试验法哦,听着就很牛掰吧!就像是从很多因素中选出最关键的组合来进行测试。
比如有多个参数要考虑,用这个方法就能高效地选出典型组合进行用例设计,是不是超级有用呀!
6. 场景法呢,哇哦,这简直就是在模拟一个场景片段呀!想想一个业务流程,从开始到结束,设计出符合各种场景的用例,这多生动形象呀,当然能把测试做好啦!
我觉得这些白盒测试设计用例的方法都超级棒,各有各的厉害之处,用好了就能让测试工作如虎添翼呀!。
实训 白盒测试用例设计
实训白盒测试用例设计实训1、实训目的1、掌握白盒测试用例的设计方法。
2、综合运用所学的白盒测试方法设计测试用例。
2、实训准备1、白盒测试用例的设计方法。
2、测试用例模板。
3、实训内容3.1基本训练实验一:下面是快速排序算法中的一趟划分算法,其中datalist是数据表,它有两个数据成员:一是元素类型为Element的数组V,另一个是数组大小n。
算法中用到两个操作,一是取某数组元素V[i]的关键码操作getKey( ),一是交换两数组元素内容的操作Swap( ):int Partition ( datalist &list, int low, int high ) {//在区间[ low, high ]以第一个对象为基准进行一次划分,k返回基准对象回放位置。
int k = low; Element pivot = list.V[low]; //基准对象for ( int i = low+1; i <= high; i++ ) //检测整个序列,进行划分if ( list.V[i].getKey ( ) < pivot.getKey( ) && ++ k != i ) Swap ( list.V[k], list.V[i] ); //小于基准的交换到左侧去Swap ( list.V[low], list.V[k] ); //将基准对象就位return k; //返回基准对象位置}(1)试画出它的程序流程图;(2)试利用路径覆盖方法为它设计足够的测试用例(循环次数限定为0次,1次和2次)。
实验二:下面是选择排序的程序,其中datalist是数据表,它有两个数据成员:一是元素类型为Element的数组V,另一个是数组大小n。
算法中用到两个操作,一是取某数组元素V[ i]的关键码操作getKey ( ),一是交换两数组元素内容的操作Swap( ):void SelectSort ( datalist & list ) {//对表list.V[0]到list.V[n-1]进行排序,n是表当前长度。
白盒测试及用例的设计
条件覆盖率
详细描述
为了提高条件覆盖率,可以增加 更多的测试用例或优化现有的测 试用例。
04
总结词
高条件覆盖率意味着测试用例对 程序中的条件进行了全面的测试, 但并不能保证所有可能的条件结 果都已覆盖。
01 03
总结词
条件覆盖率是衡量测试用例覆盖 程序中条件语句(如if、while等) 中的条件的程度的指标。
TestNG是Java语言的测试框架,具有灵活的测试用例 管理功能。
详细描述
TestNG支持多种测试类型,如单元测试、集成测试和 端到端测试。它提供了丰富的断言方法和数据驱动测试 ,有助于提高测试效率和代码覆盖率。
案例三:使用Selenium进行白盒测试
总结词
Selenium是一个用于Web应用程序 的自动化测试框架。
边界值分析法
总结词
边界值分析法是一种白盒测试用例设计方法 ,它关注输入域的边界值,通过测试边界值 和附近的值来验证软件的健壮性。
详细描述
边界值分析法主要针对输入域的边界值进行 测试,因为这些值在软件中往往容易出现问 题。通过测试边界值和附近的值,可以有效 地发现软件在处理异常情况时的缺陷和错误 。这种方法有助于提高测试的覆盖率,确保
详细描述
Selenium支持多种浏览器和操作系统, 能够模拟用户操作,如点击、输入等。 通过编写测试脚本,可以实现对Web 应用程序的全面白盒测试,确保功能 和用户体验的正确性。
感谢您的观看
THANKS
缺陷跟踪与修复
缺陷管理
对发现的问题进行跟踪管理,确保问题得到及时修复。
缺陷验证
对修复的问题进行验证,确保问题已被正确修复。
测试用例设计-白盒
b
N
X=X/A
2==A || X>1
e
Y
d
N
X=X+1
【优点】 :这种测试方法可以对程序进行彻底的测
试,比前面五种的覆盖面都广。
【缺点】 :需要设计大量、复杂的测试用例,使得
工作量呈指数级增长,不见得把所有的条件组合都覆 盖。
小结:白盒法常用的覆盖标准
1、语句覆盖: 选择足够的测试用例,使得程序
/*Description:………………………………………………… 首先,判断A大于1而且B等于0,那么X缩小A倍; 然后,判断A等于2或者X大于1,那么X递增;…………………*/
float fn_compare(float A,float B,float X) { if ((A>1) && (0==B)) { X=X/A ; } if ((2==A) || (X>1)) { X=X+1;
0==B c
Y
满足以下覆盖情况:
X=X/A
b
2==A
N Y
e
Y
选择用例: d [(2,0,4),(2,0,3)] [(2,1,1),(2,1,2)] [(1,0,3),(1,0,4)] [(1,1,1),(1,1,1)] 满足了条件组合覆盖,但没有路径完全覆盖
N
X>1
① A>1, B =0 ② A>1, B≠0 ③ A≤1, B =0 ④ A≤1, B≠0 ⑤ 2==A, X>1 ⑥ 2==A, X≤1 ⑦ A≠2, X>1 ⑧ A≠2, X≤1 ① ⑤ ace ② ⑥ abd ③ ⑦ abd ④ ⑧ abd
N
Y
float fn_compare(float A,float B,float X) { if ((A>1) && (0==B)) { X=X/A ; } if ((2==A) || (X>1)) { X=X+1; } }
白盒测试用例方法实例
白盒测试用例方法实例2009-7-131示例:程序源代码分析Dim a, b As IntegerDim c As DoubleIf (a>0 And b>0) Thenc=c/aEnd IfIf (a>1 Or c>1) Thenc=c+1End Ifc=b+c示例:程序源代码分析程序流程图示例:程序源代码分析•由上述的流程图1可以看出,该程序模块有4条不同的路径:–P1(1-2-4)–P2(1-2-5)–P3(1-3-4)–P4(1-3-5)•将里面的判定条件和过程记录为图2–条件M={a>0 and b>0}–条件N={a>1 or c>1}示例:程序源代码分析•程序的4条路径可以表示为:(/表示取反)–P1(1-2-4)=M and N–P2(1-2-5)=M and /N–P3(1-3-4)=/M and N–P4(1-3-5)=/M and /N示例:语句覆盖•语句覆盖,就是要满足条件M和条件N,那么按照语句覆盖的原则,测试用例为:{a=2,b=1,c=6}对应输出为:{a=2,b=1,c=5}语句覆盖优缺点•优点:可以很直观地从源代码得到测试用例,无须细分每条判定表达式。
•缺点:由于这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。
判定覆盖•判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。
•判定覆盖又称为分支覆盖。
示例:判定覆盖•按照判定覆盖的基本思路,将前面提到的代码示例进行测试用例设计:–P1和P4可以作为测试用例–其中P1作为取真的路径,P4作为取反的路径,那么输入{a=2,b=1,c=6}和输出{a=2,b=1,c=5}覆盖了路径P1输入{a=-1,b=2,c=1}和输出{a=-1,b=2,c=3}覆盖了路径P4判定覆盖优缺点•优点:判定覆盖比语句覆盖要多几乎一倍的测试路径,当然也就具有比语句覆盖更强的测试能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 21
判定覆盖
要实现DoWork函数的判定覆盖,需要设计两个测试用例。 测试用例的输入为:{x=4、y=5、z=5};{x=2、y=5、z=5} 程序执行的路径分别是:abd;ace 分析: 上述两个测试用例不仅满足了判定覆盖,同时还做到 语句覆盖。从这点看似乎判定覆盖比语句覆盖更强一些, 但仍然无法确定判定内部条件的错误。例如把第二个判定 中的条件y>5错误写为y<5,使用上述测试用例,照样能按 原路径执行而不影响结果。因此,需要有更强的逻辑覆盖 准则去检验判定内的条件。
第四章 白盒测试及其用例的设计
Slide 14
4.3.1 测试覆盖率
测试覆盖率:用于确定测试所执行到的覆盖项的百分比。 其中的覆盖项是指作为测试基础的一个入口或属性,比如 语句、分支、条件等。 测试覆盖率可以表示出测试的充分性,在测试分析报告中 可以作为量化指标的依据,测试覆盖率越高效果越好。但 覆盖率不是目标,只是一种手段。 测试覆盖率包括功能点覆盖率和结构覆盖率: 功能点覆盖率大致用于表示软件已经实现的功能与软件需 要实现的功能之间的比例关系。 结构覆盖率包括语句覆盖率、分支覆盖率、循环覆盖率、 路径覆盖率等等。
控制流图(可简称流图)是对程序流程图进行简化后得到 的,它可以更加突出的表示程序控制流的结构。 控制流图中包括两种图形符号:节点和控制流线。 节点由带标号的圆圈表示,可代表一个或多个语句、一个 处理框序列和一个条件判定框(假设不包含复合条件)。 控制流线由带箭头的弧或线表示,可称为边。它代表程序 中的控制流。
A Free sample background from
Slide 20
语句覆盖
要实现DoWork函数的语句覆盖,只需设计一个测试用例 就可以覆盖程序中的所有可执行语句。 测试用例输入为:{ x=4、y=5、z=5 } 程序执行的路径是:abd 分析: 语句覆盖可以保证程序中的每个语句都得到执行,但 发现不了判定中逻辑运算的错误,即它并不是一种充分的 检验方法。例如在第一个判定((x>3)&&(z<10))中把“&&” 错误的写成了“||”,这时仍使用该测试用例,则程序仍会 按照流程图上的路径abd执行。可以说语句覆盖是最弱的 逻辑覆盖准则。
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 1
第4章 白盒测试及其用例的设计
4.1 白盒测试方法 4.2 白盒测试的基本概念 4.3 覆盖测试 4.4 路径测试 4.5 最少测试用例数计算
第四章 白盒测试及其用例的设计
A Free sample background from
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 19
逻辑覆盖法(续)
a
X>3 && z<10
T b 执行语句块1 F F
c
X==4 || y>5
T d
执行语句块2
e
执行语句块3
第四章 白盒测试及其用例的设计
常见结构的控制流图
对于复合条件,则可将其分解为多个单个条件,并映射成 控制流图。
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 9
4.2.2 环形复杂度
环形复杂度也称为圈复杂度,它是一种为程序逻辑复杂度 提供定量尺度的软件度量。 环形复杂度的应用——可以将环形复杂度用于基本路径方 法,它可以提供:程序基本集的独立路径数量;确保所有 语句至少执行一次的测试数量的上界。 独立路径是指程序中至少引入了一个新的处理语句集合或 一个新条件的程序通路。采用流图的术语,即独立路径必 须至少包含一条在本次定义路径之前不曾用过的边。 测试可以被设计为基本路径集的执行过程,但基本路径集 通常并不唯一。
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 11
4.2.3 图矩阵
图矩阵是控制流图的矩阵表示形式。
图矩阵是一个方形矩阵,其维数等于控制流图的节点数。 矩阵中的每列和每行都对应于标识的节点,矩阵元素对应 于节点间的边。 通常,控制流图中的结点用数字标识,边则用字母标识。 如果在控制流图中从第 i 个结点到第 j 个结点有一个标识 为 x 的边相连接,则在对应图矩阵的第 i 行第 j 列有一个 非空的元素 x 。
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 15
4.3.2 逻辑覆盖法
根据覆盖目标的不同,逻辑覆盖又可分为语句覆盖、判定 覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。 语句覆盖:选择足够多的测试用例,使得程序中的每个可 执行语句至少执行一次。 判定覆盖:通过执行足够的测试用例,使得程序中的每个 判定至少都获得一次“真”值和“假”值, 也就是使程序 中的每个取“真”分支和取“假”分支至少均经历一次, 也称为“分支覆盖”。 条件覆盖:设计足够多的测试用例,使得程序中每个判定 包含的每个条件的可能取值(真/假)都至少满足一次。
Slide 6
4.2 白盒测试的基本概念
4.2.1 控制流图
4.2.2 环形复杂度
4.2.3 图矩阵
Return
A Free sample background from
第四章 白盒测试及其用例的设计
Slide 7
4.2.1 控制流图
Slide 2
本章教学目标
理论环节
学习理解白盒测试方法的基本概念 学习理解白盒测试的覆盖理论
学习掌握白盒测试的路径表达 学习掌握白盒测试的基本路径测试法
实践环节
通过案例运用学习掌握覆盖问题的解决方法 运用基本路径测试方法进行实际程序测试
第四章 白盒测试及其用例的设计
A Free sample background from
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 12
习题
根据左图给出的程序流程图, 完成以下要求:
(1)画出相应的控制流图。
(2)计算环形复杂度。
(3)给出相应的图矩阵。 (4)找出程序的独立路径集合。
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 134.3 Biblioteka 盖测试4.3.1 测试覆盖率
4.3.2 逻辑覆盖法
4.3.3 面向对象的覆盖 4.3.4 测试覆盖准则
Return
A Free sample background from
Return
A Free sample background from
第四章 白盒测试及其用例的设计
Slide 4
白盒测试方法(续)
白盒测试也称结构测试或逻辑驱动测试,是针对被测单元 内部是如何进行工作的测试。它根据程序的控制结构设计 测试用例,主要用于软件或程序验证。 白盒测试法检查程序内部逻辑结构,对所有逻辑路径进行 测试,是一种穷举路径的测试方法。但即使每条路径都测 试过了,仍然可能存在错误。因为: 穷举路径测试无法检查出程序本身是否违反了设计规范, 即程序是否是一个错误的程序。 穷举路径测试不可能查出程序因为遗漏路径而出错。 穷举路径测试发现不了一些与数据相关的错误。
组合覆盖:通过执行足够的测试用例,使得程序中每个判 定的所有可能的条件取值组合都至少出现一次。 ——满足组合覆盖的测试用例一定满足判定覆盖、条件覆 盖和判定/条件覆盖。 路径覆盖:设计足够多的测试用例,要求覆盖程序中所有 可能的路径。
第四章 白盒测试及其用例的设计
A Free sample background from
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 10
计算环形复杂度的方法
环形复杂度以图论为基础,为我们提供了非常有用的软件 度量。可用如下三种方法之一来计算环形复杂度: 控制流图中区域的数量对应于环形复杂度。 给定控制流图G的环形复杂度—V(G),定义为 V(G) = E-N+2 其中,E是控制流图中边的数量,N是控制流图中的节点 数量。 给定控制流图G的环形复杂度—V(G),也可定义为 V(G) = P+1 其中,P是控制流图G中判定节点的数量。
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 5
白盒测试方法(续)
采用白盒测试方法必须遵循以下几条原则,才能达到 测试的目的: 保证一个模块中的所有独立路径至少被测试一次。 所有逻辑值均需测试真 (true) 和假 (false) 两种情况。
第四章 白盒测试及其用例的设计
A Free sample background from
Slide 16
逻辑覆盖法(续)
判定/条件覆盖:设计足够多的测试用例,使得程序中每个 判定包含的每个条件的所有情况(真/假)至少出现一次, 并且每个判定本身的判定结果(真/假)也至少出现一次。 ——满足判定/条件覆盖的测试用例一定同时满足判定覆盖 和条件覆盖。
Slide 17