Main Content

本页采用了机器翻译。点击此处可查看英文原文。

Stateflow 图的模型覆盖率

如果您使用运行按钮仿真您的模型,则会自动生成模型覆盖率报告。如果您没有使用运行 按钮,或者您在没有仿真模型的情况下加载了覆盖率数据,请使用 cvhtml 生成模型覆盖率报告。

对于 Stateflow® 图,Simulink® Coverage™ 记录图本身的执行以及状态、转移决策以及组成每个决策的单独条件的执行。Simulink Coverage 还分析包含逻辑表达式的赋值语句。逻辑表达式是包含逻辑运算符的表达式,例如逻辑 AND (&&) 或逻辑 OR (||)。赋值语句可以位于图中的任何位置,包括状态进入或退出操作、转移操作等。

注意

模型覆盖率仅分析包含逻辑表达式的赋值语句,但代码覆盖率会分析所有布尔赋值语句。这种差异可能导致模型和代码覆盖率结果之间的差异。

仿真结束后,Simulink Coverage 会报告模型测试的彻底程度。报告显示:

  • 每个独占子状态由于父超状态历史而被执行或从其父超状态退出和进入的次数。当采取 during 操作时,子状态即被视为已执行。

  • 每个转移决策被评估为 true 或 false 的次数。

  • 每个条件被评估为 true 或 false 的次数。

注意

要测量 Stateflow 图的模型覆盖率数据,您必须:

  • 拥有 Stateflow 许可证。

  • 已为图启用调试/动画。

指定 Stateflow 图的覆盖率报告设置

从配置参数对话框的覆盖率窗格指定覆盖率记录设置。

启用覆盖率分析还可以选择不同的覆盖率度量。以下部分仅讨论影响 Stateflow 图报告的覆盖率度量。这些度量包括决策覆盖率、条件覆盖率和 MCDC 覆盖率。

Stateflow 图的模型覆盖率报告

模型覆盖率报告的以下部分是通过仿真 sf_boiler 模型生成的,其中包括 Bang-Bang Controller 图。此报告已启用 MCDC 的覆盖率度量。要打开模型,请在 MATLAB® 命令窗口中执行:

openExample("sf_boiler");

摘要报告部分

摘要部分显示整个测试的覆盖率结果,并出现在模型覆盖率报告的开头。

层次结构中的每一行总结了该级别及其以下级别的覆盖率结果。您可以点击超链接,跳转到报告中具有相同分配层次顺序号的后面部分,其中详细说明了该覆盖率及其子覆盖率。

顶层 sf_boiler 是 Simulink 模型本身。第二级,Bang-Bang Controller,是 Stateflow 图。下一级别是图中的超级状态,按照层次包含的顺序排列。每个超级状态都使用 SF:前缀。底层锅炉房模型是该模型的一个附加子系统。

子系统和图详细信息报告部分

在记录 Stateflow 图的覆盖率时,Simulink Coverage 软件会报告该图的两种覆盖率- 子系统和图。

  • 子系统 - 此部分报告图的覆盖率:

    • 覆盖率(此对象):作为容器对象的图覆盖率数据

    • 覆盖率(包括)后代:图的覆盖率数据以及图中的状态和转移。

    如果您点击部分标题中的子系统名称的超链接,Bang-Bang 控制器模块将在模块图中突出显示。

    决策覆盖率不适用(NA),因为此图没有明确的触发器。条件覆盖率和 MCDC 不适用于(NA)图,但适用于其后代。

    Coverage results for the Bang-Bang Controller subsystem report that the subsystem receives 71% decision coverage (10 out of 14 condition outcomes satisfied), 95% decision coverage (21 out of 22 decision outcomes satisfied), and 43% MCDC coverage (3 out of 7 conditions independently affected the decision outcome).

  • - 此部分报告图的覆盖率:

    • 覆盖率(此对象):图及其输入的覆盖率数据

    • 覆盖率(包括)后代:图的覆盖率数据以及图中的状态和转移。

    如果您点击部分标题中的图名称的超链接,则图将在 Stateflow 编辑器中打开。

    列出了图及其后代的决策覆盖率。条件覆盖率和 MCDC 不适用于(NA)图,但适用于其后代。

    Coverage results for the Bang-Bang Controller chart report that the chart receives 71% decision coverage (10 out of 14 condition outcomes satisfied), 95% decision coverage (21 out of 22 decision outcomes satisfied), and 43% MCDC coverage (3 out of 7 conditions independently affected the decision outcome).

状态详细信息报告部分

对于图中的每个状态,覆盖率报告都包含一个状态部分,其中记录了该状态的覆盖率的详细信息。

sf_boiler 模型中,状态 On 位于框 Heater 中。On 是一个超状态,它包含:

  • 两个子状态 HIGHNORM

  • 一个历史结点

  • 函数 warm

覆盖率报告包含有关状态 On状态部分。

Coverage results for the "On" state report that the state receives 83% decision coverage (5 out of 6 decision outcomes satisfied) for the state excluding its descendants, and receives 88% decision coverage (7 out of 8 decision outcomes satisfied) for the state including its descendants.

On 状态的决策覆盖率测试执行哪个子状态的决策。

报告中列出了这三项决策:

  • 子状态已执行下,当 On 执行时要执行哪个子状态。

  • 父级退出时子状态退出下,当 On 退出时哪个子状态处于活动。当 On 退出时,NORM 被列为永不活动,因为覆盖率工具将从 NORMOff 的超转移视为从 OnOff 的转移。

  • 由于历史记录而进入先前活动的子状态下,当 On 重新执行时要重新进入哪个子状态。历史连接点记录了先前活动的子状态。

因为每个决策都可能导致 HIGHNORM,所以总共可能的结果是 3 × 2 = 6。结果表明,在仿真中测试了六种可能的结果中的五种。

循环复杂度和决策覆盖率也适用于 On 状态的后代。条件 [warm()] 从 HIGH 到 NORM 的转移所需的决策使可能的决策结果总数达到 8。对于某个状态,条件覆盖率和 MCDC 不适用(NA)。

注意

组成圈复杂度计算的节点和边与模型对象(状态、转移等)没有直接关系。相反,该计算需要等效控制流的图形表示。

转移详细信息报告部分

转移报告显示在其所属对象的报告部分下。转移不会出现在摘要部分的模型层次结构中,因为该层次结构基于拥有其他 Stateflow 对象的超状态。

Coverage results for the "after(40,sec)[cold()]" transition report that the transition receives 67% condition coverage (4 out of 6 condition outcomes satisfied), 100% decision coverage (2 out of 2 decision outcomes satisfied), and 33% MCDC (1 out of 3 conditions independently affect the decision outcome).

此转移的决策取决于 40 秒的时间延迟和条件 [cold()]。如果经过 40 秒的延迟后,环境变冷(cold() = 1),则决策执行此转移并打开加热器。对于其他时间间隔或环境条件,则决策不执行。

对于决策覆盖率,既有 true 结果,也有 false 结果。由于发生了两种决策结果中的两种,因此覆盖率是全覆盖或 100%。

条件覆盖率表明,仅测试了 6 个条件结果中的 4 个。时间逻辑语句 after(40,sec) 代表两种情况:sec 的发生和时间延迟 after(40,sec)。因此,转移时存在三个条件:secafter(40,sec)cold()。由于每个决策都可能为 true 或为 false,因此存在六种可能的条件结果。

分析的条件表将每种条件显示为一行,并记录每种结果(true 或 false)的发生次数。未发生可能结果的决策行以阴影表示。例如,第一行和第三行没有记录 false 结果的发生。

在 MCDC 报告中,将扫描所有转移条件的发生集,以便为每个满足以下条件的条件找到一对特定的决策:

  • 条件从 true 到 false 变化。

  • 影响决策结果的所有其他条件保持不变。

  • 决策的结果可能为 true、false,也可能为 false。

对于由隐含的 AND 运算符关联的三个条件,只要这些条件的出现就能满足这些准则。

测试的条件

True 结果

False 结果

1

TTT

Fxx

2

TTT

TFx

3

TTT

TTF

请注意,在每一行中,测试的条件从 true 变为 false,而其他条件保持不变。不相关的贡献者用“x”编码(如下所述)。如果测试期间出现两种结果,则测试条件的覆盖率是完整的(100%)。

上述报告示例仅显示条件 2 的覆盖率。条件 1 和 3 所需的 false 结果并未发生,并且在两种条件下都用括号表示。因此,条件行 1 和 3 被阴影显示。虽然条件 2 已经过测试,但条件 1 和 3 尚未测试,且 MCDC 为 33%。

对于某些决策,某些条件的值在某些情况下是无关的。例如,在决策 [C1 & C2 & C3 | C4 & C5] 中,如果条件 C1C2C3 中任何一个为 false,则 | 的左边也为 false。如果 C4C5 为 false,则右侧结果也同样适用。当寻找通过改变一个条件来改变决策结果的匹配对时,保持其余一些条件不变是无关紧要的。在这些情况下,MCDC 报告会用“x”标记这些 case,以表明它们与结果无关。这些情况如图所示。

考虑第一个匹配的对。由于条件 1 在 True 结果列中为 true,因此它在匹配的 False 结果列中必定为 false。这使得条件 C2C3 与 false 结果无关,因为如果 C1 为 false,则 C1 & C2 & C3 始终为 false。而且,由于需要将 false 结果评估为false,因此 C4 & C5 的评估也必须为错误。在这种情况下,发现匹配项 C4 = F,使得条件 C5 无关紧要。

Stateflow 图中 C/C++ 代码的代码覆盖率

如果您的 Stateflow 图包含自定义 C/C++ 代码,Simulink Coverage 可以记录代码覆盖率。有关更多信息,请参阅Simulink 模型中自定义 C/C++ 代码的覆盖率

Stateflow 状态转移表的模型覆盖率

状态转移表是 Stateflow 中表达模态逻辑的另一种方式。Stateflow 图以图形方式表示模态逻辑,而状态转移表可以以表格形式表示等效的模态逻辑。有关更多信息,请参阅状态转移选项卡 (Stateflow)

状态转移表的覆盖率结果与等效 Stateflow 图的覆盖率结果相同。例如,考虑 slvnvdemo_covfilt 示例模型的模式逻辑图中的时间逻辑表达式 after(4, tick)

当在图或状态转移表中使用 C 作为动作语言时,after(4, tick) 转移代表两种情况:tick 的发生和时间延迟 after(4, tick)。由于时间事件 tick 永远不会为 false,因此第一个条件无法满足,并且无法实现转移 after(4, tick) 的 100% 条件和 MCDC 覆盖率。

当使用 MATLAB 作为动作语言时,after(4, tick) 转移代表单一决策,而没有 tick 发生的子条件。图或转移表仅报告决策覆盖率。