循环复杂性和基础路径

时间:2016-04-12 04:32:25

标签: unit-testing testing

让我们考虑一下我们有以下方法:

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

此方法的循环复杂度= 3。因此,根据基础路径测试,我们应该进行3次测试,以实现陈述和决策覆盖。 但是,我看到我只能使用两个测试(true,true)和(false,false)来实现语句和决策覆盖。我的错误在哪里?

2 个答案:

答案 0 :(得分:7)

是的,你是对的。 Cyclomatic复杂度为3,您应该验证的案例是:

  1. a是假的,b - 我们不在乎(我稍后会解释......) - >什么都没发生

  2. a是真的,b是假的 - >只执行了第二个条件

  3. a和b为真 - >第一个和第二个条件都已执行

  4. 如果只查看参数,我提到的第一个选项有2个不同的输入(b true / false),但是在这两种情况下都应该发生相同的情况,所以我建议你只验证一次或使用等效的C# test case attribute

答案 1 :(得分:2)

来自@OldFox的回答是正确的,只是一些补充:

  
    

我的错误在哪里?

  

CC是分支覆盖的上限,但它是路径覆盖的下限(与行/语句覆盖不同,见下文)。因此,您需要最多3次测试以涵盖所有分支/条件,至少3次测试以涵盖所有路径。

以下是您的功能图:

CFG

CC = 6 - 5 + 1 * 2 = 3 根据definition

要覆盖所有分支,最多需要3个测试,实际上你需要全部3个覆盖(真,真),(真,假)和(假,*)

要覆盖至少需要3次测试的所有路径,图表中有3种可能的独立路径,因此您只需要3次测试即可覆盖所有路径。

对于不同输入的数量可能存在一些混淆,即4,但并非所有由这些输入形成的路径都是独立的,其中两个(当a为假时)实际上是相同的,因此只有 3条独立路径

结论,3个测试用例是必要的,足以为您的函数提供分支和路径覆盖。

现在关于行/语句覆盖:您需要执行每行至少一行,为此,您只需要一次测试(true,true),但显然它不足以用于其他类型的覆盖。