Main Content

MATLAB 函数的模型覆盖率报告

收集模型的覆盖率后,您可以生成覆盖率报告,其中总结了覆盖率结果和每个模块的详细信息。如果您的模型包含 MATLAB Function 模块,您可以逐行查看模块内 MATLAB® 代码的覆盖率结果。对于每种类型的 MATLAB 函数,覆盖率分析看起来略有不同:

MATLAB Function 模块中 MATLAB 函数的覆盖率报告

考虑 MATLAB 函数 run_intersect_test 的模型覆盖率报告,它是在 MATLAB Function 模块内定义的。

链接函数名称下方是指向父 MATLAB Function 模块的报告部分的链接,其中包含 run_intersect_test 函数的代码。

Coverage results for MATLAB function run_intersect_test. The cyclomatic complexity is 7. The function receives 100% decision coverage with 8 out of 8 decision outcomes satisfied, 88% condition coverage with 7 out of 8 condition outcomes satisfied, and 75% MCDC with 3 out of 4 conditions having reversed the decision outcome.

该函数报告的上半部分总结了其模型覆盖率结果。run_intersect_test 的覆盖率度量包括决策、条件和 MCDC 覆盖率。您可以通过检查 run_intersect_test 的代码来了解这些度量。

Code view of the coverage report. Lines 1, 6, 14, and 27 are colored completely in green. Line 30 is colored partially red to indicate that part of the decision does not receive full coverage. The rest of the lines are not colored.

包含覆盖率元素的行以突出显示的行号标记:

  • 第 1 行接收决策覆盖率,指示顶层函数 run_intersect_test 是否执行。

  • 第 6 行接收 if 语句的决策覆盖率。

  • 第 14 行接收决策覆盖率,指示局部函数 rect_intersect 是否执行。

  • 第 27 行和第 30 行接收 if 语句和条件的决策、条件和 MCDC 覆盖率。

    第 30 行的条件 right1 < left2 显示为红色,表示该条件未评估其所有可能的结果。覆盖率报告显示覆盖率分析中哪些结果仍未得到满足。

覆盖率报告包括每一行代码的详细信息。点击链接即可打开编辑器并查看报告中的相关行。

覆盖率摘要

覆盖率详细信息窗格显示总结整个 run_intersect_test 函数覆盖率的度量。

Coverage results for run_intersect_test reports a cyclomatic complexity of 7, and 100% decision coverage (8 out of 8 decision outcomes satisfied), 88% condition coverage (7 out of 8 condition outcomes satisfied), and 75% MCDC coverage (3 out of 4 conditions reversed the decision outcome).

覆盖率摘要的结论是:

  • 行报告中针对 run_intersect_test 报告了八个决策结果:

    • 第 1 行一个(已执行)

    • 第 6 行两个(truefalse

    • 第 14 行一个(已执行)

    • 第 27 行两个 (truefalse)

    • 第 30 行两个 (truefalse)。

    每一行的决策覆盖率均显示 100% 的决策覆盖率。这个结果意味着 run_intersect_test 的决策覆盖率是八种可能结果中的八种,即 100%。

  • 行报告中报告了 run_intersect_test 的四种情况。第 27 行和第 30 行各有两个条件,每个条件又有两个条件结果(truefalse),run_intersect_test 总共有 8 个条件结果。除第 30 行(right1 < left2)的第一个条件外,所有条件的 truefalse 结果测试均为正。这意味着 run_intersect_test 的条件覆盖率是八分之七,即 88%。

  • 决策行 27 和 30 的 MCDC 覆盖率表分别列出了每种情况下的两种决策反转情况,总共有四种可能的逆转。在仿真中,只有第 30 行条件 right1 < left2 的评估从 true 变为 false 的决策反转没有发生。这意味着在仿真中测试了四种可能的逆转情况中的三种,即 75%,覆盖率为 75%。

第 1 行的覆盖率

每个配置为进行代码生成的 MATLAB 函数的第一行都作为一个决策接收覆盖率分析。该决策表明该函数是作为对被调用的响应而执行的。

Coverage results for run_intersect_test reports 100% decision coverage. The function executed 11 out of 11 time steps.

run_intersect_test 的覆盖率报告显示 100% 决策覆盖率,这表明该函数至少执行了一次。决策表还显示该函数执行了十一次。

第 6 行的覆盖率

分析的决策表表明第 6 行的决策 if isempty(x1) 共执行了 11 次。该决策在一个时间步中被评估为 true,在十个时间步中被评估为 false。由于两种可能的结果都发生了,因此决策覆盖率为 100%。

Coverage results for if isempty(x1) reports 100% decision coverage. The decision is true for 1 out of 11 time steps, and false for 10 out of 11 time steps.

第 14 行的覆盖率

分析的决策表表明局部函数 rect_intersect 在测试期间执行,因此获得了 100% 的覆盖率。

Coverage results for rect_intersect reports 100% decision coverage. The function executed 11 out of 11 time steps.

第 27 行的覆盖率

分析的决策表表明第 27 行的决策有两种可能的结果,truefalse。表达式执行了十一次,其中五次决策结果为 false。其余六次,决策结果为 true。由于两种可能的结果都发生了,因此决策覆盖率为 100%。

此外,分析的条件表显示,由于此决策由两个通过逻辑或(||)运算链接的条件组成,因此只需一个条件评估为 true 即可使决策结果为 true。如果第一个条件的计算结果为 true,则无需计算第二个条件。这被称为逻辑短路。第一个条件 top1 < bottom2 被评估了十一次,其中两次为 true。这个结果意味着第二个条件 top2 < bottom1 仅被评估了九次。该条件对 true 进行了四次评估,这使得该决策的 true 总出现次数达到六次,与分析的决策表中的数字相匹配。

MCDC 覆盖率寻找由于一个条件结果从 T 变为 F 或从 F 变为 T 而发生的决策逆转。MC/DC 分析表标识了导致决策逆转的条件的可能结果组合。字符 x 表示由于逻辑短路而无关的条件结果。仿真期间未实现的条件结果组合用一组括号标记。对于第 27 行,由于每个条件都会独立影响决策结果,因此报告的 MCDC 覆盖率为 100%,并且 MC/DC 分析表中没有任何条件结果组合被括号包围。

第 30 行的覆盖率

第 30 行的决策 if (right1 < left2 || right2 < left1) 嵌套在第 27 行的 if 语句的 else case 中。因此,仅当第 27 行的决策为 false 时,才会评估第 30 行的决策。因为第 27 行的决策被评估为 false 五次,所以第 30 行也被评估了五次,其中三次是 false。由于 truefalse 结果均已实现,因此第 30 行的决策覆盖率为 100%。

因为第 30 行与第 27 行一样,具有两个由逻辑或运算符 (||) 关联的条件,所以仅当条件 1 为 false 时,才会评估条件 2。因为条件 1 被评估为 false 五次,所以条件 2 也被评估了五次。其中,条件 2 被评估为 true 两次,评估为 false 三次,这解释了该决策中 true 结果出现的两次。

因为第 30 行决策的第一个条件没有评估为 true,所以该条件下的两种结果都没有发生,并且报告用玫瑰色突出显示第一个条件的条件覆盖率。该报告还以同样的方式突出显示了基于该条件的 true 结果进行决策反转的 MCDC 覆盖率

Simulink Design Verifier MATLAB 函数的覆盖率报告

如果您将 MATLAB 代码配置为进行代码生成,并且代码包含以下 Simulink® Design Verifier™ 函数,则可以测量覆盖率:

对于此示例,考虑一个包含 MATLAB Function 模块的模型。

A model contains a constant block set to 30. The signal from the constant block enters a MATLAB Function block. The signal from the MATLAB function block enters an outport block.

MATLAB Function 模块包含以下代码:

function y = fcn(u)
% This block supports MATLAB for code generation.
 
sldv.condition(u > -30)
sldv.test(u == 30)
y = 1;

要收集 Simulink Design Verifier MATLAB 函数的覆盖率,请在配置参数对话框的覆盖率窗格中,在其他度量下,选择目标和约束

仿真之后,模型覆盖率报告显示 sldv.conditionsldv.test 函数的覆盖率。对于 sldv.condition,表达式 u > -30 计算为 true 51 次。对于 sldv.test,表达式 u == 30 计算为 true 51 次。

有关 Simulink Design Verifier 模块的模型覆盖率数据示例,请参阅目标和约束覆盖率

外部文件中 MATLAB 函数的覆盖率报告

使用 MATLAB 函数的模型覆盖率报告 中的相同模型,假设 MATLAB 函数 run_intersect_testrect_intersect 存储在名为 run_intersect_test.m 的外部 MATLAB 文件中。

要在外部文件中收集 MATLAB 函数的覆盖率,请在配置参数对话框的覆盖率窗格中选择 MATLAB 文件的覆盖率

仿真后,模型覆盖率报告摘要包含顶层模型和外部函数的部分。

Coverage report summary shows a total coverage of 88% condition coverage, 100% decision coverage, and 75% MCDC coverage. Item 1 shows coverage for run_intersect_test and reports 88% condition coverage, 100% decision coverage, and 75% MCDC coverage. Item 2 shows coverage for intersecting_rectangles1 and reports 100% decision coverage, and the other metrics not applicable.

run_intersect_test.m 的模型覆盖率报告报告的覆盖率数据与 MATLAB Function 模块中存储的函数的覆盖率数据相同。

有关外部文件中 MATLAB 函数的模型覆盖率报告的详细示例,请参阅外部 MATLAB 文件覆盖率报告

相关主题