5 软件测试:白盒测试方法_第1页
5 软件测试:白盒测试方法_第2页
5 软件测试:白盒测试方法_第3页
5 软件测试:白盒测试方法_第4页
5 软件测试:白盒测试方法_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

1、 软件测试方法白盒测试方法(基于结构)本章教学要点n教学目标:n通过本章学习,掌握白盒测试方法,并能应用到单元测试中去。n教学重点与难点:n控制流图的绘制方法n根据指定的覆盖率要求设计出相应的单元测试用例n白盒测试的各种覆盖标准及彼此间的关系目录 白盒测试概述1控制流测试方法43数据流测试方法程序控制流图白盒测试n白盒测试技术,又叫做结构化测试技术或者基于结构的测试技术,通常意义上被认为是基于代码的测试技术。n白盒测试技术是通过分析组件/系统的内部结构来产生、选择测试用例技术。n白盒测试依据:源代码、详细设计文档或函数说明,以此作为测试设计输入。白盒测试方法n控制流测试:n逻辑覆盖:以程序内部

2、逻辑结构为基础,结合控制流图,对程序进行覆盖,分为语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖、路径覆盖等n循环的路径测试:针对带循环的程序,分析程序控制流的环路复杂性,导出测试路径集合,从而设计测试用例。包括:主路径测试、独立路径测试等。n通过控制流图的建模分析过程,可以发现一些程序问题,属于静态测试过程。n数据流测试:n从定义到使用的程序路径上检查数据的分法,包括:所有定义覆盖、所有使用覆盖等、所有定义使用对覆盖等。白盒测试设计过程nStep1:n源代码转换为流图。描述程序的控制流或数据流。nStep2:n分析程序流图,选择合适的测试覆盖标准;nStep3:n确定测试数据,生

3、成测试用例;模型覆盖填充数据Step1Step2Step3测试对象建模X0 and Y10X-10 or Y0Y=Y/XY=-(Y+X)TTFFabcde返回Y目录 白盒测试概述1控制流测试方法43数据流测试方法程序控制流图控制流图CFGn控制流图是一个带有开始和结束节点的有向图n控制流图由节点、边、区域组成n程序语句通过节点来表示n语句之间分支路径是通过边(控制流)来表示n没有分支语句序列用一个节点来表示n图内开始和结束节点可省略分支语句是关键if (xy) y=0; X= x+1;y=0;X= x+1;if (x0 and b0) thenc=c/aEnd ifIf (a1 or c1)

4、thenc= c+1End ifC = b+c书上P32页12354ABCDEFa0 and b0c=c/ac= c+1a1 or c1abcdeFFTTc=b+c练习:控制流图(选择结构)q=1;b=2;c=3;if (a=2) x=x+2;else x=x/2;p = q/r;if (b/c 3) z=x+y;控制流图:条件拆分a0 and b0c=c/aFTb0c=c/aFTa0TF12312430 0 130 1 131 0 131 1 12a b 路径路径0 0 140 1 141 0 1241 1 1234a b 路径路径如果仅仅考虑路径覆盖,转换后不等价,如果加上条件组合后则可以

5、等价等价吗?控制流图:循环结构 #include main() n char s80; n int i=0; n scanf(%s,s); n while( si!=0) n if(si = 97)nsi=si-32; i+; n n puts(s); 45761-38-9控制流图:循环结构(2)nwhile(true) nif(i=12) n i+; n continue; n nif(i=20) n break; nn 1253-49687程序可能有2个出口练习:控制流图(循环结构)getit (int m)nn int i, k;nk = sqrt(m);nfor (i =2; i =k

6、+1)n printf(%d is a selected numbern, m);nelsen printf(%d is not a selected numbern, m);10436759目录 白盒测试概述1控制流测试方法43数据流测试方法程序控制流图覆盖标准覆盖类型覆盖标准语句覆盖每个可执行语句至少被执行一次判定覆盖每个判定的真/假分支至少被执行一次条件覆盖每个判定的每个内部条件的真值和假值至少被执行一次判定-条件覆盖每个判定的真假分支至少被执行一次每个判定的内部条件真假值至少被执行一次条件组合每个判定的的内部条件的各种真假组合可能至少被执行一次路径覆盖所有可能执行路径至少执行一次独立路

7、径覆盖所有独立路径至少执行一次示例:认识语句/判定/条件/路径a0 and b0c=c/ac= c+1a1 or c1abcdeFFTTc=b+c12354ABCDEF假如判定有3个条件、3个选择呢?图覆盖逻辑覆盖语句节点判定边谓词条件子句路径路径n语句覆盖(Statement Coverage):设计若干个测试用例,程序每个可执行语句至少被执行一次。在保证完成要求的情况下,测试用例的数目越少越好。语句覆盖至少需要设计多少个测试用例? (图覆盖的节点覆盖)n语句覆盖虽然测试了程序中每一个语句行。n语句覆盖测试是最弱的逻辑覆盖方法。n假如第一个判断的逻辑运算符“&”错误写成“|”,程序仍按路径a

8、ce执行。n假如第二个判断的c1误写成c0、甚至第二个判断遗漏了,该错误不能被发现。语句覆盖测试用例a,b,ca0 and b0a1 or c1执行路径12,1,6TrueTrue1-2-3-4-5n判定覆盖(Branch Coverage)是指设计若干个测试用例,执行被测试程序时,程序每个判定的真值分支和假值分支至少被执行一遍。在保证完成要求的情况下,测试用例的数目越少越好。 判定覆盖至少需要设计多少个测试用例? (图覆盖的边覆盖)(逻辑覆盖的谓词覆盖)测试用例a,b,ca0 and b0a1 or c1执行路径12,1,6TrueTrue1-2-42-2,1,-6Falsefalse1-3

9、-5n在满足判定覆盖的同时,还完成了语句覆盖,因此判定覆盖要比语句覆盖更强一些。n但是,假如程序段中的第二个判定的c1误写成c0,该错误不能被发现。判定覆盖n条件覆盖(Condition Coverage)指设计若干个测试用例,执行被测试程序时,程序中每个判定的每个内部条件的真值和假值至少被执行一次。条件覆盖至少需要设计多少个测试用例? (逻辑覆盖的子句覆盖)n第一个判定( a0 and b0 )各种条件取值的情况:na0为true,记为T1;na0为true,记为T2;nb1 or c1 ) 各种条件取值的情况:na1为true,记为T3;na1为true,记为T4;nc0 and b0a1

10、 or c1执行路径12, -1, 2T1,F2,T3,F4FalseTrue1-3-42-1,2,3F1,T2,F3,T4FalseTrue1-3-4条件覆盖n判断/条件覆盖是指设计若干个测试用例,执行被测试程序时,程序中每个判定的真假分支至少被执行一遍,并且每个判定的内部条件的真假值也要被执行一遍。判定-条件覆盖至少需要设计多少个测试用例? (逻辑覆盖的谓词&子句覆盖)n满足了判断覆盖和条件覆盖,但是没有对每个判断条件的内部判断式的所有真假值组合进行测试。n对于C=A & B中,如果A为假值,那么C就为假值,B的正确与否未测试到。测试用例a,b,c覆盖条件a0 and b0a1 or c1

11、执行路径12,1,6T1,T2,T3,T4TrueTrue1-2-42-1,-2,-3F1,F2,F3,F4FalseFalse1-3-5判定-条件覆盖n条件组合覆盖是指设计若干个测试用例,执行被测试程序时,程序中每个判定的内部条件的各种真假组合可能都至少被执行一遍。 条件组合覆盖至少需要设计多少个测试用例? (逻辑覆盖的完全子句覆盖)n每个判定各包含有两个条件,有8种可能的条件组合:(5) a1, c1, 记为(T3,T4)(6) a1,c=1, 记为(T3,F4)(7) a1, 记为(F3,T4)(8) a=1,c0, b0, 记为(T1,T2)(2) a0, b=0, 记为(T1,F2)

12、(3) a0, 记为(F1,T2)(4) a=0,b0 and b0a1 or c1执行路径12,1,61=(T1,T2), 5=(T3,T4)TrueTrue1-2-422,-1,-22=(T1,F2), 6=(T3,F4)FalseTrue1-3-43-1,2,33=(F1,T2), 7=(F3,T4)FalseTrue1-3-44-1,-2,-34=(F1,F2), 8=(F3,F4)FalseFalse1-3-5 条件组合覆盖思考:是不是所有的条件组合是必须的?MCDC方法nMCDC(Modified Condition Decision Coverage)A B C000001010

13、100011101110111引起判定结果的条件有多个,具有不确定性每个判定条件的取值对结果起作用(逻辑覆盖的完全子句覆盖)对于N个条件,只需要N+1个组合,非2n个组合 精简后条件组合测试用例a, b, c覆盖条件组合a0 and b0a1 or c1执行路径11,1,-11=(T1,T2), 8=(F3,F4)TrueFalse1-2-522,-1,-22=(T1,F2), 6=(T3,F4)FalseTrue1-3-43-1,2,33=(F1,T2), 7=(F3,T4)FalseTrue1-3-4(1) a0, b0, 记为T1,T2;(2) a0, b=0, 记为T1,F2;(3)

14、a0, 记为F1,T2;(4) a=0,b1, c1, 记为T3,T4;(6) a1,c=1, 记为T3,F4;(7) a1, 记为F3,T4;(8) a=1,c0 and b0)写成a0,影响结果吗?路径覆盖的覆盖率是最高吗?全覆盖: 路径+条件组合测试用例a, b, c覆盖条件组合覆盖路径12,1,61=(T1,T2), 5=(T3,T4)1-2-451,1,-31=(T1,T2), 8=(F3,F4)1-2-522,-1,-22=(T1,F2), 6=(T3,F4)1-3-43-1,2,33=(F1,T2), 7=(F3,T4)1-3-44-1,-2,-34=(F1,F2), 8=(F3

15、,F4)1-3-5练习1语句覆盖至少需要几个用例?判定覆盖至少需要几个用例?条件组合覆盖至少需要几个用例?路径覆盖至少需要几个用例?If (A1 & B=0) then X=X/AIf (A2| X1) then X=X+1练习2X0 and Y10X-10 or Y0Y=Y/XY=-(Y+X)TTFFabcde返回Y值书上第3章后的第6题(P63页):用最少的测试用例完成覆盖要求:路径覆盖+条件组合覆盖 测试用例输入:X,Y输出: Y执行路径覆盖条件组合11,1111acd(T,F)T1,T2; F3,F421,-21abe(F,T)T1,F2; F3,T43-20,416abe(F,T)F

16、1,F2; T3,F44-1,1111abd(F,F)F1,T2; F3,F45-11,-112abe(F,T)F1,F2; T3,T4ace路径无法覆盖到 三角形案例:白盒测试public int WhichTypeTriangle(int x, int y, int z) int iType =0;nif ( x=0 | y=0 | z=0 )niType = -1;nelse if (x+y=z) | (y+z=x) | (x+z=y)niType = 4;nelse if (x= y & y=z)niType = 3;nelse if (x= y | y=z | x=z)niType

17、=2;nelseniType =1;return iType; 请设计测试用例以满足:路径覆盖+MCDC覆盖 11123456789105条路径序号测试条件测试条件组合1( x=0 | y=0 | z=0 )11=(T,F,F) 12=(F,T,F)13=(F,F,T) 14=(F,F,F)3(x+y=z) | (y+z=x) | (x+z=y)31=(T,F,F) 32=(F,T,F)33=(F,F,T) 34=(F,F,F)5(x=y & y=z)51=(T,F) 52=(F,T)53=(T,T)7(x=y | y=z | x=z)71=(T,F,F) 72=(F,T,F)73=(F,F,

18、T) 74=(F,F,F)1和3 可以进一步拆分条件三角形案例:白盒测试序号测试条件测试条件组合1(x0 | y0 | z0 | x=0 | y=0 | z=0)11=(T,F,F,F,F,F) 12=(F,T,F,F,F,F)13=(F,F,T,F,F,F) 14=(F,F,F,T,F,F)15=(F,F,F,F,T,F) 16=(F,F,F,F,F,T)17=(F,F,F,F,F,F)3(x+yz) | (x+zy) | (y+z0)if(itype=0)break;elseif(itype=1)x=x+10;elsey=y+20;示例:独立路径测试n第一步:画出控制流图:n图中每一个圆称

19、做流图的结点,代表一条或多条语句。流图中的箭头称作边或连接,代表控制流。示例:独立路径测试n第二步:求出程序圈复杂度n根据程序圈复杂度的计算公式,求程序路径集合中的基本路径数目。n公式1:V(G)=10-8+2,其中10是控制流图G中边的数量,8是控制流图中节点的数目(边数节点数+2)n公式2:V(G)=3+1,其中3是控制流图G中判断节点的数目。(判定节点数+1)n公式3:V(G)=3+1,其中3是控制流图G中封闭区域的数目。(封闭区域数+1)n控制流图G的圈复杂度是4。也即:至少需要4条独立路径。示例:独立路径测试n第三步:导出测试路径n可得出程序的基本路径集中有4条独立路径:n路径1:4

20、-14n路径2:4-6-7-14n路径3:4-6-9-10-13-4-14n路径4:4-6-9-12-13-4-14示例:独立路径测试n第四步:设计测试用例n根据第三步中的独立路径,设计输入数据和预期输出。测试用例输入数据预期输出Test Case 1Irecordnum=0Itype=0 x=0y=0Test Case 2Irecordnum=1Itype=0 x=0y=0Test Case 3Irecordnum=1Itype=1x=10y=0Test Case 4Irecordnum=1Itype=2x=0y=20示例:独立路径测试main () int num1=0, num2=0,

21、score=100; int i; char str; scanf (“%d, %cn”, &i, &str);n while (i365) if (DateTime.IsLeapYear(year) if (days 366) days -= 365; year +=1; else days -= 365; year +=1; 案例: 帮微软捉虫问题出在哪里? DateTime.IsLeapYear(year)days365Days 366 设计测试数据:365,2008366,2008367,2008366,2009死循环!目录 白盒测试概述1控制流测试方法43数据流测试方法程序控制流图看

22、一个程序nint x,y; nfloat z;nscanf(%d,%d,&x,&y);nz=0;nif (x != 0)n z=z+y;nelsen z=z-y;nif (y!=0)n z=z/x;nelsen z=z * x;nprintf(“%d,%dn,z);1-45689101213这个程序有什么BUG?数据流基本概念n定义def:一个在内存中存储变量值的程序位置n使用use:一个变量被访问的程序位置n定义使用对du-pair:定义-使用对n定义使用路径du-path: 从定义到使用的一条路径名词术语测试的覆盖标准:看一个变量的def能否到达一个特定的use数据流的def和usen变量

23、x的一个def可能会在如下情况发生:nx出现在一个赋值语句的左边nx是一个程序的输入nX是一个方法的形参n变量x的一个use可能会在如下情况发生:nx出现在一个赋值语句的右边nx是一个程序的输出nX是一个方法的实际参数示例:数据流的def和usenint x,y; nfloat z;nscanf(%d,%d,&x,&y);nz=0;nif (x != 0)n z=z + y;nelsen z=z - y;nif (y != 0)n z=z / x;nelsen z=z * x;nprintf(“%d,%dn,z);节点defuse3x,y4z5x6zz,y8zz,y9y10zz,x12zz,x

24、13z示例:数据流的du-pair变量节点du-pairx3(3,5), (3,10), (3,12)y3(3,6), (3,8), (3,9)z4(4,6), (4,8), (4,10), (4,12), (4,13)6(6,10), (6,12), (6,13)8(8,10), (8,12), (8,13)10(10,13)12(12,13)45689101213def=zuse=xdef=zuse=z,ydef=zuse=z,ydef=zuse=z,xdef=zuse=z,xuse=yuse=z3def=x,y示例:数据流的du-pathdu-pathx33,4,5,8,9,10,3,4

25、,5,6,9,103,4,5,8,9,12,3,4,5,6,9,12, 3,4,5y33,4,5,6,3,4,5,8,3,4,5,6,9,3,4,5,8,9z44,5,6, 4,5,8,4,5,8,9,10,4,5,6,9,10,4,5,8,9,12,4,5,6,9,124,5,8,9,10,13,4,5,6,9,10,13,4,5,8,9,12,13,4,5,6,9,12,13z66,9,10, 6,9,12, 6,9,10,13, 6,9,12,13z88,9,10, 8,9,12, 8,9,10,13, 8,9,12,13z1010,13z1212,1345689101213def=zu

26、se=xdef=zuse=z,ydef=zuse=z,ydef=zuse=z,xdef=zuse=z,xuse=yuse=z3def=x,y数据流测试的覆盖标准n所有定义对All-defs: 每个def至少到达一个usen所有定义使用对All-uses: 每个def到达所有可能usen所有定义使用对All-paths: 每个def通过所有可能path到达所有可能useAll-pathsAll-usesAll-defs测试覆盖:所有定义对All-defscase x,yz覆盖def11,11.03,4,6,1020,00.03,4,8,1245689101213def=zuse=xdef=zus

27、e=z,ydef=zuse=z,ydef=zuse=z,xdef=zuse=z,xuse=yuse=z3def=x,y要求:所有定义对All-defs: 每个def至少到达一个use测试覆盖:所有定义对All-usescase x,yz覆盖def覆盖du-pair11,11.03,4,6,10(3,5), (3,6),(3,9),(3,10) (4,6),(4,10),(6,10),(6,13),(10,13)20,00.03,4,8,12(3,5), (3,8), (3,9), (3,12), (4,8), (4,12),(8,12) ,(8,13), (12,13)31,00.03,4,6,12(3,5), (3,6), (3,9) ), (3,12)(4,6),(4,12),(6,12),(6,13),(12,13)40,1?3,4,8,10(3,5), (3,8), (3,9), (3,10)(4,8), (4,10),(8,10),(8,13), (10,13)要求:所有定义对All-defs: 每个def到达所有use4568

温馨提示

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

评论

0/150

提交评论