Cyclomatic复杂度计算 - 具体例子

时间:2016-04-12 17:31:48

标签: unit-testing testing cyclomatic-complexity

我们假设我们有以下代码:

public void testIt(boolean a, boolean b){
   if (a){
   ...
   }
   if (b){
   ....
   }
}

据我所知,有三种方法可供计算。我将使用其中两个:区域公式和经验法则。

使用区域公式,我们有两个区域if(a){this is the first one}if (b) {this is the second one}。所以CC =两个区域+1 = 3。

经验法则来自Testing for ISTQB Advanced Level Technical Test Analyst vol 3本书:

  

现在,这对于像这样的小型,适度的方法来说非常简单。   对于较大的函数,绘制图形并进行计算   它真的很痛苦。所以,一个简单的经验法则是:伯爵   分支和循环结构并添加1. if语句,   for,while和do / while构造,每个都算作一个。为了   switch / case结构,每个case块计为一个。在if和   梯子如果构造,最后的其他不计。用于开关/外壳   构造,默认块不计。这是一条经验法则,   但它通常似乎有用。

因此,根据这条规则,如果条件+1 = 3,CC = 2。

然而,在与一个用户聊天的stackoverflow上,我说这个代码的CC = 4(他使用了第三种方法),并提供了该用户的以下图像: enter image description here

那么这段代码的圈复杂度是多少? 3或4或?

1 个答案:

答案 0 :(得分:2)

根据definition

,此代码的循环复杂度为3
M = E − N + 2P,
     

,其中

E = the number of edges of the graph.
N = the number of nodes of the graph.
P = the number of connected components.

M = 7 - 6 + 1 * 2 = 3

关于软件测试,它意味着:

  

M是实现完整分支覆盖所必需的测试用例数的上限。

     

M是通过控制流图(CFG)的路径数下限

     

以上所有三个数字可能相等:分支覆盖率< =圈复杂度< =路径数。

因此,您需要进行2次测试才能提供分支覆盖。但这并不意味着它将覆盖所有路径。

要覆盖所有路径,您需要进行4次测试。

要理解它,请考虑对代码进行更新:

public String testIt(boolean a, boolean b){
    String s = "";
    if (a) s = s+"a";
    if (b) s = s+"b";
    return s;
}

覆盖两个分支,你可以测试(真,真)和(假,假)

但可能的路径(结果)数量为4:

"", "a", "b", "ab"

对于2 <= 3 <= 4

以上的公式,绝对没问题