摘 要:白盒测试是一种以覆盖测试和路径测试为主,针对程序的内部结构进行测试的方法。其中,基本路径测试作为白盒测试中应用较为广泛的测试方法,通过对程序控制流图中节点间的连接关系进行分析,以检测程序的覆盖程度。本文从实际出发,详细探讨基本路径测试的思想理论,并运用环路复杂性原理进行计算,检验程序算法的有效性,以及程序测试的充分性。
关键词:白盒测试;基本路径测试;环路复杂性
1 引言
随着信息化技术的发展,市场对软件质量的要求越来越高,软件测试技术也受到了更高的重视。通过软件测试技术,对测试方案中可能出现的问题进行分析和评估,从而检验软件系统是否能够满足规定的需求,以确保软件系统的质量。在软件测试中,白盒测试是依赖于被测试程序的内部细节结构,运用特定的条件和循环语句,对软件系统的逻辑路径进行覆盖测试。
白盒测试的测试方法有很多,包括代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖等。其中,运用最为广泛的就是基本路径测试。
2 基本路径测试分析
所谓基本路径测试,是指在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。一般情况下,在测试的过程中不能达到完全覆盖所有路径,所以,如果能够保证一段程序的每个独立路径被测试到,那么就认为程序中的每一个语句已经被验证,这也既是基本路径测试的思想所在。
2.1 基本路径测试的一般步骤
(1)根据程序内容,画出程序控制流图。
(2)计算程序的环路复杂性,分析基本路径集中独立路径的条目数量,并保证程序中每个可执行的程序语句至少执行一次。
(3)依据环路复杂性,导出基本路径集,确定独立路径。
(4)设计的是测试用例,确保基本路径集中的每一条路径可以执行。
2.2 绘制程序控制流图
程序控制流图是由程序流程图映射而来。其中,程序流程图是程序控制结构的图形表示,通过框图的形式,使人们清晰明了地识别程序的处理过程和业务逻辑。而控制流图,则是在程序流程图的基础上,用圆和弧线的链接反映控制流的处理过程。不同语句形式的控制流图如下:
图1 基本语句控制流图
在控制流图中,圆表示流节点,代表一个或多个程序语句。箭头线代表控制边,每条控制边必须终止于一个节点。节点和控制边组合的范围为区域,区域的计算既包括内区域,也包括外区域。一般情况下,控制流图都是连通图,即任何两个节点都是连通的,这为计算程序的环路复杂性提供了有效依据。
2.3 计算环路复杂性
环路复杂性是一种为程序逻辑复杂性提供定量测试,用来衡量一个模块判定结构的复杂程度,在数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,确保所有语句至少执行一次测试。
环路复杂性又称圈复杂度,其计算方法有如下几种方式:
(1)控制流图中平面区域的数量(包括内区域和外区域)等于圈复杂度;
(2)控制流图的圈复杂度V(G)= e – n + 2p,其中G表示图,e代表图的边,n是图的节点数,p为图中的连通部分,一般情况下该值为1,因为一般情况下,控制流图都是连通图;
(3)控制流图中圈复杂度V(G)= P + 1,其中P为判断节点的个数,且可认为该点的出度数大于等于2。
2.4 导出基本路径集
基本路径集的导出以环路复杂性的计算结果为依据,从而确定独立路径的数目。所谓基本路径,就是指一条从源节点到汇节点最长的路径,并且此路径上有尽量多的出度大于等于2的节点 ,路径上节点间有明确的逻辑关系,那么将这样的路径便称为基本路径。而独立路径,就是在同其他独立路径相比较时,至少存在一个新执行语句或新的判断节点的路径。
3 基本路径测试的应用
假设用户每天有5次机会可登录系统,且每次最多可输入密码3次(令三次输入的密码分别用first、second和third表示,flag为输入正确密码的标志,i则是循环次数),那么密码验证的程序伪代码如下:
1 for (i=1; i<=5; i++) {
2 scanf (“%d”, first);
3 if (first == password) { flag=1; break;}
4 else {
5 printf (“Error! Please check and input again.”);
6 scanf (“%d”, second);
7 if (second == password) {flag=1; break ;}
8 else {
9 printf (“Error! Please check and input again.”);
10 scanf (“%d”, third);
11 if (third == password) {flag=1; break ;}
12 else {
13 printf (“Sorry! Back.”);
14 if (i ==5) flag=0;
}
}
}
}
15 if (flag ==1) login ( );
16 else printf(“Sorry, today you can’t operate.”);
17 close ( );
依据密码验证的程序伪代码,其对应的控制流图如下:
图2 控制流图
在控制流图中,虚线表示循环状态。而从节点14到节点1包含已流通路径,根据独立路径的定义所述,该部分的路径信息忽略不计。
依据环路复杂性的计算方法,在密码验证实例中,首先控制流图中平面区域的数量为4,其中内部区域为3,外部区域为 1。其次,对于控制流图的圈复杂度V(G)= e – n + 2p = 19 - 17 + 2 = 4。另一方面,从判断节点的情况来考虑,图中3个判断节点,分别是节点2、节点6和节点10,因此控制流图中圈复杂度V(G)= P + 1 = 3 + 1 = 4。从以上的分析来看,利用环路复杂性原理进行计算,得出4条路径。
首先通过观察图形,选取一条基本路径1->2->4->5->6->8->9->10->12->13->14->16->17,该路径的特点是路径最长,具有完整的业务逻辑结构,且路径上有尽量多的节点的出度数大于等于2。接下来,以此基本路径为基础,找到基本路径上节点大于等于2的节点,并以该节点为轴心进行翻转,并选取与该节点相连接的另一个孩子节点作为新路径的下一个节点,参考基本路径的选取方法,直到查找到汇集点,从而生成新路径。观察基本路径,可以看出节点2为第一个出度数大于等于2的节点,那么以节点2为轴心翻转,选取节点2的另一个孩子节点3作为新路径的下一个节点,继续向下查找,直到到达汇聚节点17,从而得到新的路径为1->2->3->15->17。按照这种方式,依此类推,分别选取节点6、节点10作为轴心对路径进行翻转,最终将得到路径1->2->4->5->6->7->15->17和路径1->2->4->5->6->8->9->10->11->15->17。综上分析,所得的路径如下:
表1 基本路径表
操作路径初始路径1->2->4->5->6->8->9->10->12->13->14->16->17以节点2为轴心进行翻转1->2->3->15->17以节点6为轴心进行翻转1->2->4->5->6->7->15->17以节点10为轴心进行翻转1->2->4->5->6->8->9->10->11->15->17 通过对程序业务逻辑进行分析,映射程序对应的控制流图,并计算出程序的环路复杂性,得出独立路径的数目。同时,选取基本路径,且以基路径为基础,经过一系列的节点替换,最终查找到所有路径,达到了路径的全面覆盖。另一方面,由于程序没有较为复杂的逻辑结构,因此基路径数目恰好与全部路径的数目相等。而对于某些逻辑关系较为复杂的程序,由于涉及到很多循环判断结构,故存在较多的路径叠加现象,那么对于基路径的选取将不能完全与整个程序的路径数目相等。
4 结论
基本路径测试,是白盒测试中应用较为广泛的方法,利用环路复杂性原理计算独立路径数目,能够保证测试的充分性和完整性。本文正是以此为基础,从实际应用出发,详细分析程序的业务逻辑结构,判断条件之间节点的关系,并对环路复杂性进行计算,找到所有独立路径,以使程序达到合理有效地覆盖测试。
参考文献:
[1] 肖自乾, 王弗雄, 陈经优. 基本路径测试方法之圈复杂度计算[J]. 软件导刊. 2010 (1): 10-12
[2] 贾晓强. 基于白盒测试的基本路径测试[J]. 渭南师范学院学报. 2008, 23 (2): 71-73
[3] 古乐, 史九林. 软件测试案例与实践教程[M] . 北京:清华大学出版社. 2007 (2)