McCabe度量法——相关概念介绍及测试用例数、环路复杂度测量例题解析

1. 定义和介绍

McCabe度量法:(来自百度百科)McCabe度量法是由托马斯·麦克凯(Thomas McCabe)提出的一种基于程序控制流的复杂性度量方法。
McCabe复杂性度量又称环路度量。它认为程序的复杂性很大程度上取决于程序图的复杂性。单一的顺序结构最为简单,循环和选择所构成的环路越多,程序就越复杂。这种方法以图论为工具,先画出程序图,然后用该图的环路数作为程序复杂性的度量值。程序图是退化的程序流程图。也就是说,把程序流程图的每一个处理符号都退化成一个结点原来连接不同处理符号的流线变成连接不同结点的有向弧,这样得到的有向图就叫做程序图。
程序图仅描述程序内部的控制流程,完全不表现对数据的具体操作分支和循环的具体条件。因此,它往往把一个简单的if语句与循环语句的复杂性看成是一样的。

根据图论,在一个强连通的有向图G中,环的个数V(G)由以下公式给出:
V(G)=m-n+2p其中,V(G)是有向图G中环路数,m是图G中数,n是图G中结点数,p是图G中强连通分量个数。

2. 相关概念:

强连通(Strongly Connected)是指一个有向图(Directed Graph)中任意两点v1、v2间存在v1到v2的路径(path)及v2到v1的路径。也即两个节点之间形成了回路。

连通 :一个图中,两个节点之间有路径相连。

如果将一个有向图所有有向边替换为无向边之后的无向图是连通的,则被称作弱连通(weakly connected)。如果对于任意一对顶点u,v,或者存在一条从u到v的有向路径,或者存在一条从v到u的有向路径,则该图是单连通(unilaterally conncected)的。如果对于如果对于任意一对顶点u,v,同时存在一条从u到v的有向路径和一条从v到u的有向路径,则该图是强连通(strongly connected)的。

强连通分量则是指一张有向图G的极大强连通子图G’。如果将每一个强连通分量缩成一个点,则原图G将会变成一张有向无环图。

连通子图:一个图是另外一个图的子图,并且它连通。

极大(强)连通子图:一个图的(强)连通子图,并且加入任何一个不在它的点集中的点都会导致它不再(强)连通。

一般的程序流程图/程序框图,大多数节点之间的连接都是依时间顺序单向的(程序流程图不考虑循环重复调用语句的情况)。为了能够使用McCabe度量法进行环路复杂度的测度,一般假设程序的出口处有一条虚线连接回入口处,使得程序流程图成为强联通图。因而使用该公式时,强联通分量p取2。

3. 两个例子

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

例2. 若采用白盒测试方法测试以下代码,并满足条件覆盖,则至少需要( )个测试用例。采用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;
}

先画出该代码的流程图,如下:
在这里插入图片描述
要满足条件覆盖,要求三个判断框的Y和N至少要经过一次,即:1Y2Y,1Y2N,1N3Y,1N3N,至少需要4个测试用例。
根据McCabe度量法环路复杂性公式V(g)=m-n+2,图中m=9,n=7, V(g)=9-7+2=4。
那么答案应是:4个用例,环路复杂度为4。

总结

比较重要的部分是清晰地界定好概念,以及根据程序语句准确画出程序流程图。

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值