第12讲 路径分析法
控制流图
• 控制流图 控制流图(可简称流图)是对程序流程图进行简化后 得到的,它可以更加突出的表示程序控制流的结构。 • 控制流图中包括两种图形符号:节点和控制流线。
• 节点由带标号的圆圈表示,可代表一个或多个语句、一个处 理框序列和一个条件判定框(假设不包含复合条件)。 • 控制流线由带箭头的弧或线表示,可称为边。它代表程序中 的控制流。
案例分析(二) 案例分析(
• 1)画出控制流图:
如右图所示 4
• 2)计算环形复杂度:
6 10(条边)- 8(个节点)+ 2 = 4
• 3)导出独立路径
7 路径1:4→14 路径2:4→6→7→14 路径3:4→6→9→10→13→4→14 路径4:4→6→9→12→13→4→14 14 10 13 9 12
图:程序流程图
• 上图所示的流程图中,一组独立的路径是:
path1:1 path2:1 path3:1 path4:1 11 2 - 3 - 4 - 5 - 10 - 1 - 11 2 - 3 - 6 - 8 - 9 - 10 - 1 - 11 2 - 3 - 6 - 7 - 9 - 10 - 1 - 11
独立路径测试
• 从前面学过的覆盖测试一节中可知,对于一个 较为复杂的程序要做到完全的路径覆盖测试是 不可能实现的。既然路径覆盖测试无法达到, 那么可以对某个程序的所有独立路径进行测试, 也就是说检验了程序的每一条语句,从而达到 语句覆盖,这种测试方法就是独立路径测试方 法。 • 从控制流图来看,一条独立路径是至少包含有 一条在其它独立路径中从未有过的边的路径。 路径可以用控制流图中的节点序列来表示。
• 对于复合条件,则可将其分解为多个单个条件,并映 射成控制流图。
图:常见的控制流图
环路复杂性
• 程序的环路复杂性是一种描述程序逻辑复杂度的标准, 该标准运用基本路径方法,给出了程序基本路径集中 的独立路径条数,这是确保程序中每个可执行语句至 少执行一次所必需的测试用例数目的上界。 • 给定一个控制流图G,设其环形复杂度为V(G),在这里 介绍三种常见的计算方法来求解V(G)。
案例分析( 案例分析(一)
4. 设计测试用例
• 测试用例组中的4个测试用例作为程序输入数据,能够遍 历这4条独立路径。对于源程序中的循环体,测试用例组 中的输入数据使其执行零次或一次。
输入 测试用例 i Test Case 1 Test Case 2 Test Case 3 Test Case 4 5 4 4 4 str ‘T’ ‘T’ ‘A’ ‘F’ num1 0 1 0 0 num2 0 0 0 1 score 100 100 100 90 路径1 路径2 路径3 路径4 期望输出 执行路径
课堂练习
• 采用“判断/条件覆盖法”测试下面的函数。 要求在excel中画出流程图并给出测试用例。
void test(int X, int A, int B) { if(A>1&&B==0) X=X/A; if(A==2||X>1) X=X+1; }
第12讲 路径分析法
徐浙君
主要内容
• • • • 控制流图 环路复杂性 独立路径测试法 案例分析
• 因此,控制流图G的环形复杂度是4。就是说至少需要4 条独立路径组成基本路径集合,并由此得到能够覆盖 所有程序语句的测试用例。
案例分析( 案例分析(一)
3.导出独立路径 • 根据上面环形复杂度的计算结果,源程序的基本 路径集合中有4条独立路径:
• • • • 路径1:7->18 路径2:7->9->10->16-&g>11->15->16->7->18 路径4:7->9->11->13->14->15->16->7->18
案例分析( 案例分析(一)
1.导出程序控制流图
• 根据源代码可以导出程 序的控制流图,如右图 所示。每个圆圈代表控 制流图的节点,可以表 示一个或多个语句。圆 圈中的数字对应程序中 某一行的编号。箭头代 表边的方向,即控制流 方向。
案例分析( 案例分析(一)
2.求出程序环形复杂度
• 根据程序环形复杂度的计算公式,求出程序路径集合中的独 立路径数目。 • 公式1:V(G)=10-8+2,其中10是控制流图G中边的数量,8是 控制流图中节点的数目。 • 公式2:V(G)=3+1,其中3是控制流图G中判断节点的数目。 • 公式3:V(G)=4,其中4是控制流图G中区域的数目。
测试用例2
测试用例3
测试用例4
案例分析( 案例分析(二)
void 1 { 2 3 4 5 6 7 8 9 10 11 12 13 14 } fun ( int iRecordNum, int iType ) int x=0; int y=0; while ( iRecordNum-- > 0 ) { if ( iType==0 ) break; else if ( iType==1 ) x=y+10; else x=y+20; }
• (1) V(G)=E-N+2,其中E是控制流图G中边的数量,N是控制流 图中节点的数目。 • (2) V(G)=P+1,其中P是控制流图G中判断节点的数目。 • (3) V(G)=A,其中A是控制流图G中区域的数目。由边和结点 围成的区域叫做区域,当在控制流图中计算区域的数目时, 控制流图外的区域也应记为一个区域。
案例分析(二) 案例分析(
• 4)设计测试用例
输入数据 测试用例1 iRecordNum = 0 iType = 0 iRecordNum = 1 iType = 0 iRecordNum = 1 iType = 1 iRecordNum = 1 iType = 2 预期输出 x = 0 y = 0 x = 0 y = 0 x = 10 y = 0 x = 0 y = 20
• 路径 path1,path2,path3,path4组成了控 制流图的一个基本路径集。
独立路径测试的步骤
(1)导出程序控制流图 (2)求出程序环形复杂度 (3)导出程序的独立路径。 (4)根据(3)中的独立路径,设计测试用例。
案例分析( 案例分析(一)
1 main () 2{ 3 int num1=0, num2=0, score=100; 4 int i; 5 char str; 6 scanf (“%d, %c\n”, &i, &str); 7 while (i<5) 8 { 9 if (str=’T’) 10 num1++; 11 else if (str=’F’) 12 { 13 score=score-10; 14 num2 ++; 15 } 16 i++; 17 } 18 printf (“num1=%d, num2=%d, score=%d\n”, num1, num2, score); 19 }