1

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

考虑以下伪代码:

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

我认为这里只需要两个测试用例,一个用于真条件,另一个用于假条件,所以圈复杂度应该是 2,但答案是 3(不知道为什么)。

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

4

2 回答 2

2

圈复杂度直接衡量通过程序源代码的线性独立路径的数量。

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

所以圈复杂度为3。

于 2013-07-21T11:39:03.353 回答
1

该代码将由编译器翻译成类似以下的伪汇编代码:

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 > B 和 C > D (不要在第二个分支指令中分支并进入递增指令)

请注意,对于“覆盖”的替代定义 - “所有指令覆盖”,1 个测试用例就足够了(使用上面的编译代码),因为即使你不分支,“分支 if..”指令仍然会执行,因此对于 A>B 和 C>D 测试用例,您实际上会阅读所有说明。


PS在这里假设:

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

于 2013-07-21T11:28:55.380 回答