【中级软考】什么是McCabe测量法(McCabe复杂性度量、环路度量。计算有向弧数、结点数、强连通分量个数)

McCabe度量法是由托马斯·麦克凯提出的一种基于程序控制流的复杂性度量方法。McCabe复杂性度量又称环路度量。它认为程序的复杂性很大程度上取决于程序图的复杂性。单一的顺序结构最为简单,循环和选择所构成的环路越多,程序就越复杂。这种方法以图论为工具,先画出程序图,然后用该图的环路数作为程序复杂性的度量值。程序图是退化的程序流程图。也就是说,把程序流程图的每一个处理符号都退化成一个结点,原来连接不同处理符号的流线变成连接不同结点的有向弧,这样得到的有向图就叫做程序图。

程序图仅描述程序内部的控制流程,完全不表现对数据的具体操作分支和循环的具体条件。因此,它往往把一个简单的IF语句与循环语句的复杂性看成是一样的,把嵌套的IF语句与CASE的复杂性看成是一样的。

根据图论,在一个强连通的有向图G中,环的个数V(G)由以下公式给出:

V(G)=m-n+2p其中,V(G)是有向图G中环路数,m是图G中弧数,n是图G中结点数,p是图G中强连通分量个数。在一个程序中,从程序图的入口点总能到达图中任何一个结点,因此,程序总是连通的,但不是强连通的。为了使图成为强连通图,从图的出口点到入口点加一条用虚线表示的有向边,使图成为强连通图。这样就可以使用上式计算环路复杂性了。

例1:

(2016年上半年试题)对下图所示流程图采用白盒测试方法进行测试,若要满足路径覆盖,则至少需要___个测试用例。采用McCabe度量法计算该程序对环路复杂性为___
在这里插入图片描述
路径覆盖是指设计若干个测试用例,覆盖程序中的所有路径。
上图中一共有6条路径:12345678,1234568,1235678,123568,12678,1268。
根据McCabe度量法环路复杂性公式V(g)=m-n+2p,图中m=10,n=8,p=1,V(g)=10-8+2=4。
那么答案应是:6个用例,环路复杂度为4。

【红色虚线为强连通】
在这里插入图片描述

例2:

(2015年上半年试题)若采用白盒测试方法测试以下代码,并满足条件覆盖,则至少需要___个测试用例。采用McCabe度量法算出该程序的环路复杂性为___

int find_max(int i, int j, int k){
    int max;
    if(i > j) {
        if(i > k){
           max = i;
        } else {
           max = k;
        }
    } else {
        if(j > k) {
            max = j;
        } else {
            max = k;
        }
    }
    return max;
}

一开始我随手画的流程图:(貌似缺了很多东西。。。)
在这里插入图片描述
改良之后:
在这里插入图片描述
上图中一共有4条路径,测试需要4个用例。
根据McCabe度量法环路复杂性公式V(g)=m-n+2p,图中弧数m=9,节点数n=7,p=1,V(g)=9-7+2=4。
那么答案应是:4个用例,环路复杂度为4。

参考文章1:软考必考题型之McCabe度量法

参考文章2:McCabe度量方法计算程序复杂度

发布了897 篇原创文章 · 获赞 49 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/Dontla/article/details/104668513
今日推荐