MATLAB 函数的模型覆盖率报告
收集模型的覆盖率后,您可以生成覆盖率报告,其中总结了覆盖率结果和每个模块的详细信息。如果您的模型包含 MATLAB Function 模块,您可以逐行查看模块内 MATLAB® 代码的覆盖率结果。对于每种类型的 MATLAB 函数,覆盖率分析看起来略有不同:
MATLAB Function 模块中 MATLAB 函数的覆盖率报告
考虑 MATLAB 函数 run_intersect_test
的模型覆盖率报告,它是在 MATLAB Function 模块内定义的。
链接函数名称下方是指向父 MATLAB Function 模块的报告部分的链接,其中包含 run_intersect_test
函数的代码。
该函数报告的上半部分总结了其模型覆盖率结果。run_intersect_test
的覆盖率度量包括决策、条件和 MCDC 覆盖率。您可以通过检查 run_intersect_test
的代码来了解这些度量。
包含覆盖率元素的行以突出显示的行号标记:
第 1 行接收决策覆盖率,指示顶层函数
run_intersect_test
是否执行。第 6 行接收
if
语句的决策覆盖率。第 14 行接收决策覆盖率,指示局部函数
rect_intersect
是否执行。第 27 行和第 30 行接收
if
语句和条件的决策、条件和 MCDC 覆盖率。第 30 行的条件
right1 < left2
显示为红色,表示该条件未评估其所有可能的结果。覆盖率报告显示覆盖率分析中哪些结果仍未得到满足。
覆盖率报告包括每一行代码的详细信息。点击链接即可打开编辑器并查看报告中的相关行。
覆盖率摘要
覆盖率详细信息窗格显示总结整个 run_intersect_test
函数覆盖率的度量。
覆盖率摘要的结论是:
行报告中针对
run_intersect_test
报告了八个决策结果:第 1 行一个(已执行)
第 6 行两个(
true
和false
)第 14 行一个(已执行)
第 27 行两个 (
true
和false
)第 30 行两个 (
true
和false
)。
每一行的决策覆盖率均显示 100% 的决策覆盖率。这个结果意味着
run_intersect_test
的决策覆盖率是八种可能结果中的八种,即 100%。行报告中报告了
run_intersect_test
的四种情况。第 27 行和第 30 行各有两个条件,每个条件又有两个条件结果(true
和false
),run_intersect_test
总共有 8 个条件结果。除第 30 行(right1 < left2
)的第一个条件外,所有条件的true
和false
结果测试均为正。这意味着run_intersect_test
的条件覆盖率是八分之七,即 88%。决策行 27 和 30 的 MCDC 覆盖率表分别列出了每种情况下的两种决策反转情况,总共有四种可能的逆转。在仿真中,只有第 30 行条件
right1 < left2
的评估从true
变为false
的决策反转没有发生。这意味着在仿真中测试了四种可能的逆转情况中的三种,即 75%,覆盖率为 75%。
第 1 行的覆盖率
每个配置为进行代码生成的 MATLAB 函数的第一行都作为一个决策接收覆盖率分析。该决策表明该函数是作为对被调用的响应而执行的。
run_intersect_test
的覆盖率报告显示 100% 决策覆盖率,这表明该函数至少执行了一次。决策表还显示该函数执行了十一次。
第 6 行的覆盖率
分析的决策表表明第 6 行的决策 if isempty(x1)
共执行了 11 次。该决策在一个时间步中被评估为 true
,在十个时间步中被评估为 false。由于两种可能的结果都发生了,因此决策覆盖率为 100%。
第 14 行的覆盖率
分析的决策表表明局部函数 rect_intersect
在测试期间执行,因此获得了 100% 的覆盖率。
第 27 行的覆盖率
分析的决策表表明第 27 行的决策有两种可能的结果,true
和 false
。表达式执行了十一次,其中五次决策结果为 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
。由于 true
和 false
结果均已实现,因此第 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™ 函数,则可以测量覆盖率:
sldv.condition
(Simulink Design Verifier)sldv.test
(Simulink Design Verifier)sldv.assume
(Simulink Design Verifier)sldv.prove
(Simulink Design Verifier)
对于此示例,考虑一个包含 MATLAB Function 模块的模型。
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.condition
和 sldv.test
函数的覆盖率。对于 sldv.condition
,表达式 u > -30
计算为 true
51 次。对于 sldv.test
,表达式 u == 30
计算为 true
51 次。
有关 Simulink Design Verifier 模块的模型覆盖率数据示例,请参阅目标和约束覆盖率。
外部文件中 MATLAB 函数的覆盖率报告
使用 MATLAB 函数的模型覆盖率报告 中的相同模型,假设 MATLAB 函数 run_intersect_test
和 rect_intersect
存储在名为 run_intersect_test.m
的外部 MATLAB 文件中。
要在外部文件中收集 MATLAB 函数的覆盖率,请在配置参数对话框的覆盖率窗格中选择 MATLAB 文件的覆盖率。
仿真后,模型覆盖率报告摘要包含顶层模型和外部函数的部分。
run_intersect_test.m
的模型覆盖率报告报告的覆盖率数据与 MATLAB Function 模块中存储的函数的覆盖率数据相同。
有关外部文件中 MATLAB 函数的模型覆盖率报告的详细示例,请参阅外部 MATLAB 文件覆盖率报告。