|
知识路径: > 测试技术的分类 > 白盒测试技术 > 白盒测试方法 >
|
被考次数:10次
被考频率:高频率
总体答错率:26%  
知识难度系数:
|
由 软考在线 用户真实做题大数据统计生成
|
考试要求:掌握
相关知识点:24个
|
|
|
|
上节的例子是个比较简单的程序段,只有两条路径。但在实际问题中,一个不太复杂的程序,其路径的组合都是一个庞大的数字。如下图所示的穷举测试程序竟有520条路径,要在测试中覆盖这样多的路径是不现实的。
|
|
|
|
|
为解决这一难题,需要把覆盖的路径数压缩到一定限度内,例如,程序中的循环体只执行一次。本节介绍的基本路径测试就是这样一种测试方法,它在程序控制流图的基础上,通过分析控制流图的环路复杂性,导出基本可执行路径的集合,然后据此设计测试用例。设计出的测试用例要保证在测试中程序的每一条可执行语句至少执行一次。
|
|
|
|
控制流图是描述程序控制流的一种图示方式。其中基本的控制结构对应的图形符号如下图所示。在如下图所示的图形符号中,圆圈称为控制流图的一个结点,它表示一个或多个无分支的语句或源程序语句。
|
|
|
|
|
如下图(a)所示的是一个程序的流程图,它可以映射成如下图(b)所示的控制流程图。
|
|
|
|
|
这里我们假定在流程图中用菱形框表示的判定条件内没有复合条件,而一组顺序处理框可以映射为一个单一的结点。控制流程图中的箭头(边)表示了控制流的方向,类似于流程图中的流线,一条边必须终止于一个结点,但在选择或者是多分支结构中分支的汇聚处,即使汇聚处没有执行语句也应该添加一个汇聚结点。边和结点圈定的部分叫区域,当对区域计数时,图形外的部分也应记为一个区域。
|
|
|
如果判断中的条件表达式是复合条件,即条件表达式是由一个或多个逻辑运算符(or、and、nand和nor)连接的逻辑表达式,则需要改变复合条件的判断为一系列只有单个条件的嵌套的判断。例如,对应如下图所示的复合逻辑下的控制流图(a)的复合条件的判定,应该画成如下图(b)所示的控制流图。条件语句if a and b中条件a和条件b各有一个只有单个条件的判断结点。
|
|
|
|
|
|
程序的环路复杂性即McCabe复杂性度量,在进行程序的基本路径测试时,从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。
|
|
|
独立路径是指包括一组以前没有处理的语句或条件的一条路径。从控制流图来看,一条独立路径是至少包含有一条在其他独立路径中从未有过的边的路径。例如,在如下图(b)中所示的控制流图中,一组独立的路径如下:
|
|
|
|
|
|
|
path3:1—2—3—6—8—9-10—1—11;
|
|
|
path4:1—2—3—6—7—9—10—1—11。
|
|
|
从此例中可知,一条新的路径必须包含有一条新边。路径1—2—3—4—5—10—1—2—3—6—8—9—10—1—11不能作为一条独立路径,因为它只是前面已经说明了的路径的组合,没有通过新的边。
|
|
|
路径path1、path2、path3和path4组成了如上图(b)所示控制流图的一个基本路径集。只要设计出的测试用例能够确保这些基本路径的执行,就可以使得程序中的每个可执行语句至少执行一次,每个条件的取真和取假分支也能得到测试。基本路径集不是惟一的,对于给定的控制流图,可以得到不同的基本路径集。
|
|
|
通常环路复杂性还可以简单地定义为控制流图的区域数。这样对于如上图(b)所示的控制流图,它有4个区域,环路复杂性V(G)=4,它是构成基本路径集的独立路径数的上界,可以据此得到应该设计的测试用例的数目。
|
|
|
|
基本路径测试法适用于模块的详细设计及源程序,其主要步骤如下:
|
|
|
. 以详细设计或源代码作为基础,导出程序的控制流图;
|
|
|
|
|
. 生成测试用例,确保基本路径集中每条路径的执行。
|
|
|
下面以一个求平均值的过程averagy为例,说明测试用例的设计过程。用PDL语言描述的averagy过程如下所示。
|
|
|
|
|
|
利用在如下图一所示的控制流图的图形符号、如下图二所示的程序流图和对应的控制流图和如下图三所示的复合逻辑下的控制流图给出的符号和构造规则生成控制流图。对于上述过程,对将要映射为对应控制流图中一个结点的PDL语句或语句组,加上用数字表示的标号。加了标号的PDL程序及对应的控制流图如下图四和如下图五所示。
|
|
|
|
|
|
|
|
|
|
|
|
利用在前面给出的计算控制流图环路复杂性的方法,算出控制流图G的环路复杂性。如果一开始就知道判断结点的个数,甚至不必画出整个控制流图,就可以计算出该图的环路复杂性的值。对于如下图所示的控制流图,可以算出:
|
|
|
|
|
V(G)=6(区域数)=5(判断结点数)+1=6。
|
|
|
|
针对如上图所示的averagy过程的控制流图计算出的环路复杂性的值,就是该图已有的线性无关基本路径集中路径数目。该图所有的6条路径如下所示。
|
|
|
|
|
|
|
[path5]1—2—3—4—5—6—8—9—2…
|
|
|
[path6]1—2—3—4—5—6—7—8—9—2…
|
|
|
路径4、5、6后面的省略号(…)表示在控制结构中以后剩下的路径是可选择的。在很多情况下,标识判断结点,常常能够有效地帮助导出测试用例。在上例中,结点2、3、5、6和10都是判断结点。
|
|
|
(4)生成测试用例,确保基本路径集中每条路径的执行
|
|
|
根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到。满足上述基本路径集的测试用例如下所示。
|
|
|
[path1]输入数据:value[k]=有效输入,限于k
|
|
|
|
|
注意:不能孤立地进行测试,应当作为路径4、5、6测试的一部分来测试。
|
|
|
[path2]输入数据:value[1]=-999;
|
|
|
|
[path3]输入数据:试图处理101个或更多的值,而前100个应当是有效的值;
|
|
|
|
[path4]输入数据:value[i]=有效输入,且i<100;
|
|
|
|
|
[path5]输入数据:value[i]=有效输入,且i<100;
|
|
|
|
|
[path6]输入数据:value[i]=有效输入,且i<100
|
|
|
|
每个测试用例执行之后,与预期结果进行比较。如果所有测试用例都执行完毕,则可以确信程序中所有的可执行语句至少被执行了一次。但是必须注意的是,一些独立的路径(如此例中的路径1),往往不是完全孤立的,有时它是程序正常的控制流的一部分,这时,这些路径的测试可以是另一条路径测试的一部分。
|
|
|