Loading... # 判定覆盖(Decision Coverage,DC) 判定覆盖是设计足够多的测试用例,使得程序中的每一个判断至少获得一次“真”和一次“假”,即使得程序流程图中的每一个真假分支至少被执行一次。 以如下程序为例: ```cpp hljs if (A || B && C) XStatement; else YStatement; ``` A、B、C都是一个条件,而(A or B and C)叫一个Decision,在DC的覆盖率准则下,只需要两个测试用例(case)即可覆盖,也就是说让这个decision为true和false各一次就能达到。测试用例可选为:0 1 1 和 0 1 0 。 # 修订的条件/判定覆盖(Modified Condition Decision Coverage,MC/DC) 修正条件判定覆盖方法要求在一个程序中每一种输入输出至少得出现一次,在程序中的每一个条件必须产生所有可能的输出结果至少一次,并且每一个判定中的每一个条件必须能够独立影响一个判定的输出,即在**其他条件不变的前提下仅改变这个条件的值,而使判定结果改变** 。 还是以上面这段程序为例,就需要设计case让每个条件对结果都独立起作用,具体如下表所示: | 起作用 | case序号 | A | B | C | 结果 | | - | - | - | - | - | - | | A | 1 | 1 | 0 | 1 | 1 | | A | 2 | 0 | 0 | 1 | 0 | | B | 3 | 0 | 1 | 1 | 1 | | B | 4 | 0 | 0 | 1 | 0 | | C | 5 | 0 | 1 | 1 | 1 | | C | 6 | 0 | 1 | 0 | 0 | 可以看出,case 2 和case 4重复,case 3 和case 5 重复,因此,在该示例中,仅需要4个case即可覆盖。 实际上,Chilenski在研究中已经发现,对于一个具有N个条件的布尔表达式,满足 MC/DC 准则的测试用例至少有N+1组。为此,将满足MC/DC 准则的N+1组测试用例集合称为最小测试用例集。 需要注意的是,上述结论有一个前提条件,那就是布尔表达式中的N个条件必须相互独立。当它们并不满足这一条件时,就引入了一种新的覆盖率准则,masking MC/DC。 # Masking MC/DC Masking指的是特定的条件可以掩盖其他条件的影响。 Masking MC/DC允许在设计某个条件的case时,可以修改其他条件,只要感兴趣的条件是影响决策结果值的唯一条件。 下面用一个例子进行说明: ```cpp hljs if (A && B) || (C && D) XStatement; else YStatement; ``` 当想要证明A可以独立影响决策结果时,MC/DC选取的case可以为: | A | B | C | D | 结果 | | - | - | - | - | - | | 1 | 1 | 0 | 1 | 1 | | 0 | 1 | 0 | 1 | 0 | 实际上,想要让条件A独立对结果起作用时,只需要让B为1,且(C and D)为0,也就是说C和D各自的值并不重要,因此在Masking MC/DC中,就允许C和D的值变化,例如以下的case是可以接受的: | A | B | C | D | 结果 | | - | - | - | - | - | | 1 | 1 | 1 | 0 | 1 | | 0 | 1 | 0 | 1 | 0 | Masking可能会发生的一个常见例子就是一个条件在布尔表达式中重复出现,例如: ```cpp hljs if (A && B) || (A && D) XStatement; else YStatement; ``` # 参考文献 【1】[Masking MC/DC? What's all that about then?](https://www.rapitasystems.com/blog/maskingMCDC) © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏