《软件测试.Mod10.白盒测试方法(1).ppt》由会员分享,可在线阅读,更多相关《软件测试.Mod10.白盒测试方法(1).ppt(48页珍藏版)》请在三一办公上搜索。
1、白盒测试方法,为什么要进行白盒测试?,假设此时开发工作已结束,程序送交到测试组,没有人知道代码中有一个潜在的被 0 除的错误。若测试组采用的测试用例的执行路径没有同时经过x=0和y=5/x进行测试,显然测试工作似乎非常完善,测试用例覆盖了所有执行语句,也没有被 0 除的错误发生。,基本概念,白盒测试也称结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例,主要用于软件或程序验证。采用白盒测试方法必须遵循以下几条原则,才能达到测试的目的:保证一个模块中的所有独立路径至少被测试一次。所有逻辑值均需测试真(true)和假(false)两种情况。检查程序的内
2、部数据结构,保证其结构的有效性。在上下边界及可操作范围内运行所有循环。常用白盒测试方法:逻辑覆盖法和基本路径法,逻辑覆盖法,逻辑覆盖法,逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。这一方法要求测试人员对程序的逻辑结构有清楚的了解,甚至要能掌握源程序的所有细节。由于覆盖测试的目标不同,逻辑覆盖又可分为:语句覆盖判定覆盖条件覆盖判定/条件覆盖条件组合覆盖路径覆盖,语句覆盖,语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。这种覆盖又称为点覆盖,它使得程序中每个可执行语句都得到执行,但它是最弱的逻辑覆盖准,效果有限,必须与其它方法交互使用。,PROCEDUR
3、E Example(A,B:real;X:real);Begin IF(A1)AND(B=0)THEN X:=X/A;IF(A=2)OR(X1)THEN X:=X+1END;,I.A=2,B=0,X=4-sacbed,语句覆盖所有的语句至少执行一次!是最弱的逻辑覆盖,e,F,(A1)and(B=0),(A=2)or(X1),X=X/A,X=X+1,2,s,d,1,a,F,4,c,T,b,5,T,6,3,7,判定覆盖,判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即程序中的每个分支至少执行一次。判定覆盖又称为分支覆盖(Branch covera
4、ge)。判定覆盖只比语句覆盖稍强一些,实际效果表明,只是判定覆盖,还不能保证一定能查出在判断的条件中存在的错误。因此,还需要更强的逻辑覆盖准则去检验判断内部条件。,X=X/A,I:A=3,B=0,X=1:sacbd,II:A=2,B=1,X=1:sabed,满足判定覆盖的测试用例一定满足语句覆盖:判定覆盖比语句覆盖强。但仍是弱的逻辑覆盖。,(A1)and(B=0),(A=2)or(X1),X=X+1,2,s,d,1,a,F,4,c,T,b,5,T,e,F,3,7,满足判定覆盖,(A1)and(B=0)为一个判定A1 为一个条件,每个语句至少执行一次!每个判定的每种可能都至少执行一次!即每个判定
5、的真假分支都至少执行一次!,6,条件覆盖,条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。条件覆盖深入到判定中的每个条件,但可能不能满足判定覆盖的要求。,每个语句至少执行一次,而且判定表达式中的每个条件都要取得各种可能的结果。,第一判定表达式:设条件 A1 取真 记为T1 假 F1 条件 B=0 取真 记为T2 假 F2第二判定表达式:设条件 A=2 取真 记为T3 假 F3 条件 X1 取真 记为T4 假 F4,条件覆盖要求这8种值都要取到,e,F,(A1),(A1),(B=0),(B0),(A=2),(A2),(X1),(X1),:A=1,
6、B=1,X=1:sabd,:A=2,B=0,X=4:sacbed,同时满足判定覆盖,e,F,(A1),(A1),(B=0),(B0),(A=2),(A2),(X1),(X1),:A=1,B=1,X=2:sabed,:A=2,B=0,X=1:sacbed,不满足判定覆盖,F,判断-条件覆盖,条件覆盖不一定包含判定覆盖,判定覆盖也不一定包含条件覆盖既然判定条件不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖,就自然会提出一种能同时满足两种覆盖标准的逻辑覆盖,这就是判定-条件覆盖。判定条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断本身的所有可能判断结果至少
7、执行一次。换言之,即是要求各个判断的所有可能的条件取值组合至少执行一次。,条件组合覆盖,条件组合覆盖就是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次。这是一种相当强的覆盖准则,可以有效地检查各种可能的条件取值的组合是否正确。它不但可覆盖所有条件的可能取值的组合,还可覆盖所有判断的可取分支,但可能有的路径会遗漏掉。测试还不完全。,A1,B0A1,B0A1,B0A1,B0A2,X1A2,X1A2,X1A2,X1,选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次。,F,(A1),(A1),(B=0),(B0),(A=2),(A2),(X
8、1),(X1),I.A=2,B=0,X=4,II.A=2,B=1,X=1,III.A=1,B=0,X=2,IV.A=1,B=1,X=1,I:sacbedII:sabedIII:sabedIV:sabd,覆盖路径,满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。,F,4组测试数据可以使8种条件组合每种至少出现一次,显然,满足条件组合覆盖的测试用例,也一定满足判定覆盖、条件覆盖和判定/条件覆盖。所以,条件组合覆盖是前述几种覆盖中最强的。但满足条件组合覆盖的不一定能使程序中的每条路径都执行到,如sacbd。,路径覆盖,路径测试就是设计足够的测试用例,覆盖程序中所有可
9、能的路径。这是最强的覆盖准则。但在路径数目很大时,真正做到完全覆盖是很困难的,必须把覆盖路径数目压缩到一定限度。,路径覆盖是相当强的逻辑覆盖,它保证程序中每条可能的路径都至少执行一次,因此更具代表性,暴露错误的能力也比较强。但为了做到路径覆盖,只需考虑每个判定式的取值,并没有检验表达式中条件的各种可能组合。如果将路径覆盖和条件组合覆盖结合起来,可以设计出检错能力更强的测试数据。,条件3A1,B0 没有被覆盖,逻辑覆盖层次关系,课后作业,为以下流程图所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。,基本路径测试法,控制流图(CFG),控
10、制流图(可简称流图)是对程序流程图进行简化后得到的,它可以更加突出的表示程序控制流的结构。有向图节点和控制流线(边)复合条件分解判定节点区域,控制流图示例,圈复杂度(环形复杂度),圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。独立路径必须包含一条在定义之前不曾用到的边。有以下三种方法计算圈复杂度:流图中区域的数量对应于环型的复杂性;给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量;给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结
11、点的数量。,CFG/顺序结构,1,1.7,CFG/选择(1),1,2,4,6.7,1.4,F,T,CFG/选择(2),1,2,3,4,6.7,8.9,5,1.4,T,F,CFG/选择(3),1,4,3,14.15,5.7,1.4,2,5,8.10,11.13,01 int f(int a)02 03 int x;04 switch(a)05 case 0:06 x=0;07 break;08 case 1:09 x=1;10 break;11 otherwise:12 x=2;13 break;14 15 return x;16,CFG/循环(1),1,4,3,4,7,1.3,2,5.6,01
12、 int f(int a)02 03 int x=0,y=0;04 for(x=0;xa;x+)05 y=y+x;06 07 return y;08,CFG/循环(2),1,4,3,8.9,5.7,1.3,2,复合条件分解,如果判断中的条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的复合条件表达式,则需要改为一系列只有单条件的嵌套的判断。例如:1 if a or b 2 x 3 else 4 y对应的逻辑为:,独立路径,独立路径:至少沿一条新的边移动的路径,1,7,6,2,3,8,9,10,11,4,5,路径1:1-11路径2:1-2-3-4-5-10-1-11路径3
13、:1-2-3-6-8-9-10-1-11路径4:1-2-3-6-7-9-10-1-11,对以上路径的遍历,就是至少一次地执行了程序中的所有语句。,基本路径测试法,基本路径测试方法是在控制流图的基础上,通过分析控制结构的环形复杂度,导出执行路径的基本集,再从该基本集设计测试用例。基本路径测试方法包括以下4个步骤:(1)画出程序的控制流图。(2)计算程序的环形复杂度(圈复杂度),导出程序基本路径集中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。(3)导出基本路径集,确定程序的独立路径。(4)根据(3)中的独立路径,设计测试用例的输入数据和预期输出。,基本路径测
14、试法实例,有下面的C函数,用基本路径测试法进行测试 void Sort(int iRecordNum,int iType)int x=0;int y=0;while(iRecordNum-0)if(0=iType)x=y+2;break;else if(1=iType)x=y+10;else x=y+20;,第一步:画控制流图,画出其程序流程图和对应的控制流图如下,第二步:计算圈复杂度,对应上面图中的圈复杂度,计算如下:流图中有四个区域;V(G)=10条边-8结点+2=4;V(G)=3个判定结点+1=4。,第三步:导出独立路径,根据上面的计算方法,可得出四个独立的路径。(一条独立路径是指,和其
15、他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。V(G)值正好等于该程序的独立路径的条数。)路径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输入数据:iRecordNum0,或者取iRecordNum0的某一个值预期结果:x0路径2:4-6-7-14输入数据:iRecordNum1,iType0预期结果:x2路径3:4-6-8-10-13-4-14输入数据:iRecordNum1,iType1预期结果
16、:x10路径4:4-6-8-11-13-4-14输入数据:iRecordNum1,iType2预期结果:x20,void Sort(int iRecordNum,int iType)int x=0;int y=0;while(iRecordNum-0)if(0=iType)x=y+2;break;else if(1=iType)x=y+10;else x=y+20;,课后作业,使用基本路径测试方法,为以下程序段设计测试用例。void Do(int X,int A,int B)1 if(A1)5,循环测试方法,从本质上说,循环测试的目的就是检查循环结构的有效性。通常,循环可以划分为简单循环、嵌套
17、循环、串接循环和 非结构循环4类。(1)测试简单循环。设其循环的最大次数为n,可采用以下测试集:跳过整个循环;只循环一次;只循环两次;循环 m 次,其中mn;分别循环 n-1、n 和 n+1 次。,循环测试方法(续),(2)测试嵌套循环。如果将简单循环的测试方法用于嵌套循环,可能的测试次数会随嵌套层数成几何级数增加。此时可采用以下办法减少测试次数:测试从最内层循环开始,所有外层循环次数设置为最小值;对最内层循环按照简单循环的测试方法进行;由内向外进行下一个循环的测试,本层循环的所有外层循环仍取最小值,而由本层循环嵌套的循环取某些“典型”值;重复上一步的过程,直到测试完所有循环。(3)测试串接循
18、环。若串接的各个循环相互独立,则可分别采用简单循环的测试方法;否则采用嵌套循环的测试方法。(4)对于非结构循环这种情况,无法进行测试,需要按结构化程序设计的思想将程序结构化后,再进行测试。,Z路径覆盖下的循环测试方法,Z路径覆盖是路径覆盖的一种变体,它是将程序中的循环结构简化为选择结构的一种路径覆盖。循环简化的目的是限制循环的次数,无论循环的形式和循环体实际执行的次数,简化后的循环测试只考虑执行循环体一次和零次(不执行)两种情况,即考虑执行时进入循环体一次和跳过循环体这两种情况。,在循环简化的思路下,循环与判定分支的效果是一样的,即:循环要么执行、要么跳过。,其他补充用例方法,(1)通过非路经
19、分析得到测试用例 这种方法得到的测试用例是在应用系统本身的实践中提供的,基本上是测试人员凭工作经验的得到,甚至是猜测得到的。(2)寻找尚未测试过的路径并生成相应的测试用例 这种方法需要穷举被测程序的所有路径,并与前面已测试路径进行对比。(3)通过指定特定路径并生成相应的测试用例,课后阅读,教材第4章全部内容,提问时间,MajpjMVcyzj21HLfrvy96dv02lPPfYgxUS7IYmZkyEmZ0kGeYZS3bpLCkYH1lt4EK7CxmUX3ijoYSOer7ZuaVWYgz4EpZrUirVpMzzvNtf1XZw5oswSXOtFaejnOcmfE1lZgnN1RSXg8
20、wLCG8CVQ3XPJMvodPFWcpiYJgZazNSEPNIaklYSu7qSd1UpaxmZDlpN9zW7kljfsLCLi26Yv109ffbnDH8LbUN1G6ACURQ39eG12KHL9tXsZ1jzgoCK8g1kuNOh5eFvcmVT5ZYVQt9zk3rp3qLnf02FovEXxVRxjCcFRNppiJljNiOuk6fONnyX7fyGg7sXZ49BmCN5oy9VesHpKzdjTKwjrkCEQCFDehVmGax3lrOEbw63VscA3YSijtUKoCyiLzAlVRp7l4QgPNHxvJFFDyjUVN3oHlMah0XBd4uTbkfPI
21、hHtw0evPmYOrdhEDoPwvYhzlGplU1AU9mpyiCXH8gpPCBRYjq77VcnbXumNE1yGfyTsbSj89J63kRTKDkKUg3mdS5sJ4X5cQ8dK7oW9IkScssECQdz2O9UTlpRjAFPChjhLdzopQzwxQf8ozdzOhogwAooXpUF83BX4C3jRgjDJiiXEUDMaNz4vQ4n164vspddHvOIVuBBdMA4xp1YhiHk0vOJ8TL1BxogzVlMpmod6ianYGmksQq6NWCEd56hZF4wfaNyZcrGfNxnPiG6ZAxSkfmhJAKtNmCqbRmppeXp8inz4eq3HkWCMSORyMMX522xpHG6basNr6KQfbZsFbHjzyNlJrruLolKFcC84dqfijBO5Dy2NaBcNEBPgQrT12PgpcKx2or2YChN5DPjs80zzdtdAdTKuW4uVv9bbZu3K2SZ2aEhTlIC1UqrIWibkzwHh6p8gLv26zr01mJybfOzFc4T7kQH1IpPwOzMDnAKPLsLrznXGjFNIA9bSWWms6ibKZwQIKrMzalwbFrQJvOP1rPH8rx2KkyYqrtQk5VRwM1HSX,