修改条件判断覆盖

维基百科,自由的百科全书

修改条件/判断覆盖Modified condition/decision coverage)简称MC/DC,在软件测试中有关代码覆盖率的准则。

依照修改条件/判断覆盖的准则,测试过程中需要满足以下所有条件[1]

  • 每一个判断的所有可能结果都出现过
  • 每一个判断中所有条件的所有可能结果都出现过
  • 每一个进入点及结束点都执行过
  • 判断中每一个条件都可以独立影响判断的结果

各条件的独立影响可以用每一次只改变一个条件来证明。

飞航软件开发指南DO-178B英语DO-178BDO-178C英语DO-178C中指定会影响飞机起飞及降落安全性的软件(A等级软件),需满足修改条件/判断覆盖的代码覆盖测试。在功能安全标准IEC 61508 part 3 的附录B中,有关SIL 4的说明[2],以及汽车安全标准ISO 26262第6章的ASIL D[3],都高度建议使用MC/DC。

定义[编辑]

条件(Condition)
条件是指最小单位的逻辑运算式英语Expression (programming),也就是无法再分解的逻辑运算式。
判断(Decision)
判断是指条件及零个至多个逻辑运算子组成的逻辑运算式,一个没有逻辑运算子的判断是判断也是条件。
条件覆盖(Condition coverage)
程式中每一个判断的所有条件的所有可能结果都至少出现一次。
判断覆盖(Decision coverage)
程式中每一个进入点及结束点都执行过一次,每一个判断的所有可能结果都至少出现一次。
条件/判断覆盖(Condition/decision coverage)
程式中每一个进入点及结束点都执行过一次,每一个判断的所有条件的所有可能结果都至少出现一次,程式中判断的所有可能结果都至少出现一次。
修改条件/判断覆盖(Modified condition/decision coverage)
程式中每一个进入点及结束点都执行过一次,每一个判断的所有条件的所有可能结果都至少出现一次,程式中判断的所有可能结果都至少出现一次,而每一个条件都可以独立的影响判断的结果。

说明[编辑]

条件/判断覆盖[编辑]

考虑以下的C++程式

int foo (int x, int y)
{    int z = 0;
    if ((x>0) && (y>0)) 
    {
        z = x;
    }
    return z;
}
  • foo(1,1)foo(0,1)进行测试,前者会使判断成立,后者会使判断不成立,因此判断的所有可能结果都至少出现一次,满足判断覆盖的条件。
  • foo(1,1)foo(0,0)进行测试,条件A及B的所有结果(0和1)都至少出现一次,满足条件覆盖的条件。前者会使判断成立,后者会使判断不成立,因此判断的所有可能结果都至少出现一次,满足判断覆盖的条件。因此上述测试满足条件/判断覆盖的准则。

修改条件/判断覆盖[编辑]

修改条件/判断覆盖的准则比条件/判断覆盖要严格,除上述准则外,还需要证明每一个条件都可以独立影响判断的结果,是指当一判断中固定其他条件,只改变一条件时,结果会随之改变。

考虑以下的C++程式

int foo (int x, int y, int z)
{
    int a = 0;
    if (((x>0) || (y>0)) && (z>0)) {
        a = x;
    }
    return a;
}

使用以下的测试,第一个测试会使判断成立,第二个测试会使判断不成立,判断的所有可能结果都至少出现一次,判断的每一个条件的所有可能结果也至少出现一次,满足条件/判断覆盖的准则。

  • foo(1,1,1)
  • foo(0,0,0)

上述的第一个测试中,若将第三个数值由1改为0,判断由成立改为不成立,因此第三个数值的1可以独立影响判断的结果,但若将第一个数值改为0,判断仍然成立,因此第一个引数无法独立影响判断的结果,同理可证第二个数值也无法独立影响判断的结果。

而第二个测试中,无论哪一个数值由0改为1,判断都不成立,因此三个数值的0都无法独立影响判断的结果。上述的测试无法满足修改条件/判断覆盖的准则。

若要满足修改条件/判断覆盖的准则,需使用以下的测试:

  • foo(0,0,1)
  • foo(1,0,1)
  • foo(0,1,1)
  • foo(1,1,0)

测试中的粗体数值表示此数值会影响输出的结果,每一个数值(对应程式中的条件)都至少有二次机会影响输出的结果,而且其中至少有一次使条件成立,至少也有一次使条件不成立。

修改条件/判断覆盖的准则需证明每个条件都可以独立影响判断的结果,此测试方式会比条件/判断覆盖要严格,也可以找到较多的错误。但考虑测试数量,条件/判断覆盖只需二项测试,而修改条件/判断覆盖需要四项测试,后者的测试成本也比前者要高。

外部链接[编辑]

参考资料[编辑]

  1. ^ Hayhurst, Kelly; Veerhusen, Dan; Chilenski, John; Rierson, Leanna. A Practical Tutorial on Modified Condition/ Decision Coverage (PDF). NASA. May 2001 [2012-04-20]. (原始内容存档 (PDF)于2019-10-15). 
  2. ^ IEC 61508-3:2010
  3. ^ ISO 26262-2011 Part 6 Table 12