Ant-Veil

Caspar Blog

动态测试中的覆盖率问题

| Comments

覆盖率(Coverage)的定义如下:

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%时的用例数,是指最少用例数。

Comments