2、基本路径测试法
(1)独立路径
独立路径是指包括一组以前没有处理的的语句或条件的一条路径。
从控制流图来看,一条独立路径是至少包含一条在其他独立路径中从未有过的边的路径。
(2)程序控制流图
1)程序控制流图的定义
控制流程图是描述程序控制流的一种图示方式。(有向图)
2)控制流图的两种图形符号
- 图中的每一个圆圈称为流图的结点,表示一个或多个无分支的语句或源程序语句。
- 流图中的箭头称为边或连接,表示控制流线。
3)程序控制流图的5种基本结构
4)程序控制流图的描述
- 程序控制流图实际上可以看作是一种简化了的程序流程图。
- 在控制流图中,只关注程序的流程,不关心各个处理框的细节。
- 因此,原来程序流程图中的各个处理框(包括语句框、判断框、输入/输出框等)都被简化为结点,一般用圆圈表示,而原来程序流程图中的带有箭头的控制流变成了控制流图中的有向边。
5)举个栗子:chestnut:
下图是典型的程序流程图转换为相对应的流图。对(a)图所示的程序流程图进行简化,得到(b)图所示的流图。
6)注意事项
在将程序流程图简化成控制流图时,应注意如下几点:
- 一组顺序结构可以映射为一个单一的结点。
- 在选择多分支结构中分支的汇集处时,即使没有执行语句也应该添加一个汇聚结点。
- 边和结点圈定的范围叫做区域,当对区域计数时,图形外的区域也应记为一个区域(开放区域) 。
- 如果判断中的条件表达式是由多个逻辑运算符(OR,AND…)连接的复合条件表达式,则需要改为一系列只有单个条件的嵌套的判断。
(3)软件复杂度
- 软件复杂度是指理解和处理软件的难易程度。
- 程序复杂度是软件度量的重要组成部分。
- 度量方法:
McCabe
度量法(环路度量)
(4)程序复杂度
环路复杂度又称为圈复杂度,是一种为程序逻辑复杂度提供定量尺度的软件度量。它可以提供程序基本路径集的独立路径数量,这是确保所有语句至少执行一次的过程所必须的最少测试用例数。常用于基本路径测试法。
(5)环路复杂度
McCabe
复杂性度量方式有如下三种:
V(G)= {区域数边数−结点数+2判定结点数+1\begin{cases} 区域数 \\ 边数-结点数+2 \\ 判定结点数+1\\ \end{cases}⎩⎪⎪⎨⎪⎪⎧区域数边数−结点数+2判定结点数+1 :star::star::star:
1)通过控制流图的区域个数来计算
公式:V(G)=区域数
程序的环路复杂性为控制流图的区域数(即封闭的区域数+1)。
在下图中可以看到,有 1
和 2
两个封闭区域,因此,环路复杂度V(G)=2 + 1 = 3。
(2个封闭的区域+1个开放区域)
2)通过控制流图的边数和结点数来计算
公式:V(G) = e - n + 2
其中, e
即 edge
,表示图中边的数目; n
即 node
,表示结点个数。
下图中V(G)= e - n + 2 = 7条边 − 6个结点 + 2 = 3。
因此,环路复杂度V(G)=3。
3)通过控制流图中的判定结点个数来计算
公式:V(G) = P + 1
其中,P表示判定结点的数目。所谓判定节点数,即有多个分支的节点,比如下图中的节点 2
,它可以走3或者5,这个时候它就需要做判断了。所以, 2
是一个判定节点。同样地,下面的 节点3
也像节点 2
一样分析。
因此,图中V(G)=2个判定结点+1 = 3,所以环路复杂度为3。
讲到这里,我们来给环路复杂性做个小结。事实上,程序的环路复杂性给出了程序基本路径集中的独立路径条数,这是确保可执行语句至少执行一次所必需的测试用例数目的上界。
通过对以上三个例子的了解,相信大家对环路复杂度的三种求解方式有了一个新的认识。有了上面一系列内容的铺垫,我们来开始讲解基本路径测试法。
(4)基本路径测试法
1)基本路径测试法是什么
路径测试就是从一个程序的入口开始,执行所经历的各个语句的完整过程。从广义的角度讲,任何有关路径分析的测试都可以被称为路径测试。
完成路径测试的理想情况就是做到路径覆盖,但对于复杂性较大的程序要做到所有的路径覆盖(测试所有可执行路径)是不可能的。
在不能做到所有路径覆盖的情况下,如果某一程序的每一个独立路径都被执行到,那么就可以认为程序中的每个语句都已经检验过了,即达到了语句覆盖。这种测试方法就是通常所说的基路径测试法。
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径的集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。
2)基本路径测试法的4个步骤
基本路径测试法包括以下4个步骤:
- 以详细设计或源代码作为基础,绘制程序的控制流图。
- 计算得到的控制流图G的环路复杂性V(G)。
- 确定独立路径的集合。通过程序控制流图导出基本路径集,列出程序的独立路径。所谓独立路径,是指至少包含一条新边的路径,也就是包含一些前面的路径未包含的语句,当所有的语句都包含了,基路径集就够了。(线性无关路径)
- 设计测试用例,确保基本路径集中每条路径的执行。
3)例子阐述1 :chestnut:
依据以下代码,用基本路径测试法,设计该程序的测试用例。
if(a>8 && b>10) //1,2 m=m+1; //3 if(a=10 || c>5) //4,5 m=m+5; //6 复制代码
解答:
①绘制程序控制流图,如下图所示。
②计算环路复杂度
V(G)=4(3个封闭区域+1个开放区域)
③确定线性无关路径:
路径1:1、4、6
路径2:1、4、5、6
路径3:1、2、4、5、6
路径4:1、2、3、4、5、6
④设计测试用例
编号 | 输入数据 | 预期输出 | 覆盖路径 |
1 | a=2,b=3,c=4 | m=0 | 1、4、6 |
2 | a=2,b=3,c=8 | m=5 | 1、4、5、6 |
3 | a=10,b=6,c=8 | m=5 | 1、2、4、5、6 |
4 | a=10,b=15,c=8 | m=6 | 1、2、3、4、5、6 |
4)例子阐述2 :chestnut:
依据以下代码,用基本路径测试法,设计该程序的测试用例。
static void permute_args(int panonopt_start, int panonopt_end, int opt_eng, int ncycle){ int cstart, cycle, i, j, nnonopts, nopts, pos; //1 nnonopts = panonopt_end - panonopt_start; nopts = opt_end - panonopt_end; cyclelen = (opt_end - panonopt_start)/ncycle; for(i = 0; i < ncycle; i++){ //2 cstart = panonopt_end + i; //3 pos = cstart; for(j = 0; j < cyclelen; j++){ //4 if(pos >= panonopt_end){ //5 pos -= nnonopts; //6 }else{ pos += nopts; //7 } } } } //8 复制代码
【问题1】请针对上述C程序给出满足100%DC(判定覆盖)所需的逻辑条件。
【问题2】请画出上述程序的控制流图,并计算其控制流图的环路复杂度V(G)。
【问题3】请给出问题2种控制流图的线性无关路径。
解答:
【问题1】
满足100%判定的逻辑条件为:
i<ncycle; i>=ncycle; j<cyclelen; j>=yclelen; pos>=panonopt_end; pos<panonopt_end; 复制代码
【问题2】
控制流图如下图所示,V(G)=4。
【问题3】
线性无关路径:
路径1:1、2、8
路径2:1、2、3、4、2…
路径3:1、2、3、4、5、6、4…
路径4:1、2、3、4、5、7、4…
四、写在最后
🙋♀️🙋♀️🙋♀️
对于软件测试中的白盒测试来说,主要需要了解白盒测试的基本概念,静态和动态白盒测试的方法,内容较黑盒测试来说逻辑性会更强一些。同时,值得注意的是,在动态测试中的基本路径测试法中,线性无关路径的识别要尤为小心,在计算过程中很容易出现多写的问题。因此,在此基础上,大家可以再多找几道相关的题目进行练习,举一反三。