软件测试技术主讲人:刘伟第3章白盒测试白盒测试(WhiteBoxTesting)结构测试(StructuredTesting)逻辑驱动测试(Logic-DrivenTesting)基于程序的测试(Code-BasedTesting)基于覆盖的测试软件测试人员可以访问程序员的代码,并通过检查代码来测试,可以看到盒子里面。第3章白盒测试控制流测试数据流测试程序插桩程序变异测试白盒测试工具软件缺陷分析控制流测试基本概念控制流图有向图路径、完整路径可达、简单路径、基本路径、子路径回路、无回路路径A连接B路径A覆盖路径B控制流覆盖准则覆盖率:测试的完全程度如何?逻辑覆盖(白盒)功能覆盖(黑盒)评测测试过程中已经执行的代码的多少。代码覆盖可以建立在控制流(语句、分支或路径)或数据流的基础上。评测多次,提供测试覆盖的标识(如已计划的、已实施的、已执行的和成功的测试覆盖)。覆盖率概念如:一个程序总代码为100行,使用测试用例运行一次,执行了75行代码,则代码覆盖率=75%的总数数至少被执行一次的覆盖率=itemitem控制流覆盖准则逻辑覆盖:常见的六种覆盖方法语句覆盖判定覆盖(也称分支覆盖)条件覆盖(也称谓词覆盖)判定/条件覆盖条件组合覆盖路径覆盖语句覆盖设计若干测试用例,使得程序中每条语句至少被执行一次。可执行的语句数量数量至少被执行一次的语句语句覆盖率=设计原则:测试用例尽量少,覆盖率尽量高举例测试用例设计:Scanf(“%d”,&x)X!=0Y=1Y=2YN(O)(A)(B)(D)红色字母代表程序执行路径OBD02OAD51路径X开始结束X=80andY=801-TYESX+Y=140and(x=90ory=90)2-T3-TYESNONOOEABCDOBDE50502OBCE70903OAE90901路径YX测试用例设计:例3-2测试用例设计:abcmid路径12531012821210013483421-1201358开始Floata,b,c,x1,x2,mid;Scanf(“%f,%f,%f”,&a,&b,&c);a!=0mid=b*b-4*a*c;mid0x1=(-b+sqrt(mid))/(2*a);x2=(-b-sqrt(mid))/(2*a);printf(“tworealroots\n”);mid==0结束YNYNx1=-b/(2*a);printf(“onerealroot\n”);x1=-b/(2*a);x2=sqrt(-mid)/(2*a);printf(“twocomplexroots\n”);printf(“x1=%f,x2=%f\n”,x1,x2);YN(0)(1)(9)(2)(3)(4)(5)(8)n0n6n5n4n3n2n1e0e1e2e3e4e5e6e7e8e9e10语句覆盖优点:直观、简单、易自动化缺点:发现错误能力很“弱”对隐藏的条件和可能到达的隐式逻辑分支,无法测试语句覆盖例:if-else结构如右例所示:当A=2B=0X=3时,满足语句覆盖要求,但abd分支未测试。控制流覆盖准则逻辑覆盖:常见的六种覆盖方法语句覆盖判定覆盖(也称分支覆盖)条件覆盖(也称谓词覆盖)判定/条件覆盖条件组合覆盖路径覆盖判定覆盖设计若干测试用例,使得程序中每个判定至少有一次为真值,有一次为假值判定结果的总数判定结果被评价的次数判定覆盖率=程序中的每个分支至少执行一次判定覆盖Scanf(“%d”,&x)X!=0Y=1Y=2YN测试用例设计:OBD02OAD51路径X(O)(A)(B)(D)当A=2B=0X=3时,即可满足语句覆盖要求,但abd分支未测试判定覆盖测试用例设计:判定覆盖ABD0002ACE3021执行路径XBAA1ANDB=0A=2ORX1X=X+1X=X/AYNYN(A)(B)(C)(D)(E)开始结束X=80andY=801-TYESX+Y=140and(x=90ory=90)2-T3-TYESNONOOEABCD测试用例设计:XY路径19090OAE29030OBDE39070OBCE例3-2测试用例设计:abcmid路径12531012821210013483421-1201358402109开始Floata,b,c,x1,x2,mid;Scanf(“%f,%f,%f”,&a,&b,&c);a!=0mid=b*b-4*a*c;mid0x1=(-b+sqrt(mid))/(2*a);x2=(-b-sqrt(mid))/(2*a);printf(“tworealroots\n”);mid==0结束YNYNx1=-b/(2*a);printf(“onerealroot\n”);x1=-b/(2*a);x2=sqrt(-mid)/(2*a);printf(“twocomplexroots\n”);printf(“x1=%f,x2=%f\n”,x1,x2);YN(0)(1)(9)(2)(3)(4)(5)(8)n0n6n5n4n3n2n1e0e1e2e3e4e5e6e7e8e9e10判定覆盖优点:发现错误能力比语句覆盖强缺点:对复合条件判断,只判定整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。控制流覆盖准则逻辑覆盖:常见的六种覆盖方法语句覆盖判定覆盖(也称分支覆盖)条件覆盖(也称谓词覆盖)判定/条件覆盖条件组合覆盖路径覆盖条件覆盖设计若干测试用例,使得判定中的每个条件的可能取值至少满足一次。条件操作数值的总数价一次的数量条件操作数值至少被评条件覆盖率=条件覆盖Scanf(“%d”,&x)X!=0Y=1Y=2YN测试用例设计:OBD02OAD51路径X(O)(A)(B)(D)判定覆盖测试用例设计未有B!=0的取值条件覆盖ABD0002ACE3021执行路径XBA条件覆盖测试用例设计:ABD0102ACE3021执行路径XBAA1ANDB=0A=2ORX1X=X+1X=X/AYNYN(A)(B)(C)(D)(E)开始结束X=80andY=801-TYESX+Y=140and(x=90ory=90)2-T3-TYESNONOOEABCD测试用例设计:XY路径14090OBDE29070OBCE例3-2测试用例设计:开始Floata,b,c,x1,x2,mid;Scanf(“%f,%f,%f”,&a,&b,&c);a!=0mid=b*b-4*a*c;mid0x1=(-b+sqrt(mid))/(2*a);x2=(-b-sqrt(mid))/(2*a);printf(“tworealroots\n”);mid==0结束YNYNx1=-b/(2*a);printf(“onerealroot\n”);x1=-b/(2*a);x2=sqrt(-mid)/(2*a);printf(“twocomplexroots\n”);printf(“x1=%f,x2=%f\n”,x1,x2);YN(0)(1)(9)(2)(3)(4)(5)(8)n0n6n5n4n3n2n1e0e1e2e3e4e5e6e7e8e9e10abcmid路径12531012821210013483421-1201358402109例3-41、列出所有的原子条件:i=0j=0k=0i+j=ki+k=jj+k=Ii==ji==kj==k2、设计测试用例,使得每个条件取一次真值和一次假值ijki=0j=0k=0i+j=ki+k=jj+k=Ii==ji==kj==k1-122TFFTTF---22-12FTFTFT---322-1FFTFTT---4223FFFFFFTFF5232FFFFFFFTF6322FFFFFFFFT例3-4设计测试用例如下表所示条件覆盖优点:发现错误能力比语句覆盖强缺点:条件覆盖并不能保证判定覆盖。对复合条件,条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。控制流覆盖准则逻辑覆盖:常见的六种覆盖方法语句覆盖判定覆盖(也称分支覆盖)条件覆盖(也称谓词覆盖)判定/条件覆盖条件组合覆盖路径覆盖判定条件覆盖设计若干测试用例,使得判定中的每个条件的可能取值至少出现一次,且每个判断本身的判定结果也至少出现一次。判定结果总数条件操作数值的总数+至少被评价一次的数量果条件操作数值或判定结判定条件覆盖率=判定条件覆盖Scanf(“%d”,&x)X!=0Y=1Y=2YN测试用例设计:OBD02OAD51路径X(O)(A)(B)(D)判定条件覆盖条件覆盖测试用例设计也满足判定条件覆盖的要求:ABD0102ACE3021执行路径XBA判定覆盖测试用例设计未有B!=0的取值ABD0002ACE3021执行路径XBAA1ANDB=0A=2ORX1X=X+1X=X/AYNYN(A)(B)(C)(D)(E)开始结束X=80andY=801-TYESX+Y=140and(x=90ory=90)2-T3-TYESNONOOEABCD测试用例设计:XY路径19090OAE25050OBDE39070OBCE47090OBCE例3-2测试用例设计:开始Floata,b,c,x1,x2,mid;Scanf(“%f,%f,%f”,&a,&b,&c);a!=0mid=b*b-4*a*c;mid0x1=(-b+sqrt(mid))/(2*a);x2=(-b-sqrt(mid))/(2*a);printf(“tworealroots\n”);mid==0结束YNYNx1=-b/(2*a);printf(“onerealroot\n”);x1=-b/(2*a);x2=sqrt(-mid)/(2*a);printf(“twocomplexroots\n”);printf(“x1=%f,x2=%f\n”,x1,x2);YN(0)(1)(9)(2)(3)(4)(5)(8)n0n6n5n4n3n2n1e0e1e2e3e4e5e6e7e8e9e10abcmid路径12531012821210013483421-1201358402109例3-41、列出所有的原子条件:i=0j=0k=0i+j=ki+k=jj+k=ii==ji==kj==k2、列出所有的判定(1)i=0||j=0||k=0||i+j=k||i+k=j||j+k=i(2)i==j&&i==k&&j==k(3)i==j||i==k||j==k3、设计测试用例,使得每个条件取一次真值和一次假值且使得每个判定取一次真值和一次假值。ijki=0j=0k=0i+j=ki+k=jj+k=ii==ji==kj==k1231-122TFFTTF---T--22-12FTFTFT---T--322-1FFTFTT---T--4223FFFFFFTFFFFT5232FFFFFFFTFFFT6322FFFFFFFFTFFT7222FFFFFFTTTFTT8534FFFFFFFFFFFF设计测试用例如下表所示:判定条件覆盖优点:发现错误能力比判定覆盖和条件覆盖强缺点:不能保证覆盖程序所有执行路径控制流覆盖准则逻辑覆盖:常见的六种覆盖方法语句覆盖判定覆盖(也称分支覆盖)条件覆盖(也称谓词覆盖)判定/条件覆盖条件组合覆盖路径覆盖条件组合覆盖设计若干测试用例,使得每个判定中条件结果的所有可能组合至少出现一次数条件操作数值的总组合组合的数量条件操作数值结果条件组合覆盖率=条件组合覆盖Scanf(“%d”,&x)X!=0Y=1Y=2YN测试用例设计:OBD02OAD51路径X(O)(A)(B)(D)条件组合覆盖测试用例设计:A1ANDB=0A=2ORX1X=X+1X=X/AYNYN(A)(B)(C)(D)(E)ABXA1B=0A=2X11203TTTT2210TFTF3013FTFT4010FFFF开始结束X=80andY=801-TYESX+Y=140and(x=90ory=90)2-T