动态测试中的覆盖率问题
Coverage = (Object executed)/(Total objects) * 100%
常用的覆盖率指标有很多,这里只介绍我看到过的其中三种:
语句覆盖率(Statement Coverage),也称作“行覆盖率(Line Coverage)”、“段覆盖率(Segment Coverage)”,用于评价测试的代码语句覆盖率。
判定路径覆盖率(Decision-Decision Path Coverage, DDP Coverage),用于评价代码分支的覆盖率。
修正条件/决策覆盖率(Modified Condition/Decision Coverage, MC/DC),这个比较麻烦,稍后详述。
语句覆盖率很简单,例如有以下示例代码:
// A, B的取值范围为0和1 if (A && B) 99 statements; else 1 statement;
当有如下测试用例,覆盖率为99%:
A B if()
1 1 true
判定路径覆盖率也比较简单,仍旧是上面的样例代码,当有如下测试用例时,DDP覆盖率即为100%:
A B if()
1 1 true
0 1 false
下面介绍一下比较麻烦的MC/DC。
以下摘自51testing:
MC/DC是DO-178B(美军标准)中首次提出的,开始是为了提高航空软件测试中的覆盖率水平。在 DO-178B中阐明了MC/DC的意义: 对于关键性的实时程序而言,超过半数的可执行代码可能都与布尔运算表达式有关,表达式的复杂性应得到关注。MC/DC的提出是为了引起对布尔表达式的关注…
根据DO-178B,MC/DC(Modified Condition/Decision Coverage)有如下要求:判定中每个条件的所有可能结果至少出现一次,每个判定本身的所有可能结果也至少出现一次,每个入口点和出口点至少要执行一次,并且每个条件都能单独影响判定结果。这里条件是指不含任何逻辑操作符的布尔表达式,由关系操作符构成。判定是指包含逻辑操作符的布尔表达式。如果同一个布尔表达式在一个判定中出现了多次,那么该表达式应算作多个条件。例如(A OR B)AND(A OR C)中有4个条件。条件A能单独影响判定结果是指,判定中的其他条件取值都不变时,条件A取值的改变会引起判定结果的改变。
对于上面这段话,仍旧使用前面的样例代码来理解:
在前面的代码中,有2个条件,分别是A和B,有一个判定(决策),判定结果有两种,true和false。所以要使MC/DC达到100%,A的取值0和1在测试用例中都要出现至少一次,B的取值也是如此,此外判定的结果true和false也至少要出现一次。使用讲解DDP覆盖率的时候的用例,即:
A B if()
1 1 true
0 1 false
此用例的MC/DC为66.6%,这是为什么呢?
按照条件单独影响判定的原则,补全上面的测试用例到100%如下:
A B if()
1 1 true
0 1 false -- 保持B不变,单独改变A的值,改变了判定的结果。此时A和判定的所有取值都已经出现。
1 1 true
1 0 false -- 保持A不变,单独改变B的值,改变了判定结果,B的所有取值也已经出现。
以上测试用例,有两组重复了。即取用例集{(1,1), (0,1), (1,0)}就可以达到100%的MC/DC。
所以前面那组测试用例的MC/DC是66.6%了。
P.S. 这里有个问题,这里提到的MC/DC达到100%时的用例数,是指最少用例数。



















想起你这么热心讨论mc/dc又想起你的期中考试试卷居然丢了。。。。。。
有这么点背的么。。。。。。
sigh
大难不死必有后福。。。。。。
我把DDP记成覆盖率了.....唉...
well, it's great helpful just before the exam of s.e