修改条件/判断覆盖(Modified condition/decisioncoverage)简称MC/DC,是用在飞航安全软件文件DO-178B的白箱测试方式,可以判断A等级的软件是否有经过适当的软件测试。
简介依照修改条件/判断覆盖的准则,测试过程中以下条件至少需成立一次。
每一个判断的所有可能结果都出现过;
每一个判断中所有条件的所有可能结果都出现过;
每一个进入点及结束点都执行过;
判断中每一个条件都可以独立的影响判断的结果。
DO-178B中指定会影响飞机起飞及降落安全性的软件(A等级软件),需满足修改条件/判断覆盖的代码覆盖测试。1
定义条件
条件是指最小单位的逻辑运算式,也就是无法再分解的逻辑运算式。
判断
判断是指条件及零个至多个逻辑运算子组成的逻辑运算式,一个没有逻辑运算子的判断是判断也是条件。
条件覆盖
程式中每一个判断的所有条件的所有可能结果都至少出现一次。
判断覆盖
程式中每一个进入点及结束点都执行过一次,每一个判断的所有可能结果都至少出现一次。
条件/判断覆盖
程式中每一个进入点及结束点都执行过一次,每一个判断的所有条件的所有可能结果都至少出现一次,程式中判断的所有可能结果都至少出现一次。
修改条件/判断覆盖
程式中每一个进入点及结束点都执行过一次,每一个判断的所有条件的所有可能结果都至少出现一次,程式中判断的所有可能结果都至少出现一次,而每一个条件都可以独立的影响判断的结果。1
说明条件/判断覆盖考虑以下的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)都至少出现一次,满足条件覆盖的条件。前者会使判断成立,后者会使判断不成立,因此判断的所有可能结果都至少出现一次,满足判断覆盖的条件。因此上述测试满足条件/判断覆盖的准则。2
修改条件/判断覆盖修改条件/判断覆盖的准则比条件/判断覆盖要严格,除上述准则外,还需要证明每一个条件都可以独立影响判断的结果,是指当一判断中固定其他条件,只改变一条件时,结果会随之改变。
考虑以下的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)
测试中的粗体数值表示此数值会影响输出的结果,每一个数值(对应程式中的条件)都至少有二次机会影响输出的结果,而且其中至少有一次使条件成立,至少也有一次使条件不成立。
修改条件/判断覆盖的准则需证明每个条件都可以独立影响判断的结果,此测试方式会比条件/判断覆盖要严格,也可以找到较多的错误。但考虑测试数量,条件/判断覆盖只需二项测试,而修改条件/判断覆盖需要四项测试,后者的测试成本也比前者要高。2
本词条内容贡献者为:
王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所