基本路径测试上面的例子是一个很简单的程序函数,只有四条路径.但在实践中,一个不太复杂的程序,其路径都是一个庞大的数字,要在测试中覆盖所有的路径是不现实的.为了解决这一难题,只得把覆盖的路径数压缩到一定限度内,例如,程序中的循环体只执行一次.下面介绍的基本路径测试就是这样一种测试方法,它在程序控制流图的基础上,通过分析控制流图的环形复杂性,导出基本可执行路径集合,从而设计测试用例的方法.设计出的测试用例要保证在测试中程序的每一个可执行语句至少执行一次.白盒测试的基本概念为了清晰描述这种白盒测试方法,需要首先对有关白盒测试的几个基本概念进行说明:流图环形复杂度图矩阵1、流图在程序设计时,为了更加突出控制流的结构,可对程序流程图进行简化,简化后的图称为控制流图.简化后所涉及的图形符号只有两种,即节点和控制流线.132512435abcdef节点——标有编号的圆圈程序流程图中矩形框所表示的处理菱形表示的两个甚至多个出口判断多条流线相交的汇合点边——由带箭头的弧或线表示与程序流程图中的流线一致,表明了控制的顺序它代表程序中的控制流。控制流线通常标有名字常见语句的控制流图顺序语句While语句dowhile语句If语句Case语句包含条件的节点被称为判断节点(也叫谓词节点),由判断节点发出的边必须终止于某一个节点,由边和节点所限定的范围被称为区域。这里我们假定在流程图中用菱形框表示的判定条件内没有复合条件,而一组顺序处理框可以映射为一个单一的结点。控制流图中的箭头(边)表示了控制流的方向,类似于流程图中的流线,一条边必须终止于一个结点。在选择或者是多分支结构中分支的汇聚处,即使汇聚处没有执行语句也应该添加一个汇聚结点。流程图控制流图将程序流程图转化为控制流图1236784512,364,58791011bcadefgjhik三角形问题(流程图-流图)开始输入a、b、cab+c&&ba+c&&ca+b非∆一般∆等边∆等腰∆a==b&&a==ca==b||b==c||a==c结束187654321,234567891011abdefghijklc如果判定中的条件表达式是复合条件,即条件表达式是由一个或多个逻辑运算符连接的逻辑表达式,则需要改变复合条件的判断为一系列只有单个条件的嵌套的判断。复合条件分解控制流图(d)流程图c对应的流图1423(c)详细流程图A1B=0X=X/A流程图132A1ANDB=0X=X/A(a)流程图2、环形复杂度(圈复杂度)一种为程序逻辑复杂度提供定量尺度的软件度量.亦可将该度量用于基本路径方法,它可以提供程序基本集的独立路径数量和确保所有语句至少执行一次的测试数量上界.独立路径指程序中至少引入一个新的处理语句集合或一个新条件的程序通路,它必须至少包含一条在本次定义路径之前不曾用过的边.环形复杂度计算1.流图中区域的数量对应于环形复杂度;2.给定流图G的环形复杂度为V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中节点的数量.3.给定流图G的环形复杂度V(G),定义为V(G)=P+1,P是流图G中判定节点的数量.3、图矩阵图矩阵-即流图的矩阵表示。其维数等于流图的节点数。每列和每行都对应于标识的节点,矩阵元素对应于节点的边。节点12341a2b3c4d流图对应的矩阵图1234abcd一个简单的流图说明流图的节点一般用数字标识,边则可以用字母标识。上例中,若矩阵记为M,则M(4,1)=“d”,表示边d连接节点4和节点1。需要注意的是,边d的方向是节点4到节点1习题根据左图给出的程序流程图,完成以下要求:(1)画出相应的控制流图。(2)计算环形复杂度。(3)给出相应的图矩阵。(4)找出程序的独立路径集合。voidsort(intirecordnum,intitype)1.{2.intx=0;3.inty=0;4.while(irecordnum--0)5.{6.if(itype==0)7.break;8.else9.if(itype==1)10.x=x+10;11.else12.y=y+20;13.}14.}基本路径测试方法1.画出控制流图任何过程设计都要被翻译成控制流图。以C/C++语句中的控制语句为例。画出程序的控制流图(用题中给出的语句编号表示)。图中的每一个圆称作流图的节点,代表一条或多条语句。流图中的箭头称做边或连接,代表控制流。画出其程序流程图及控制流图467810111314程序段的控制流图4697101213142、计算环形复杂度环形复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界,独立路径必须包含一条在定义之前不曾用到的边。可以用以下三种方法计算环形复杂度:环形复杂度计算如下:1.流图中有4个区域;2.V(G)=E-N+2,V(G)=10(条边)-8(个节点)+2=4;3.V(G)=P+1,V(G)=3(个判定节点)+1=4。因此,该函数的环形复杂度是4。更重要的是,V(G)的值提供了组成基本集的独立路径的上界,并由此得出覆盖所有程序语句所需的测试设计数量的上界。3、导出测试用例根据上面的计算方法,导出基本路径集,列出程序的独立路径。可得出程序段的基本路径集中有4条独立路径:路径1:4-14路径2:4-6-7-14路径3:4-6-9-10-13-4-14路径4:4-6-9-12-13-4-144、设计测试用例输入数据预期输出Test1irecordnum=0itype=0x=0y=0Test2irecordnum=1itype=0x=0y=0Test3irecordnum=1itype=1x=10y=0Test4irecordnum=1itype=2x=0y=20注意:如果在程序中遇到复合条件,例如条件语句中的多个布尔运算符(逻辑OR、AND)时,为每一个条件创建一个独立的节点,包含条件的节点称为判定节点,从每一个判定节点发出两条或多条边。例如:1.if(aorb)2.x3.else4.y5....三角形问题流程图开始输入a、b、cab+c&&ba+c&&ca+b非∆一般∆等边∆等腰∆a==b&&a==ca==b||b==c||a==c结束18765432ab+cba+cca+ba==bb==ca==c一般∆a=c等边∆非∆等腰∆a=b12345678910111212341156121078913习题编写程序,输入一组字符(以#结束),对该组字符做一个统计,统计字母、数字和其他字符的个数,输出统计结果。1.main()2.{3.charc;inti=0,j=0,k=0;4.c=getchar();5.while(c!='#')6.{7.if(c='A'&&c='Z'||c='a'&&c='z')8.i++;9.elseif(c='0'&&c='9')10.j++;11.else12.k++;13.c=getchar();14.}15.printf(i=%d,j=%d,k=%d\n,i,j,k);16.}c=getchar()c!=’#’c=’A’&&c=’Z’||c=’a’&&c=’z’i++c=’0’&&c=’9’k++j++c=getchar()acgfdek输出i,j,kbASC||代码与字符对照表!“#$%&‘()*+,.33343536373839404142434446/0~9:;=?@A~4748~575859606162636465~Z[\]^-a~z{|}~90919293949597~122123124125126