测试库模块
如果您的模型包含来自库的模块实例,则您可以测试库中的源模块以及其他模型中的各个模块实例。您还可以测试为可重用库子系统生成的软件在环(SIL) 代码。首先,为库模块创建测试框架来测试您的设计。一旦库模块满足您的需求,就为链接模块创建测试框架并测试子系统实例。您可以将测试框架从库移动到实例,也可以将实例移动到库。
库测试工作流程
此过程概述了测试库子系统和链接子系统的示例工作流程。
为库子系统创建测试用例和测试框架。
测试库子系统。如果不符合您的需求,请修改设计并再次测试。
当测试通过时锁定库。
在您的模型中,创建一个链接子系统并保留库测试框架。
使用等效性测试用例将链接实例的输出与库模块的输出进行比较。
为链接实例创建额外的测试用例和测试框架。
如果您想要将测试框架包含在未来的链接子系统中,请将测试框架从链接子系统提升到库中。
库和链接子系统测试框架
库子系统的测试框架具有特定属性:
库不会编译,因此库子系统的测试框架不使用编译的属性,例如数据类型或采样率。
库子系统的测试框架不会为模块输入和输出生成转换子系统。
库子系统测试框架不使用推送或重建操作,因为库不使用配置参数。
当您从库子系统创建链接子系统时,测试框架会复制到链接实例。如果您不需要测试框架,您可以删除它们。有关从模型中删除所有测试框架的说明,请参阅 管理测试框架。
为链接子系统创建测试框架时,该框架将与链接子系统关联,而不是与库子系统关联。您可以将测试框架从链接子系统移动到库子系统。例如,这个链接子系统 Controller
有三个测试框架。要将 Requirements_Tests1
测试框架移动到库中:
单击链接子系统上的框架徽章。
单击框架操作 图标。
选择移至库。
对话框通知您移动框架会将其从链接的子系统中移除。
确认后,框架随库子系统一起出现。
从测试框架编辑库模块
您可以通过在测试框架中测试库模块并更新被测组件,将迭代设计和测试工作流程应用于库。当您关闭测试框架时,对被测组件的更改将同步到库中。
如果您有一个设计完整的库模块,请设置测试框架以防止对被测组件进行更改。您可以在创建测试框架时或创建框架之后设置此属性。参见 创建或导入测试框架并选择属性。
测试库和链接模块
验证库中和更大的系统中可重用的子系统。
此示例演示了确认库模块是否满足一组简短需求的测试用例。测试库模块后,执行链接模块的基线测试并捕获基线结果。然后将基线测试框架提升到库中。
库模块通过向风扇和压缩机提供开/关信号并指定热泵模式(加热或冷却)来控制简单的热泵系统。
打开测试文件
输入以下内容来存储示例的路径和文件名,并打开测试文件。测试文件包含库模块的测试用例和闭环模型中的模块实例的测试用例。
testFile = 'sltestHeatpumpLibraryTests.mldatx'; library = 'sltestHeatpumpLibraryExample'; system = 'sltestHeatpumpLibraryLinkExample'; sltest.testmanager.load(testFile); sltest.testmanager.view;
展开 Library Block Test 测试套件,并在测试浏览器中突出显示 Requirements Scenarios测试用例。展开在测系统的测试框架部分,然后点击箭头打开库模块的测试框架。
open_system(library); sltest.harness.open([library '/Controller'],'Requirements_Tests');
Test Sequence 模块为控制器设置了三种场景:
空闲时的控制器
控制器仅启动风扇
控制器启动加热和冷却系统
测试框架中的 Test Assessment 模块检查每个场景的信号。由于测试输入和评估包含在测试框架中,并且没有捕获基线数据,因此该测试用例是仿真测试。
运行基于需求的测试
在测试管理器中,运行 Requirements Scenarios 测试用例。verify
语句结果显示 control_out
信号通过。
打开链接模块模型
在测试管理器中,展开实例测试。突出显示基线测试测试用例。在在测系统中,点击模型字段旁边的箭头来打开模型。
sltest.harness.close([library '/Controller'], 'Requirements_Tests'); open_system(system); sim(system);
控制器是库的一个链接模块。它与测试框架基线测试相关联,该测试框架将实例的仿真结果与基线数据进行比较。在您的工作流程中,对库模块实例进行成功的基线测试可以表明链接模块在包含模型中正确仿真。测试框架提供正弦波温度并捕获控制器输出。
运行基线测试并观测结果
在测试管理器中,点击运行来执行测试。结果表明基线测试通过。
将测试框架移至库
如果您为链接模块开发了一个特别有用的测试,则可以将测试框架从链接模块提升到源库模块。然后,测试框架将复制到库模块的所有未来实例。
将 Baseline_controller_tests 测试框架移至库模块:
1.在 sltestHeatpumpLibraryLinkExample 模型中,点击框架徽章并将鼠标悬停在 Baseline_controller_tests 测试框架上。
2.单击框架操作图标
3.选择移至库。对话框通知您该操作将从实例中删除测试框架并将其添加到库中。点击是。
4.测试框架移至控制器库模块。
close_system(library,0); close_system(system,0); clear(library,system,testFile); sltest.testmanager.clear; sltest.testmanager.clearResults;
SIL 测试可重用库子系统
此示例显示如何对库中的可重用组件进行单元测试。它使用等效性测试来测试为子系统生成的软件在环(SIL) 代码。
可重用库子系统必须位于库的顶层,并且必须具有函数接口来锁定子系统接口。有关可重用子系统库、功能接口和工作流限制的信息,请参阅 Library-Based Code Generation for Reusable Library Subsystems (Embedded Coder)。
设置代码生成环境
orig = Simulink.fileGenControl('get','CodeGenFolderStructure'); Simulink.fileGenControl('set','CodeGenFolderStructure',... Simulink.filegen.CodeGenFolderStructure.TargetEnvironmentSubfolder);
打开可重复使用的库
该库在顶层包含一个子系统模块。
ReuseLibSubsysExample
建立图书馆
构建可重用库来生成代码并创建函数接口。代码生成完成后,您可以点击右下角的库打开管理函数接口对话框来查看函数接口。
slbuild('ReuseLibSubsysExample');
### Starting build procedure for: Double ### Generating code and artifacts to 'Target environment subfolder' folder structure ### Generating code into build folder: /tmp/Bdoc24a_2589924_3005566/tp061ba71d/simulinktest-ex98874249/IntelWin64/Double ### Invoking Target Language Compiler on Double.rtw ### Using System Target File: /mathworks/devel/bat/filer/batfs1904-0/Bdoc24a.2589924/build/matlab/rtw/c/ert/ert.tlc ### Loading TLC function libraries ....... ### Initial pass through model to cache user defined code . ### Caching model source code .............................................. ### Writing header file Subsystem_youz7xop.c ### Writing header file Double_types.h ### Writing header file Double.h ### Writing header file rtwtypes.h ### Writing header file Subsystem_youz7xop.h . ### Writing source file Double.c ### Writing header file Double_private.h ### Writing source file ert_main.c ### TLC code generation complete (took 3.878s). ### Saving binary information cache. ### Using toolchain: GNU gcc/g++ | gmake (64-bit Linux) ### Creating '/tmp/Bdoc24a_2589924_3005566/tp061ba71d/simulinktest-ex98874249/IntelWin64/_shared/rtwshared.mk' ... ### Using toolchain: GNU gcc/g++ | gmake (64-bit Linux) ### Creating '/tmp/Bdoc24a_2589924_3005566/tp061ba71d/simulinktest-ex98874249/IntelWin64/Double/Double.mk' ... ### Successful completion of code generation for: Double The following files will be copied from IntelWin64/_shared to /tmp/Bdoc24a_2589924_3005566/tp061ba71d/simulinktest-ex98874249/IntelWin64/ReuseLibSubsysExample/R2024a: Subsystem_youz7xop.c Subsystem_youz7xop.h shared_file.dmr Files copied from IntelWin64/_shared to /tmp/Bdoc24a_2589924_3005566/tp061ba71d/simulinktest-ex98874249/IntelWin64/ReuseLibSubsysExample/R2024a. ### Starting build procedure for: Single ### Generating code and artifacts to 'Target environment subfolder' folder structure ### Generating code into build folder: /tmp/Bdoc24a_2589924_3005566/tp061ba71d/simulinktest-ex98874249/IntelWin64/Single ### Invoking Target Language Compiler on Single.rtw ### Using System Target File: /mathworks/devel/bat/filer/batfs1904-0/Bdoc24a.2589924/build/matlab/rtw/c/ert/ert.tlc ### Loading TLC function libraries ....... ### Initial pass through model to cache user defined code . ### Caching model source code ............................................. ### Writing header file Subsystem_eTYyhzMa.c . ### Writing header file Single_types.h ### Writing header file Single.h ### Writing header file Subsystem_eTYyhzMa.h ### Writing source file Single.c . ### Writing header file Single_private.h ### Writing source file ert_main.c ### TLC code generation complete (took 4.371s). ### Saving binary information cache. ### Using toolchain: GNU gcc/g++ | gmake (64-bit Linux) ### Creating '/tmp/Bdoc24a_2589924_3005566/tp061ba71d/simulinktest-ex98874249/IntelWin64/_shared/rtwshared.mk' ... ### Using toolchain: GNU gcc/g++ | gmake (64-bit Linux) ### Creating '/tmp/Bdoc24a_2589924_3005566/tp061ba71d/simulinktest-ex98874249/IntelWin64/Single/Single.mk' ... ### Successful completion of code generation for: Single The following files will be copied from IntelWin64/_shared to /tmp/Bdoc24a_2589924_3005566/tp061ba71d/simulinktest-ex98874249/IntelWin64/ReuseLibSubsysExample/R2024a: Subsystem_eTYyhzMa.c Subsystem_eTYyhzMa.h shared_file.dmr Files copied from IntelWin64/_shared to /tmp/Bdoc24a_2589924_3005566/tp061ba71d/simulinktest-ex98874249/IntelWin64/ReuseLibSubsysExample/R2024a.
选择子系统组件并打开测试管理器
单击库模型中的子系统以选择它。然后,打开测试管理器。
sltestmgr
打开测试文件
在测试管理器中,点击打开并选择
ReuseLibSubsysTest.mldatx
文件。
启用覆盖率收集
在测试浏览器窗格中选择 ReuseLibSubsysTest。
然后,展开主窗格中的“覆盖率设置”部分。
在要收集的覆盖率中,选中记录在测系统的覆盖率。
在覆盖率度量中,检查是否选择了决策、MCDC 和条件。
打开创建模型组件测试向导
单击新建 > 模型组件测试以打开创建模型组件测试向导。
在向导的第一页上,点击 组件 字段旁边的使用当前选定的模型组件图标。组件 和 顶层模型 字段均已填写。
单击选择函数界面字段旁边的刷新图标,然后从下拉列表中选择 Double。
点击下一步。
选择测试输入
选择使用 Design Verifier 生成测试输入场景。
点击下一步。
选择如何测试组件
选择执行背靠背测试。
将 Simulation1 设置为普通模式。
将 Simulation2 设置为软件在环 (SIL) 模式。
点击下一步。
指定输入源、数据文件格式和测试文件
选择 Inports 作为测试框架输入源。
选择 MAT 作为文件格式。
选择将测试添加到当前选定的测试文件。
生成测试用例并返回给测试管理器
点击 Done,生成 Double 函数接口的 Double_harness1 测试用例。
测试用例生成完成后,Double_harness1 测试用例出现在测试管理器中。请注意,Simulation1 的仿真模式设置为普通,而 Simulation2 设置为软件在环 (SIL) 模式。
运行测试
单击运行。
查看等效性结果
展开结果以查看等效性准则结果。请注意,差异图显示两个信号之间没有差异,这表明普通和 SIL 仿真产生相同的结果。与可重用库子系统相关的 SIL 代码可被重用于其他 SIL 测试。
查看覆盖率结果
展开“聚合覆盖率”部分以查看覆盖率结果。两个显示 100% 的覆盖率结果是针对 Double 功能接口的等效性测试运行的。另外两个结果显示 0% 或无覆盖率,因为未测试 Single 功能接口。
清理
Simulink.fileGenControl('set','CodeGenFolderStructure',orig);