背靠背等效性测试
此示例说明如何对整个模型创建并运行背靠背测试,以比较普通模式仿真和软件在环 (SIL) 仿真的结果。背靠背测试(或称等效性测试)用于检验生成代码是否产生与模型仿真相同的结果。此类型的测试还可以暴露覆盖率缺失,并增强对生成代码按预期运行的信心。实现并测试功能需求,验证从模型生成的代码以及实现模型与代码 100% 覆盖率是符合软件和安全标准及认证(例如 ISO 26262 和 IEC 61508)的核心环节。
此示例仅展示模型测试和 SIL 测试。SIL 仿真在您的开发计算机上编译并运行生成的代码。处理器在环 (PIL) 仿真先在您的开发计算机上交叉编译源代码,然后将目标代码下载到目标处理器或等效指令集仿真器上运行。为了实现完全合规性,您还需要执行 PIL 测试。有关详细信息,请参阅配置并运行 PIL 仿真 (Embedded Coder)和SIL and PIL Limitations (Embedded Coder)。
普通模式仿真与生成代码的测试结果可能因数值差异(例如比较浮点值时的容差差异)而存在差异。时滞或编译器问题也可能导致代码与仿真之间存在差异。背靠背测试中不匹配的结果可以暴露一个或多个现有问题,您可以修复这些问题,使模型和生成代码符合适用的行业标准及认证。
此示例中的 sf_boilerController 模型包含一个 Stateflow 图,用于对锅炉的温度控制器进行建模。该模型派生自Bang-Bang 温度控制系统建模 (Stateflow) 示例。
打开模型和测试管理器
打开模型。然后打开测试管理器,并清除之前加载的测试文件和结果。
Model = "sf_boilerController";
open_system(Model)
sltest.testmanager.view
sltest.testmanager.clear
sltest.testmanager.clearResults打开“为模型组件创建测试”向导
在测试管理器中,选择新建 > 为模型组件创建测试,以打开“为模型组件创建测试”向导。
指定要测试的模型和组件
1.在“系统”选项卡中,点击“使用当前模型”按钮
,以将模型添加到顶层模型字段。
2.在左窗格中,选择顶层模型 sf_boilerController 以选择整个模型。
3.点击“添加”按钮
,以将模型添加到选择的组件窗格。
4.点击下一步。

指定测试输入
在“测试输入”选项卡中,使用默认设置使用来自顶层模型的组件输入作为测试输入。然后点击下一步。

指定组件测试方式
在“验证策略”选项卡中,指定创建背靠背测试。
1.选择执行背靠背测试。
2.确保仿真 1 设置为 Normal 并且仿真 2 设置为 Software-in-the-Loop (SIL)。然后点击下一步。

指定输入、文件格式和文件位置
在“生成的测试”选项卡中,指定输入源、文件格式以及测试数据和生成的测试的保存位置。
1.确保选择测试框架输入源: 为 Inports。
2.将指定文件格式更改为 Excel。将输入保存为 Excel 文件可以在 Simulink 外部查看并手动编辑文件内容。
3.使用位置的默认值来保存测试数据和生成的测试。
4.点击完成。
“为模型组件创建测试”向导会执行以下操作:为图的输出设置信号记录,对模型进行仿真,捕获信号,以及创建测试框架和测试用例。它还会创建 Excel 输入文件 sltest_sf_boilerController.xlsx 和测试文件 sltest_sf_boilerController_tests.mldatx。

检查仿真模式
1.在测试管理器的测试浏览器窗格中,选择向导创建的测试用例 sf_boilerController_Harness1。向导会自动将测试用例名称设置为 model name_associated test harness name。
2.在右窗格中,展开仿真 1 部分,然后展开仿真设置和版本覆盖。检查并确保仿真模式参数为 Normal。

3.展开仿真 2 部分及其仿真设置和版本覆盖。检查并确保其仿真模式参数为 Software-in-the-Loop (SIL)。

设置要收集的覆盖率
1.在测试浏览器窗格中,选择测试文件 sltest_sf_boilerController_tests。
2.在右窗格中,展开覆盖率设置。您只能在测试文件级别设置覆盖率。覆盖率设置会传播到文件中的测试用例。
3.选中记录在测系统的覆盖率和记录引用模型的覆盖率以启用覆盖率收集。
4.在覆盖率度量下,选中决策、条件和 MCDC。大多数认证标准(包括 ISO 26262)都要求使用这些度量。
决策覆盖率分析模型中的决策点。决策是模型中的一个位置,在该位置处由一个或多个输入信号决定模块的输出信号。决策覆盖率确定所有决策是否均被测试到。
条件覆盖率分析输出其输入的逻辑组合的模块以及 Stateflow 转移。对于此示例,当测试用例使 Stateflow 转移上的每个条件在仿真期间至少一次为 true,至少一次为 false 时,该测试用例便实现了全覆盖。
MCDC(修正条件/决策覆盖率)扩展了决策覆盖率和条件覆盖率。它分析决策内的每个条件是否独立地影响决策结果以及至少被计算出一次所有可能的结果。对于此示例,MCDC 分析 Stateflow 转移。
有关覆盖率和覆盖率度量的详细信息,请分别参阅模型覆盖率 (Simulink Coverage)和模型覆盖率类型 (Simulink Coverage)。

运行测试用例并查看结果
1.选择测试用例 sf_boilerController_Harness1,然后点击工具栏中的运行按钮。测试运行时,左窗格会显示结果和工件窗格。
2.测试完成后,点击结果和工件窗格中的 Results 以更新右窗格。
聚合覆盖率结果部分显示 SIL 模式仿真的代码覆盖率以及普通模式仿真的模型中功能元素的覆盖率。普通仿真模式和 SIL 仿真模式的覆盖率均低于 100%,这表明并非所有代码和模型路径都在测试期间被执行。函数覆盖率度量不适用于普通仿真模式。

增加覆盖率
可以使用 Simulink Design Verifier 来增加覆盖率。运行测试并收集覆盖率后,Simulink Design Verifier 可以生成具有不同输入的新测试用例,以测试模型中未测试到的部分。
1.在聚合覆盖率结果表的仿真模式列中,点击普通。
2.在该表下方,点击针对缺失覆盖率添加测试。
3.在“针对缺失覆盖率添加测试”对话框中,将测试用例设置为 <Create a new test case>。
4.将测试类型设置为 Equivalence Test。

5.将其他字段保留默认值。点击确定。Simulink Design Verifier 会创建新的测试套件、测试用例和测试迭代。测试浏览器会显示新的测试套件和测试用例 New Test Case 1。
6.选择 New Test Case 1 并展开 New Test Case 1 的迭代部分以查看其迭代。
设置仿真模式,运行新测试用例,并查看更新后的覆盖率
1.展开仿真 1 和仿真设置和版本覆盖。将仿真模式更改为 Normal。
2.展开仿真 2 和仿真设置和版本覆盖。将仿真模式更改为 Software-in-the-Loop (SIL)。
3.点击工具栏中的运行按钮。
4.测试运行完成后,点击结果和工件面板中的最新 Results 以更新右窗格。
5.查看聚合覆盖率结果,普通模式的覆盖率为 100%,但 SIL 模式的决策度量的覆盖率结果仅为 94%。此模型的缺失决策覆盖率是由当值超出指定范围时计算 false 条件的代码导致的。代码生成器添加了整数溢出保护,以减少测试用例计算所有 false 值所需的时间,该时间原本会非常长。

申述并过滤缺失覆盖率
您可以针对要标记为未满足覆盖率的代码行或模型元素提供申述理由。用于对可能产生低于 100% 覆盖率的覆盖率结果进行申述的原因包括代码生成优化、代码替换库、错误条件和防御性代码。
1.点击 SIL 仿真对应的报告列中的“创建聚合覆盖率报告”箭头,以创建 SIL 覆盖率摘要报告。

2.在 sf_boilerController 的 SIL 覆盖率摘要报告中,转至 5.1 决策 localDW->temporalCounter_i1 < 31U(第 90 行)部分。这是导致决策覆盖率结果较低的两行代码之一。指定范围内的整数值数量有限,因此 true 结果的覆盖率为 100%,但 false 结果的可能值数量无限,测试起来需要非常长的时间,因此 false 结果不能被视为达到 100% 覆盖率。
3.点击突出显示的 false 结果旁边的申述或排除链接或“添加申述规则”图标,以打开过滤器资源管理器。

4.在过滤器资源管理器的过滤器规则中,将显示的代码行的模式更改为 Justified。添加“生成代码中的整数溢出保护只能通过不切实际的长时间测试用例来执行”作为申述的理由。有关覆盖率过滤的信息,请参阅覆盖率过滤 (Simulink Coverage)和覆盖率过滤器规则和文件 (Simulink Coverage)。

5.点击应用,然后在“保存过滤器文件”对话框中,输入 boilerController_covfilter 作为覆盖率过滤器 (.cvf) 文件的名称,然后点击保存。
6.在 sf_boilerController 的 SIL 覆盖率摘要报告中,请注意 5.1 部分现在标记为已申述,其覆盖率为 100%,并且表中的 false 行以浅蓝色突出显示。

7.转至报告中的 5.2 决策 localDW->temporalCounter_i2 < 63U(第 94 行)部分,并重复步骤 3 和 4,以对 false 决策的缺失覆盖率进行申述。使用与 5.1 部分相同的理由。
8.点击应用以更新 boilerController_covfilter.cvf 覆盖率过滤器文件和 SIL 覆盖率报告。报告的“摘要”部分显示 100% 覆盖率,覆盖率百分比条的浅蓝色部分表示已申述的覆盖率。在测试管理器中,聚合覆盖率结果显示更新后的覆盖率,覆盖率过滤器文件列在“覆盖率过滤器”部分中。

9.在覆盖率过滤器窗格的底部,点击更新测试文件以将覆盖率过滤器追加到测试文件。
查看等效性的仿真输出结果
展开结果 > 新建测试套件 1 > 迭代1,然后选择等效性准则结果。然后,在嵌入式仿真数据检查器的比较选项卡中,选择 Outport:1 信号。

上面的图显示了普通模式和 SIL 模式的输出,两者重叠。下面的图显示了输出信号之间的差值为零,因此普通模式和 SIL 模式仿真匹配。

清理
使用以下命令关闭模型并且关闭并清除测试管理器:
close_system(Model,0)
sltest.testmanager.clear
sltest.testmanager.clearResults
sltest.testmanager.close
另请参阅
sltest.testmanager.TestFile | sltest.testmanager.TestCase | Simulink 测试管理器
主题
- 为模型或组件生成测试和测试框架
- 导入等效性测试的测试用例
- 原子子系统的背靠背 (MIL/SIL) 等效性测试
- 配置并运行 SIL 仿真 (Embedded Coder)
- SIL/PIL Manager Verification Workflow (Embedded Coder)
- 使用 SIL/PIL 管理器的单元测试子系统代码 (Embedded Coder)