修改条件判断覆盖
修改条件/判断覆盖(Modified condition/decision coverage)简称MC/DC,在软件测试中有关代码覆盖率的准则。
依照修改条件/判断覆盖的准则,测试过程中需要满足以下所有条件[1]。
- 每一个判断的所有可能结果都出现过
- 每一个判断中所有条件的所有可能结果都出现过
- 每一个进入点及结束点都执行过
- 判断中每一个条件都可以独立影响判断的结果
各条件的独立影响可以用每一次只改变一个条件来证明。
飞航软体开发指南DO-178B及DO-178C中指定会影响飞机起飞及降落安全性的软体(A等级软体),需满足修改条件/判断覆盖的代码覆盖测试。在功能安全标准IEC 61508 part 3 的附录B中,有关SIL 4的说明[2],以及汽车安全标准ISO 26262第6章的ASIL D[3],都高度建议使用MC/DC。
定义
- 判断(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)
测试中的粗体数值表示此数值会影响输出的结果,每一个数值(对应程式中的条件)都至少有二次机会影响输出的结果,而且其中至少有一次使条件成立,至少也有一次使条件不成立。
修改条件/判断覆盖的准则需证明每个条件都可以独立影响判断的结果,此测试方式会比条件/判断覆盖要严格,也可以找到较多的错误。但考虑测试数量,条件/判断覆盖只需二项测试,而修改条件/判断覆盖需要四项测试,后者的测试成本也比前者要高。
外部链接
参考资料
- ^ 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).
- ^ IEC 61508-3:2010
- ^ ISO 26262-2011 Part 6 Table 12