伪代码的圈复杂度

时间:2013-07-21 11:04:37

标签: algorithm cyclomatic-complexity

Cyclomatic复杂性是实现特定模块的全面测试覆盖所必需的测试用例数。

考虑以下伪代码:

If (A > B) and (C > D) then
    A = A + 1
    B = B + 1
Endif

我认为这里只需要两个测试用例,一个用于真实条件,另一个用于错误条件,因此圈复杂度应为2但答案为3(不确定原因)。

有人请帮助我理解为什么答案是3而不是2.

2 个答案:

答案 0 :(得分:2)

Cyclomatic复杂度直接测量程序源代码中线性无关路径的数量。

If (A > B) and (C > D) then
    A = A + 1
    B = B + 1
Endif

案例1。

If (true) and (true) then
    // Execute some code
Endif

案例2。

If (true) and (false) then
    // Don't execute code
Endif

案例3。

If (false) and (2nd part won't be executed) then
    // Don't execute code
Endif

所以Cyclomatic的复杂性将是3。

答案 1 :(得分:1)

代码将由编译器翻译成类似下面的伪assemley代码:

A - B
branch if greater then 0 to end
C - D
branch if greater then 0 to end
inc A
inc B
end:
...

现在,为了在所有分支中做出所有可能的选择,您需要3个测试用例:

  1. A< = B(第一分支指令中的分支)
  2. C <= D(第二分支指令中的分支)
  3. A&gt; B和C> D(不要在第2分支指令中分支并获得增加的指令)
  4. 注意,对于“覆盖”的替代定义 - “所有指令覆盖”,1个测试用例就足够了(用上面编译的代码),因为即使你没有分支,“branch if ...”指令仍然执行,因此对于A&gt; B和C&gt; D测试用例,您实际上会完成所有说明。


    P.S。假设在这里:

      

    Cyclomatic复杂性是必要的测试用例数   实现对特定模块的全面测试覆盖。