资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,0,29 十一月 2024,1,程序员面试宝典3,【,例,】,三角形的边长,(,整数,),三角形性质,异常情况,a+b,c,a,0,a,N,a,是字符型,排列次序相关,a,b,c,正常情况,合理的不等边三角形,合理的等边三角形,合理的等腰三角形,排列次序相关,a=3,b=4,c=5,a=3,b=3,c=4,a=3,b=3,c=3,测试目标,其它,SE,阶段, “,建设性”,测试:找错过程,“,破坏性”?,改错,提高软件质量,“,建设性”,G. Myers,为了发现程序中的错误而执行程序的过程,证明程序正确,没有错误?,证明程序错误,暴露错误?,穷尽测试,(complete test),包含所有可能情况的测试,a, b, c: integer,计算机字长,16,位 可能取值有,2,16,可能的排列组合,2,16,2,16,2,16, 3,10,111,1,ms/,次,310,111,1,万,年,!,=,仍然不是穷尽测试!不能严格证明程序正确性!,无效输入,的情况没有测试,更容易发生错误,测试方法,(I),测试技术,1、,白盒测试,(,White Box Testing),2、,黑盒测试,(,Black Box Testing),结构测试,功能测试,Module,stub,driver,interface,local data structures,boundary conditions,independent paths,error handling paths,test cases,RESULTS,main(),input(test_case);,result=Module(test_case);,output(result);,result_type Module(test_case),;,value=stubmodule(data);,;,value_type stubmodule(data),output(data);,value=fake_value();,return value;,测试用例设计,三角形,NextDate,白盒测试法,关注软件,内部逻辑结构,(,control structure,),测试每条,逻辑通路,,检查,断点(,break point,),状态,测试方案对程序逻辑的覆盖程度决定测试的完全性程度,White-Box Testing,Use the structure of the program to test.,Structural testing,白盒测试,可能的执行通路,=,5,1,+5,2,+,+5,20,loop = 20 X,1,2,3,4,5,3170,年,!,365,24,小时,/,年,1,毫秒,/,条,10,14,条,=,10,14,条,365,24,小时,/,年,穷尽测试,(complete test),一系列测试过程的总称,这组测试过程逐渐进行越来越完整的通路测试。,逻辑覆盖,(Logical coverage),白盒法测试方案的设计,穷尽测试不可能,选少量“最有效”的,test cases,,做到尽可能完备的测试,Error!,选择足够多的测试数据,使程序中每个可执行的,语句,至少执行一次。,a,(,1,)语句覆盖 (,Statement coverage,),例,:,PROCEDURE SAMPAL (A,B:REAL; VAR X:REAL);,BEGIN,IF (A1) AND (B=0),THEN X:=X/A,IF (A=2) OR (X1),THEN X:=X+1,END;,入口,A 1,AND B=0,T,A=2,OR X 1,T,X = X / A,X = X + 1,返回,F,F,S,a,b,c,d,E,入口,A 1,AND B=0,T,A=2,OR X 1,T,X = X / A,X = X + 1,返回,F,F,S,a,b,c,d,E,Test case 1 :,A=2 , B=0 , X=3,覆盖路径,SabcdE,A 1 AND B=0,T,A=2 OR X 1,T,语句覆盖,语句覆盖,入口,A 1,AND B=0,T,A=2,OR X 1,T,X = X / A,X = X + 1,返回,F,F,S,a,b,c,d,E,问题:,只测试了判定表达式,=T,,为,F,时如有错误无法发现!,只关心判定表达式的值,不关心判定表达式中每个条件的取不同值的情况。,Test case 1 :,A=2 , B=0 , X=3,很弱的逻辑覆盖,若,A1,AND,B=0,错写成,A1,OR,B=0,,无法测试出!,同样,若,A=2,OR,X 1,错写成,A=2,OR,X 1,AND B=0,T,A=2,OR X 1,T,X = X / A,X = X + 1,返回,F,F,S,a,b,c,d,E,两种方案:,1.SabcdE + SacE,(,TT,) (,FF,),2. SabcE + SacdE,(,T,F,) (,F,T,),(,2,)判定覆盖(,Branch coverage,),入口,A 1,AND B=0,T,A=2,OR X 1,T,X = X / A,X = X + 1,返回,F,F,S,a,b,c,d,E,Test cases 3:,A=4 , B=0 , X=4 (,SabcE,),A=2 , B=1 , X=3 (,SacdE,),问题:,任一方案都只检查了全部路径的一半,(,2/4,),无法判断内部条件的错误,(如,X1,错写为,X 1,AND B=0,T,A=2,OR X 1,T,X = X / A,X = X + 1,返回,F,F,S,a,b,c,d,E,A 1,T,A,1,F,B=0,T,B,0,F,A =2,T,A2,F,X 1,T,X,1,F,测试用例必须覆盖这,8,种可能的结果,!,选择足够多的测试数据,使每个判定表达式中的每个,条件,都取到各种可能的结果。,(,3,)条件覆盖(,Condition coverage,),入口,A 1,AND B=0,T,A=2,OR X 1,T,X = X / A,X = X + 1,返回,F,F,S,a,b,c,d,E,Test cases 4:,A=2 , B=0 , X=4SabcdE,(满足,A1, B=0; A=2, X1),TTTT,A=1, B=1, X=1 SacE,(,满足,A,1, B0; A 2, X1,),FFFF,条件覆盖 判定覆盖,?,条件覆盖,入口,A 1,AND B=0,T,A=2,OR X 1,T,X = X / A,X = X + 1,返回,F,F,S,a,b,c,d,E,Test cases 5:,A=2, B=0, X=1,SabcdE,(满足,A1, B=0; A=2, X,1,),TTT,F,A=1, B=1, X=2,SacdE,(,满足,A,1, B0; A 2, X1,),FFF,T,表达式,(A=2 OR X 1),始终为,T,,没有覆盖分,支,cE,,,不是判定覆盖!,条件覆盖不一定包含判定覆盖,,判定覆盖也不一定包含,条件覆盖!,条件覆盖,选择足够多的测试数据,使判定表达式中的每个,条件,都取到各种可能的值,而且每个,判定表达式,也都取到各种可能的结果。,(,4,)判定,-,条件覆盖,入口,A 1,AND B=0,T,A=2,OR X 1,T,X = X / A,X = X + 1,返回,F,F,S,a,b,c,d,E,Test cases 6:,A=2 , B=0 , X=4,SabcdE,(满足,A1, B=0; A=2, X1),TTTT,A=1, B=1, X=1,SacE,(,满足,A,1, B0; A 2, X1,),FFFF,Test cases 4,问题:,没能覆盖判定表达式中各条件取值的所有可能组合!,若,A1,AND,B=0,错写成,A1,OR,B=0,,无法测试出!,同样,若,A=2,OR,X 1,错写成,A=2,AND,X 1,,无法测试出!,不一定能发现判定表达式中的逻辑错误!,判定,-,条件覆盖,选择足够多的测试数据,使每个判定表达式中,条件的各种可能组合,都至少出现一次。,满足,条件组合覆盖,一定能满足,判定覆盖,、,条件覆盖,和,判定,条件覆盖,。,(,5,)条件组合覆盖,全部可能的条件组合为:,A1, B=0,TT, A1, B, 0,TF, A,1, B=0,FT, A,1, B 0,FF, A=2, X1,TT, A=2, X,1,TF, A,2, X1,FT, A,2,X,1,FF,Test cases 7:, A=2, B=0, X=4 (T T),SabcdE, A=2. B=1, X=1 (F T),SacdE, A=1, B=0, X=2 (F T),SacdE, A=1, B=1, X=1 (F F),SacE,问题:不能保证覆盖程序中的每一条路径!,没有测试到路径,SabcE,(,表达式,T F,,条件,和,的组合)的情形,入口,A 1,AND B=0,T,A=2,OR X 1,T,X = X / A,X = X + 1,返回,F,F,S,a,b,c,d,E,最强的逻辑覆盖,条件组合覆盖,5.,条件组合覆盖,4.,判定,-,条件覆盖,3.,条件覆盖,2.,判定覆盖,1.,语句覆盖,测试充分性,测试代价,逻辑覆盖的关系,控制结构测试,(I),基本路径测试,步骤如下:,第一步,根据过程设计结果画出相应的流图,第二步,计算流图的环形复杂度。,第三步,确定线性独立路径的基本集合。,第四步,设计可强制执行基本集合中每条路径的测试用例。,图,7.6,求平均值过程的流图,图,7.6,求平均值过程的流图,环形复杂度=6,路径1:1-2-10-11-13,路径2:1-2-10-12-13,路径3:1-2-3-10-11-13,路径4:1-2-3-4-5-8-9-2-,路径5:1-2-3-4-5-6-8-9-2-,路径6:1-2-3-4-5-6-7-8-9-2-,1,2,3,4,5,6,7,8,9,10,11,12,13,当程序中判定多于一个时,形成的分支结构可以分为两类:,嵌套型分支结构,和,连锁型分支结构,。,对于嵌套型分支结构,若有,n,个判定语句,需要,n,+1,个测试用例;,对于连锁型分支结构, 若有,n,个判定语句,需要有,2,n,个测试用例,覆盖它的,2,n,条路径。,条件测试路径选择,循环分为,4,种不同类型:,简单循环,、,连锁循环,、,嵌套循环,和,非结构循环,。,(1),简单循环,零次循环,:从循环入口到出口 ,一次循环,:检查循环初始值 ,二次循环,:检查多次循环 ,m,次循环: 检查在多次循环 最大次数循环、比最大次数多一次、少一次的循环。,循环测试路径选择,例:求最小值,k,=,i,;,for (,j,=,i,+1;,j,=,n,;,j,+ ),if ( A,j, A,k, ),k,=,j,;,k,=,i,;,j,=,i,+1;,j,=,n,?,A,j,A,k,?,k,=,j,j,+,f,d,c,a,b,e,测试用例选择,对最,内层,循环做,简单循环的全部测试,。所有,其它层,的循环变量置为,最小值,;,逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环的循环变量取最小值,所有其它嵌套,内层循环,的循环变量取“,典型,”值。,反复进行,直到所有各层循环测试完毕。,对全部各层循环同时取最小循环次,数,或者同时取最大循环次数,(2),嵌套循环,(3),连锁循环,如果各个循环,互相独立,,则可以用与简单循环相同的方法进行测试。但如果几个循环不,是互相独立,的,则需要使用测试嵌套循环的办法来处理。,(4),非结构循环,这一类循环应该使用结构化程序设计方法重新设计测试用例。,黑盒测试技术,黑盒测试着重测试软件功能。它很可能发现白盒测试不易发现的其他类型的错误。,黑盒测试力图发现下述类型的错误:,功能不正确或遗漏了功能;,界面错误;,数据结构错误或外部数据库访问错误;,性能错误;,初始化和终止错误。,黑盒测试技术,1、等价划分,2、边界值分析,1,等价划分,(I),等价划分是一种黑盒测试技术,这种技术把程序的输入域划分成若干个数据类,据此导出测试用例。,等价类测试的关键就是选择确定类的等价关系。,(1)等价划分,思想:将程序的所有输入数据划分为不同的区域,同一区域中各个输入数据对于揭露程序中的错误是等价的,称为等价类。然后从每一个等价类中选取少数有代表性的数据做为测试用例。,等价类,有效等价类,无效等价类,输出等价类,优点:可以滤掉同类数据,提高测试效率,划分:试探性、经验,划分等价类的启发式规则,值的范围,x,a,b,x,b,值的个数,x,=a,x,a,值约束,x,A=a,1,a,2,a,n,x,A,值的规则,x|P(x),x|,P(x),等价类的细化,x,Z, Z,+, 0, Z,-,表格,空表、一行、多行,建立等价类表,输入条件,有效等价类,无效等价类,.,.,.,.,.,.,.,.,.,设计步骤,划分等价类,建立等价类表,设计测试用例,设计一新测试方案,,尽可能多覆盖尚未被覆盖的有效等价类,,重复,直至全部覆盖,减少,test cases,设计一新测试方案,覆盖且,仅覆盖一个无效等价类,,重复,直至全部覆盖,避免无效测试,例:文件名,以字母为首的字母数字串,test case,:,9A*B,设变量,x1,和,x2,和函数,F,联系起来。,设,X1,x2,有以下边界以及边界内的区间:,a=x1=d,区间,a,b),b,c),c,d,e=x2=g,区间,e,f),(f,g,X1,x2,的无效值是,x1d,x2g.,1.1 弱一般等价类测试,弱一般等价类测试通过使用一个测试用例中的每个等价类的一个变量实现。,1.2 强一般等价类测试,强一般等价类测试基于多缺陷假设,1.3 弱健壮等价类测试,弱:单缺陷假设,健壮:考虑了无效值,1.4 强健壮等价类测试,强:多缺陷假设,健壮:考虑无效值,例(I),NextDate:月日年等价类,M1=1.12 M2=12,D1=1.31 D2=31,Y1=1912.2112 Y2=2112,有效类的数量等于独立变量个数,强弱一般等价类用例相同,用例,ID,月份,日期,年,预期输出,WN1,SN1,6,15,2012,2012,年,6,月,16,例(II),弱健壮等价类用例,用例,ID,月份,日期,年,预期输出,WR1,6,15,2012,2012,年,6,月,16,WR2,-1,15,2012,月份不在,WR3,13,15,2012,月份不在,WR4,6,-1,2012,日期不在,WR5,6,32,2012,日期不在,WR6,6,15,1911,年份不在,WR7,6,15,2113,年份不在,例(III),额外强健壮等价类用例,用例,ID,月份,日期,年,预期输出,SR1,-1,15,2012,月份不在,SR2,6,-1,2012,日期不在,SR3,13,15,1911,年份不在,SR4,-1,-1,2012,日期不在、月份不在,SR5,6,-1,1911,日期不在、年份不在,SR6,-1,15,1911,年份不在、月份不在,SR7,-1,-1,1911,年月日不在,例(IV),NextDate:月日年等价类,M1=每月有30天 M2=每月有31天 M3=2月,M4=12,D1=1.28 D2=29 D3=30 D4=31,D5=31,Y1=2000年 Y2=闰年 Y3=平年,Y4=2112,例(V),强一般等价类用例个数=3*4*3=36个(略),强健壮等价类用例个数=5*6*5=150个(略),用例,ID,月份,日期,年,预期输出,WN1,6,14,2000,2000,年,6,月,15,WN2,7,29,1996,1996,年,7,月,30,WN3,2,30,2002,不可能的日期,WN4,6,31,2000,不可能的输入日期,弱等价类测试用例,等价划分法的评价,选用,等价类,中,典型值,/,任意值,作为,test cases,没有选用某些高效率的测试方案,7.7.2 边界值分析(Boundary Value Analysis,BVA),处理边界情况最易出错,选择边界值作,test cases,,暴露,error,的可能性大,刚好等于等价类边界值,稍小于,稍大于,Bugs lurk in corners,and congregate at,boundaries ., Boris Beizer,边界值分析的规则,值的范围,x,a,b,a-1, a, b, b+1,值的个数,ab,a-1, a, b, b+1,输出等价类,sin,x,1,/2,0,0,-1,-,/2,有序集,1, n,0, n-1,错位,_,2,1,0,-1,2,【,例,】,string,integer,(,计算机字长,16,位,二进制补码表示,),合法输出等价类,-32768, 0),内的负整数,0,(0, 32767,内的正整数,非法输出等价类,32767,函数说明,Function strtoint(dstr:,shortstr,):integer;,参数类型说明,type,shortstr,= array 1.6 of char;,假设不考虑,PASCAL,编译程序可过滤的错误,-32769 ,错,!,下溢,32768 ,错,!,上溢,-32768 -32768,000000 0, 32767 32767,
展开阅读全文