Main Content

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

代码覆盖率报告

如果您使用 SIL/PIL 管理器应用程序中的运行 按钮以软件在环(SIL) 或处理器在环(PIL) 模式仿真模型,Simulink® Coverage™ 将为从名为 model_name_cov.html 的指定模型生成的代码创建代码覆盖率报告。还有其他方法可以创建代码覆盖率报告,例如收集包含自定义 C/C++ 模块(如 S-Function 或 C Caller 模块)的模型的模型覆盖率。有关报告类型的更多信息,请参阅覆盖率报告的类型

对于在 SIL/PIL 模式下运行的模型,代码覆盖率报告也会在覆盖率详细信息窗格中自动打开。

要访问 sldemo_fuelsys 模型,请在 MATLAB® 命令窗口中执行:

openExample("sldemo_fuelsys");
有关分析覆盖率的更多信息,请参阅生成模型的覆盖率结果

分析信息

分析信息部分包含有关所分析模型或文件的基本信息:

Code Coverage Summary Report for sldemo_fuelsys.

  1. 覆盖率数据信息 - 显示用于收集覆盖率数据的 MATLAB 发布版本。

  2. 模型信息 - 显示一些模型元数据,例如版本号、作者以及上次保存的日期和时间。

  3. 框架信息 - 如果您从 Simulink Test™ 框架收集覆盖率,则会出现。它提供了有关所用框架的一些信息。

  4. 文件信息 - 显示有关代码生成期间生成的文件的一些数据。

  5. 覆盖率选项 - 显示分析覆盖率时的配置参数选择值。如果应用了过滤器,过滤器名称也会出现在这里。

  6. 从覆盖率分析中滤除的对象 - 显示覆盖率过滤器文件的名称和完整路径、从覆盖率分析中过滤掉的所有表达式或覆盖率目标结果,以及过滤它们所指定的理由。

聚合测试

如果您执行以下操作,则会出现聚合测试部分:

  • 通过 Simulink Test 管理器记录至少两个测试用例的聚合覆盖率结果,并针对聚合结果生成覆盖率报告,或者

  • 在覆盖率结果资源管理器中生成累计覆盖率结果的覆盖率报告。

如果您通过 Simulink Test 管理器运行测试用例,则聚合测试部分将链接到 Simulink Test 管理器中的相关测试用例。

如果您通过结果资源管理器聚合测试用例结果,则聚合的测试部分将链接到结果资源管理器中相应的 cvdata 节点。

对于聚合测试部分中的每次运行,都有一个指向 Simulink Test 管理器或覆盖率结果资源管理器中相应结果的链接。

聚合单元测试

如果您记录一个或多个子系统框架的覆盖率,则“聚合测试”部分会列出每个单元测试运行。

每个在测单元都会收到一个序数 n,在测单元的每个测试都会收到一个序数 m,格式为 Un.m。

Aggregated Tests: Run U1.1 executes test "Switch2 Unit Test - In Range." Run U1.2 executes test "Switch2 Unit Test - Out of Range." Run T1 executes test "Switches Integration Test - In Range." Run T2 executes test "Switches Integration Test - Out of Range."

摘要

覆盖率摘要包含两个小节:

Summary section of code coverage report showing coverage summaries: Decision, Condition, MCDC, Statement, Function, Function call, and Relational Boundary coverage for 11 files and/or functions.

测试

测试部分包含每个测试用例的仿真开始和停止时间以及仿真之前的任何设置命令。每个测试用例的标题包括使用 cvtest 命令指定的任何测试用例标签。仅当报告不包含 聚合测试 部分时才显示此部分。

摘要

摘要部分包含文件和函数报告的代码覆盖率结果摘要。要查看特定文件或函数的详细结果,请在摘要子部分中点击文件或函数名称。

每个文件和函数在摘要表中都有一行。摘要表的第一列表示该文件或函数的圈复杂度。例如,文件 sldemo_fuelsys.c 的圈复杂度为 123。然后,每个后续列都标有其适用的覆盖率度量。每列显示某个度量的覆盖率结果,以满足的覆盖率目标结果的度量。条形图的蓝色部分表示满意的目标结果,条形图的粉色部分表示缺失覆盖率。已申述的目标结果以条形图的浅蓝色或青色部分表示。您可以在示例图片的第 2... look1_binlx 行中看到已申述的目标

详细信息

详细信息部分报告详细的代码覆盖率结果。详细信息部分的每个子部分显示所分析代码中的文件或函数的结果摘要。

您可以通过左键点击模型对象来访问模型对象详细信息(按模型对象) 子部分。

文件详细信息

文件详细信息部分包含整个代码文件的结果摘要,后面是函数列表。点击函数名称即可转到详细信息的适用子部分。

例如,如果在 SIL 模式下运行模型 sldemo_fuelsys,则生成的代码位于 sldemo_fuelsys.c

Details section of coverage report which shows sldemo_fuelsys.c and a list of functions, followed by a list of metrics with achieved coverage percentages for each metric applicable to the entire C code file.

文件子部分中的覆盖率百分比是文件中包含的每个函数的总覆盖率。您可以点击某个函数名称来查看其具体的覆盖率详细信息。

函数详细信息

每个函数详细信息部分包含该函数的测试覆盖率结果摘要、其包含的表达式列表以及指向父文件和关联模型对象的链接。

下图显示了 sldemo_fuelsys 示例模型的 SIL 模式仿真的 rt_ertODEUpdateeContinuousStates 函数的覆盖率结果。

Details section of the code coverage report for Function rt_ertODEUpdateContinuousStates (line 252) in the sldemo_fuelsys example model.

需求测试详细信息

如果您在 Simulink Test 中运行至少两个与 Requirements Toolbox™ 中的需求相关联的测试用例,则聚合覆盖率报告会详细说明模型元素、测试用例和链接需求之间的联系。

需求测试详细信息部分包括:

  • 已实现的需求 - 哪些需求与模型元素相关。

  • 通过测试验证 - 哪些测试验证了需求。

  • 关联的运行 - 哪些运行与每个验证测试相关。

Switch block Switch1 links to the requirement "Enable Switch Detection" which is verified by test "Enable button" in run "U1.1"

有关如何在覆盖率报告中将覆盖率结果追踪到需求的示例,请参阅追踪覆盖率结果是否符合需求

圈复杂度

您可以指定模型覆盖率报告在报告的两个位置包含圈复杂度数字:

  • 摘要部分包含模型层次结构中每个对象的圈复杂度数字。对于一个文件或函数来说,该数字包括其所有后代的圈复杂度数字。

    Summary section of code coverage report cropped to show only file/function names and their associated cyclomatic complexity numbers.

  • 每个对象的详细信息部分列出了所有单个对象的圈复杂度数字。

    Details section of the code coverage report for Function rt_ertODEUpdateContinuousStates (line 252) in the sldemo_fuelsys example model, cropped to highlight the location of the cyclomatic complexity metric.

分析的决策

代码覆盖率报告包含函数内每个决策的部分。分析的决策表列出了决策的可能结果以及每次测试仿真中该结果出现的次数。未发生的结果以红色突出显示的表行表示。默认情况下,您不会看到获得 100% 决策覆盖率的决策的分析的决策表。有关覆盖率报告选项的更多信息,请参阅从结果浏览器访问覆盖率数据

Details section of the code coverage report for the function rt_remd (line 329) showing 50% decision coverage in the decisions analyzed table.

在这个例子中,决策 u1 < 0.0 对于每个时间步都是 false,因此决策获得 50% 的决策覆盖率。

点击函数链接 rt_remd 向上滚动到显示函数结果的详细信息部分。点击模型对象链接 sldemo_fuelsys 将打开显示覆盖率显示的模型。

条件分析

分析条件表列出了函数或文件中每个条件的 true 和 false 条件结果出现的次数。

Details section of the code coverage report for the expression (u1 != 0.0) && (u1 != u1_0) (line 339) showing 50% condition coverage in the conditions analyzed table.

在这个例子中,u 不等于 0u != 0.0 的条件在每个时间步中都是 trueu 不等于 u1_0u1 != u1_0 的条件在每个时间步中都是 false。因此,每个条件都获得 50% 的条件覆盖率,从而导致父表达式的条件覆盖率为 50%。

MCDC 分析

MCDC 分析表列出了 MCDC 条件 case,以及测试用例对构成每个决策的条件的覆盖程度。为了实现决策的完全 MCDC 覆盖率,分析必须确定每个条件都独立地影响决策结果。

Details section of the code coverage report for the expression (u1 != 0.0) && (u1 != u1_0) showing 0% MCDC in the MCDC analysis table.

MCDC 分析表显示了 Simulink Coverage 分析的父表达式中的每个子表达式的 MCDC 覆盖率。在这个例子中,父表达式为 (u1 != 0.0) && (u1 != u1_0),MCDC 分析表中呈现的子表达式为 u1 != 0.0u1 != u1_0

在 MCDC 分析表中,Decision/Condition 列表示决策的每个决策输入。接下来的两列输出 True输出 False 分别表示导致表达式返回 truefalse 的值组合,其中 TtrueFfalse,而 x 表示由于逻辑短路,条件结果无关紧要。

注意

当您从模型生成 C 或 C++ 代码时(例如通过在软件在环(SIL) 模式下仿真模型),生成的代码会使用短路逻辑运算符来提高生成代码的执行速度。禁用模型覆盖率分析的逻辑短路可能会导致模型和代码覆盖率结果之间出现差异。

粗体字符是需要独立影响决策结果以满足 MCDC 分析表的该单元格的字符。

表达式周围的括号表示覆盖率分析期间未出现指定的输入组合。也就是说,该测试用例没有覆盖到相应的条件 case。

根据分析期间使用的 MCDC 定义,某些模型元素实现的 MCDC 覆盖率较低。有关分析过程中使用的 MCDC 定义如何影响覆盖率结果的更多信息,请参阅Simulink Coverage 中的修改条件和决策覆盖 (MCDC) 定义

累计覆盖率

记录连续的覆盖率结果后,您可以在覆盖率结果资源管理器中进行访问、管理和聚合覆盖率结果。默认情况下,每次仿真的结果都会保存并累积记录在报告中。

如果在覆盖率结果资源管理器的设置窗格中选择显示累积进度报告,累计覆盖率报告所有表最右侧区域的结果将反映运行总值。该报告的组织方式使您可以轻松地将最近运行的附加覆盖率与会话中所有先前运行的覆盖率进行比较。

累计覆盖率报告包含以下信息:

  • 当前运行 - 刚刚完成的仿真的覆盖率结果。

  • Delta - 刚刚完成的仿真所实现的累计覆盖率中添加的覆盖率百分比。如果前一次仿真的累计覆盖率和当前覆盖率非零,则如果新覆盖率未添加到累计覆盖率中,则增量可能是 0。

  • 累计 - 截至刚刚完成的仿真为止,模型收集的总覆盖率。

运行三个测试用例之后,摘要报告显示第三个测试用例实现的额外覆盖率以及前两个测试用例实现的累计覆盖率。

Summary section of code coverage report showing extra columns. The current run, delta, and cumulative coverage summaries are displayed, resulting in 23 total columns.

分析的决策

累计覆盖率的分析的决策表包含三列关于决策结果的数据,分别代表当前运行、自上次运行以来的增量和累积数据。

例如,在 u < 0.0 的决策表中,决策在运行 1 的每个时间步中都是 false,而在运行 2 中保持不变,因此列 #2 没有为决策增加额外的覆盖率,导致运行 1 和总体的决策覆盖率均为 50%。

条件分析

条件分析表使用列标题 #n T#n F 来指示单个测试用例的结果。该表使用 T 合计F 合计作为累积结果。您可以识别每个测试用例相应模块的每个输入端口上的 true 和 false 条件。

例如,图中条件表显示了一个累计覆盖率结果的分析的条件表。在运行 1 期间的每个时间步中,条件 u != 0.0 都是 true,而在运行 2 中没有变化,因此总条件覆盖率为 50%。在运行 1 期间的每个时间步中,条件 u1 != u1_0 都是 false,而运行 2 中没有变化,导致总条件覆盖率为 50%。

MCDC 分析

MCDC 分析 #n 输出 True#n 输出 False 列显示每个测试用例的条件 case。T 输出合计F 输出合计列显示累积结果。

注意

您可以在命令行计算可重用子系统和 Stateflow® 构造的累计覆盖率。有关更多信息,请参阅获取可重用子系统的累积覆盖率

关系边界分析

累计覆盖率的分析的关系边界表包含三列关于关系边界结果的数据,分别代表当前运行、自上次运行以来的增量和累积数据。

例如,针对表达式 rtmIsMajorTimeStep(rtM) 分析的关系边界显示,运行 1 的关系边界覆盖率为 67%,而运行 2 没有增加额外的覆盖率,因此总的关系边界覆盖率为 67%。

关系边界

如果您收集关系边界覆盖率,Simulink Coverage 会在代码覆盖率报告中为接收关系边界覆盖率的表达式创建一个关系边界表。该表适用于所涉及的显式或隐式关系运算。有关更多信息,请参阅关系边界覆盖率

下表显示了关系 input1 <= input2 的关系边界覆盖率报告。表的外观取决于操作数的数据类型。

整数

如果两个操作数都是整数(或者一个操作数是整数,另一个是布尔值),则表格如下所示。

Relational Boundary table for input1 - input2 showing a result of 0 for 51 out of 51 time steps, resulting in 33% relational boundary coverage.

对于关系运算如 operand_1 <= operand_2

  • 第一行以 operand_1 - operand_2 的形式表示两个操作数。

  • 第二行表示仿真过程中 operand_1 - operand_2 等于 -1 的次数。

  • 第三行表示仿真过程中 operand_1 等于 operand_2 的次数。

  • 第四行表示仿真过程中 operand_1 - operand_2 等于 1 的次数。

定点

如果其中一个操作数具有定点类型,而另一个操作数是定点或整数,则表格如下所示。LSB 表示最低有效位的值。有关更多信息,请参阅精度 (Fixed-Point Designer)。如果两个操作数的精度不同,则使用较小的精度值。

Relational Boundary table for input1 - input2 showing a result of -LSB for 51 out of 51 time steps, resulting in 33% relational boundary coverage.

对于关系运算如 operand_1 <= operand_2

  • 第一行以 operand_1 - operand_2 的形式表示两个操作数。

  • 第二行表示仿真过程中 operand_1 - operand_2 等于 -LSB 的次数。

  • 第三行表示仿真过程中 operand_1 等于 operand_2 的次数。

  • 第四行表示仿真过程中 operand_1 - operand_2 等于 LSB 的次数。

浮点

如果其中一个操作数具有浮点类型,则表格如下所示。tol 表示使用输入值和您指定的容差计算的值。如果您未指定容差,则使用默认值。有关更多信息,请参阅关系边界覆盖率

Relational Boundary table for input1 - input2 showing a result of [-tol.. 0) for 51 out of 51 time steps, resulting in 50% relational boundary coverage.

对于关系运算如 operand_1 <= operand_2

  • 第一行以 operand_1 - operand_2 的形式表示两个操作数。

  • 第二行显示了仿真过程中 operand_1 - operand_2 的值在 [-tol..0] 范围内的次数。

  • 第三行显示了在仿真仿真中 operand_1 - operand_2 的值在 (0..tol] 范围内的次数。

该表的外观根据模块中的关系运算符而变化。根据关系运算符,operand_1 - operand_2 等于 0 的值可以是:

  • 排除在关系边界覆盖率之外。

  • 包含在关系边界之上的区域内。

  • 包含在关系边界以下的区域内。

关系运算符报告格式说明
==[-tol..0)0 被排除。
(0..tol]
!=[-tol..0)0 被排除。
(0..tol]
<=[-tol..0]0 包含在关系边界以下的区域中。
(0..tol]
<[-tol..0)0 包含在关系边界上方的区域中。
[0..tol]
>=[-tol..0)0 包含在关系边界上方的区域中。
[0..tol]
>[-tol..0]0 包含在关系边界以下的区域中。
(0..tol]

0 包含在 <= 的关系边界之下,但包含在 < 的关系边界之上。该规则与决策覆盖率一致。例如:

  • 对于关系 input1 <= input2,如果 input1 小于或等于 input2,则判定为 true。<= 被分组在一起。因此,0 位于关系边界以下的区域。

  • 对于关系 input1 < input2,仅当 input1 小于 input2 时,判定才为 true。>= 被组合在一起。因此,0 位于关系边界上方的区域。

另请参阅

相关主题