1湖北科技学院软件测试实验报告课程名称软件测试方法与技术班级实验日期姓名学号实验成绩实验名称白盒测试实验实验目的与要求(1)掌握白盒测试技术,并能应用白盒测试技术设计测试用例(2)能用Junit实施测试实验环境主流PC机一套,需安装windows操作系统、Office、Eclipse和Junit实验内容题目一:用逻辑覆盖测试方法测试以下程序段voidDoWork(intx,inty,intz){1intk=0,j=0;2if((x3)&&(z10))3{4k=x*y-1;5j=sqrt(k);6}7if((x==4)||(y5))8j=x*y+10;9j=j%3;10}说明:程序段中每行开头的数字(1~10)是对每条语句的编号。(1)画出程序的控制流图(用题中给出的语句编号表示)。(2)分别以语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖方法设计测试用例,并写出每个测试用例的执行路径(用题中给出的语句编号表示)。题目二、折半查找请按要求对下面的java代码进行测试。代码的功能是:用折半查找法在2元素呈升序排列的数组中查找值为key的元素。publicintbinSearch(intarray[],intkey){intmid,low,high;low=0;high=array.length-1;while(low=high){mid=(lowhigh)/2;if(key==array[mid])returnmid;elseif(keyarray[mid])high=mid-1;elselow=mid1}return-1;}(1)试计算此程序段的McCabe复杂性;(2)用基本路径覆盖法给出测试路径;(3)为各测试路径设计测试用例。3测试用例描述及实验步骤(1)题目一程序的流程图如下:程序的控制流图如下:x3&&z10k=x*y-1x==4||y5x*y+10j=j%3j=sqrt(k)TFTF开始结束4语句覆盖的测试用例:语句覆盖是设计足够的测试用例使程序中的每一条可执行语句至少执行一次。这题中,两个if语句的判定之后,只要确保使两个判定都为真,那么所有的执行语句就都可以执行了,即可达到语句覆盖的要求。所以设计的测试用例如下:x=4,y=6,z=8。这组测试用例的执行路径是1—2—3—4—5—6—7—8—9—10判定覆盖的测试用例:判定覆盖要求程序中每个判断的取真分支和取假分支至少经历一次。这题中,有两个判定语句,至少需要设计两组测试用例,才能分别覆盖两个if语句的真分支和假分支。所以设计的测试用例如下:用例1:x=4,y=6,z=8,其执行路径是1—2—3—4—5—6—7—8—9—10;用例2:x=3,y=5,z=8,其执行路径是1—2—3—6—7—9—10。条件覆盖的测试用例条件覆盖要求每个判断中每个条件的可能取值至少要满足一次。这道题目中的条件有四个,分别如下:①x3;②z10;③x==4;④y5;设计用例时要使每个条件分别取真和取假。设计的测试用例如下表。567891012345测试用例编号测试数据覆盖条件执行路径1x=3,y=8,z=8①假②真③假④真1-2-3-6-7-8-9-102x=4,y=5,z=13①真②假③真④假1-2-3-6-7-8-9-10判定条件覆盖:判定/条件覆盖要求判断中每个条件的所有可能至少出现一次,并且每个判断本身的可能判定结果也至少出现一次。题目中的条件有四个,分别如下:①x3;②z10;③x==4;④y5;该程序中的分支有四个。所以设计的测试用例如下表所示:测试用例编号测试数据覆盖条件执行路径1x=4,y=8,z=8①真②真③真④真1-2-3-4-5-6-7-8-9-102x=3,y=5,z=13①假②假③假④假1-2-3-6-7-9-10条件组合覆盖:条件组合覆盖要求每个判定的所有可能条件取值组合至少执行一次。这道题目中共有四个条件分别如下:①x3;②z10;③x==4;④y5;设定x3为真时,记作T1;为假时,即x≤3,记作F1;z10为真时,记作T2;为假时,即z≤10,记作F2;x==4为真时,记作T3;为假时,即x≠4,记作F3;y5为真时,记作T4;为假时,即y≤5,记作F4。条件组合如下表:编号具体条件取值覆盖条件判定取值1x3,z10T1,T2第一个判定:取真分支2x3,z≤10T1,F2第一个判定:取假分支3x≤3,z10F1,T2第一个判定:取假分支4x≤3,z≤10F1,F2第一个判定:取假分支5x==4,y5T3,T4第二个判定:取真分支6x==4,y≤5T3,F4第二个判定:取真分支7x≠4,y5F3,T4第二个判定:取真分支8x≠4,y≤5F3,F4第二个判定:取假分支设计的测试用例如下:测试用例编号测试数据覆盖条件执行路径1x=4,y=8,z=8T1,T2,T3,T41-2-3-4-5-6-7-8-9-102x=4,y=3,z=13T1,F2,T3,F41-2-3-6-7-8-9-1063x=2,y=8,z=8F1,T2,F3,T41-2-3-6-7-8-9-104x=2,y=3,z=13F1,F2,F3,F41-2-3-6-7-9-10路径覆盖:路径覆盖要求覆盖程序中所有可能的路径。这道题中可能的执行路径共有4条,所以需要设计4个测试用例:测试用例编号测试数据执行路径1x=4,y=8,z=81-2-3-4-5-6-7-8-9-102x=4,y=3,z=131-2-3-6-7-8-9-103x=6,y=2,z=81-2-3-4-5-6-7-9-104x=2,y=3,z=131-2-3-6-7-9-10(2)题目二程序编号后如下:publicintbinSearch(intarray[],intkey){1.intmid,low,high;2.low=0;3.high=array.length-1;4.while(low=high){5.mid=(lowhigh)/2;6.if(key==array[mid])7.returnmid;8.elseif(keyarray[mid])9.high=mid-1;10.else11.low=mid+112.}13.return-1;14.}程序的流程图如下:7程序的控制流图如下:开始Low=0high=array.length-1low=highFTmid=(high+low)/2return-1结束Key==array[mid]TFreturnmidkeyarray[mid]FTlow=mid+1high=mid-18程序的环路复杂性即McCabe复杂性度量,简单的定义为控制流图的区域数。从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必需的最少测试用例数。通常环路复杂性可用以下三种方法求得。(1)通过控制流图的边数和节点数计算。设E为控制流图的边数,N为控制流图的节点数,则定义环路复杂性为V(G)=E–N+2;该图中共有16条边,14个节点,因此E=16,N=14,V(G)=E-N+2=16-14+2=4,程序的环路复杂性为4。(2)通过控制流图中判定节点数计算。若设P为控制流图中的判定节点数,则有V(G)=P+1该图中有3个判定节点,因此其环路复杂性为V(G)=P+1=3+1=4,所以该程序的环路复杂性为4。(3)将环路复杂性定义为控制流图中的区域数。该控制流图中有4个区域:R1、R2、R3、R4,因此其环路复杂性为4。通过程序的控制流图导出基本路径集,列出程序的独立路径。1234567813149101112R1R2R4R39PATH1:1-2-3-4-13-14PATH2:1-2-3-4-5-6-7-12-4-13-14PATH3:1-2-3-4-5-6-8-9-12-4-13-14PATH4:1-2-3-4-5-6-8-10-11-12-4-13-14根据程序结构和程序环路复杂性设计用例输入数据和预期结果,确保基本路径集中的每一条路径的执行。用例编号路径输入数据预期输出1path1:1-2-3-4-13-14array[0]={};key=1-12path2:1-2-3-4-5-6-7-12-4-13-14array[3]={2,4,6};key=413path3:1-2-3-4-5-6-8-9-12-4-13-14array[4]={2,4,6,8};key=204path4:1-2-3-4-5-6-8-10-11-12-4-13-14array[4]={2,4,6,8};key=62调试过程及实验结果实验过程中由于初次使用junit测试工具,在测试过程中对测试方法存在部分问题,已经得到了解决。本次实验结果基本上与预期结果一致。总结白盒测试并不是简单地按照代码设计测试用例,而是需要根据不同的测试需求,结合不同的测试对象,使用合适的方法进行测试。同时白盒测试与程序内部结构相关,因此也称为结构测试或逻辑驱动测试。而在进行白盒测试时,测试者必须检查程序的内部结构,从程序的逻辑结构着手,得出测试数据。因此测试者需要了解程序结构的实现细节等知识,才能有效进行测试用例的设计工作。附录1.源程序:packagegy.test2;publicclassDoWork{publicDoWork(intx,inty,intz){10intk=0,j=0;if((x3)&&(z10)){k=x*y-1;j=(int)Math.sqrt(k);}if((x==4)||(y5))j=x*y+10;j=j%3;}publicbooleandoWork(intx,inty,intz){returntrue;}}测试程序:(1)packagegy.test2;importjunit.framework.*;importorg.junit.Test;publicclassDoWorkTest1extendsTestCase{privatestaticintx,y,z;privatestaticDoWorkdowork=newDoWork(x,y,z);publicvoidsetUp()throwsException{}@TestpublicvoidtestDoWork(){assertEquals(true,dowork.doWork(4,8,8));}}(2)packagegy.test2;importstaticorg.junit.Assert.*;11importorg.junit.Test;publicclassDoWorkTest2{privatestaticintx,y,z;privatestaticDoWorkdowork=newDoWork(x,y,z);publicvoidsetUp()throwsException{}@TestpublicvoidtestDoWork(){assertEquals(true,dowork.doWork(4,3,13));}}(3)packagegy.test2;importstaticorg.junit.Assert.*;importorg.junit.Test;publicclassDoWorkTest3{privatestaticintx,y,z;privatestaticDoWorkdowork=newDoWork(x,y,z);publicvoidsetUp()throwsException{}@TestpublicvoidtestDoWork(){assertEquals(true,dowork.doWork(6,2,8));}}12(4)packagegy.test2;importstaticorg.junit.Assert.*;importorg.junit.Test;publicclassDoWorkTest4{privatestaticintx,y,z;privatestaticDoWorkdowork=newDoWo