主要内容

修正条件/决策覆盖率 (MCDC) 覆盖率

当前测试用例计算对结果有独立影响的条件的百分比

自 R2023b 起

描述

决策是由条件组成的复合布尔语句,这些条件是简单的布尔表达式。在其他条件保持不变的前提下,如果改变一个条件会改变决策结果,则该条件会独立影响决策结果。要测试某个条件是否会独立影响决策,测试用例必须检查:

  • 改变该条件的值是否使得决策结果为 true

  • 改变该条件的值是否使得决策结果为 false

MCDC 度量用于衡量测试用例检查多少条件有独立影响。MCDC 覆盖率为 50% 意味着测试用例仅检查一半的条件是否对决策有独立影响。要得到 100% MCDC 覆盖率,您可能需要重构决策语句。

Polyspace 实现

对于代码中的每个条件,Polyspace® Test™ 都会检查以下两个目标:

  • 改变该条件的值是否使得决策结果为 true

  • 改变该条件的值是否使得决策结果为 false

如果测试用例检查这两个目标,则表示条件具有 MCDC 覆盖率。Polyspace Test 会将 MCDC 计算为被覆盖条件数与条件总数的比率。以下列代码为例:

int foo(int A, int B, int C)
{
    if ((A||B)&&C)
        {
            return 1;
        }
    if ((A&&B)||C)
        {
            return 0;
        }
    return -1;
}
在本例中,代码中包含六个条件:

  • 三个条件包含在 ((A||B)&&C)

  • 三个条件包含在 ((A&&B)||C)

如果您使用以下测试用例测试 foo

  • 输入 = (1,1,0),输出 = 0

  • 输入 = (1,1,1),输出=1

测试仅覆盖 ((A||B)&&C)C 的 MCDC 目标,因此得到的 MCDC 值为 1/6 × 100 或 17%。

示例

全部展开

foo() 函数为例,该函数中包含三个条件。

int foo(int A, int B, int C){
    if(A||B&&C)
        return 1;
    return 0;
}

考虑以下测试用例。

测试用例 1测试用例 2

  • 输入:参数值 = (0,0,1)

  • 评估:返回值 = 0

  • 输入:参数值 = (1,0,1)

  • 评估:返回值 = 1

这两个测试用例测试改变输入 A 是否也会改变决策的结果。由于这两个测试检查三个输入中的一个输入对结果的影响,因此 MC/DC 覆盖率为 33%。

更正 - 添加测试用例以检查所有输入的影响

一般来说,对于包含 n 个输入的函数,完整的 MCDC 覆盖率需要 n+1 个测试。考虑以下测试用例。

ABB(A||B&&C)
0010
0111
0100
1011

这些测试用例检查每个输入参数是否能够独立改变结果,得到 100% MC/DC 覆盖率。

版本历史记录

在 R2023b 中推出