目录
计算环形复杂度需要画出程序的控制流图。控制流图中只有两种图形符号。
实验内容:针对下面的Java语言程序使用基本路径覆盖测试方法设计测试用例。
基本路径法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可
执行路径的集合,然后根据可执行路径进行测试用例设计的方法。此方法设计出的测试用例
需保证被测程序的每个可执行语句至少执行一次。
基本路径法包括以下4个步骤。
(1)画程序控制流图。程序控制流图是描述程序控制流的一种图示方法。
???????? (2)计算程序环形复杂度:圈复杂度。从程序的环形复杂度可导出程序基本路径集中的独立路径条数,这是确保程序中每个可执行语句至少执行一次的测试用例数目的上界。
???????? (3)导出测试用例。根据环形复杂度和程序结构来设计测试用例数据输入和预期结果。?? (4)准备测试用例。确保基本路径集中的每一条路径的执行。
实例:使用基本路径法实现三角形问题测试用例设计。
伪代码如下:
a = float(input("请输入三角形边长a:"))
b = float(input("请输入三角形边长b:"))
c = float(input("请输入三角形边长c:"))
if (a + b <= c or a + c <= b or b + c <= a
or abs(a - b) >= c or abs(b - c) >= a
or abs(c - a) >= b)
print("不能构成三角形!")
else if (a == b or b == c or a == c)
if (a == b and b == c)
print("等边三角形")
else
print("等腰三角形")
else
print("普通三角形")
步骤:
1、画出程序控制流图。对应的程序流程图如图1所示。
图1 程序流程图
圆:控制流图中的圆被称为流图的节点,表示一个或多个无分支的语句或源程序语句。箭头:控制流图中的箭头被称为边或连接,代表控制流。
???????? 在基本路径测试法中,任何过程设计都要被翻译成控制流图。不同的结构对应不同的控制流图,如图2所示。
图2 不同结构的控制流图
在将程序流程图转换为控制流图时,需要注意以下几点。
(1)选择或分支结构的分支汇聚处应有一个汇聚节点。
(2)边和节点圈定的范围叫作区域。在计算区域数时,图形外的区域也应记为一个区域。
(3)若判断结构的条件表达式包含一个或多个逻辑运算符(OR、AND、NAND、NOR)连接的复合条件表达式,则需要将其修改为一系列只有单条件的嵌套判断。
根据上述内容可将程序流程图对应的控制流图转换出来,如图3所示。
图3 程序控制流图
2、计算程序环形复杂度
获得程序控制流图之后,接下来计算环形复杂度。环形复杂度有3种计算方法。
(1)控制流图中的区域数等于环形复杂度。
(2)环形复杂度V(G)=E-N+2,E为控制流图中的边数,N为控制流图中的节点数。
(3)环形复杂度V(G)=P+1,P为数据流图中的判定节点数。
因此,环形复杂度计算如下:
区域数为4V(G)=11-9+2=4V(G)=3+1=4
3、导出测试用例
????????根据环形复杂度的计算可得出有4条独立路径(一条独立路径是和其他独立路径相比至少引入了一个新处理语句或一个新判断的程序通路)。
路径1:1→4→7→结束语句
路径2:1→4→8→9→11→结束语句
路径3:1→4→8→9→10→结束语句
路径4:1→4→8→13→结束语句
接下来根据上述独立路径来设计测试用例,并根据测试用例来输入数据,使程序分别执
行上述的4条独立路径。
?4、准备测试用例
???????? 根据判断节点给出的条件,选择合适的数据来确保上述4条路径均得到执行。满足基本路径集的测试用例如表1所示。
表1 满足基本路径集的测试用例
步骤1:导出程序控制流图
根据源代码可以导出程序的控制流图,如图2-4所示。每个圆圈代表控制流图的结点,可以表示一个或多个语句。圆圈中的数字对应程序中某一行的编号。箭头代表边的方向,即控制
流方向。
图2-4 程序2_2的控制流图
步骤2:求出程序环形复杂度
根据程序环形复杂度的计算公式,求出程序路径集合中的独立路径数目。
公式1:V(G)=10-8+2,其中10是控制流图 G中边的数量,8是控制流图中结点的数目。公式2:V(G)=3+1,其中3是控制流图G中判定结点的数目。
公式3:V(G)=4,其中4是控制流图G中区域的数目。
因此,控制流图G的环形复杂度是4。就是说至少需要4条独立路径组成独立路径集合,并由此得到能够覆盖所有程序语句的测试用例。
步骤3:导出测试用例
根据上面环形复杂度的计算结果,源程序的独立路径集合中有4条独立路径:path 1:10→18。
path 2:10→11→12→16→10→18。
path 3:10→11→13→15→16→10→18。
path 4:10→11→13→14→15→16→10→18。
步骤4:设计测试用例
根据上述4条独立路径,设计了测试用例组8,如表2-8所示。测试用例组8中的4个测试用例作为程序输入数据,能够遍历这4条独立路径。对于源程序中的循环体,测试用例组8中的输入数据使其执行零次或一次。
表2-8 测试用例组8
注意:如果程序中的条件判断表达式是由一个或多个逻辑运算符(and,or,not)连接的复合条件表达式,则需要变换为一系列只有单个条件的嵌套的判断。