主要内容

配置 S-Function 以生成测试用例

此示例说明如何编译 S-Function,使其与 Simulink® Design Verifier™ 兼容,以便生成测试用例。Simulink Design Verifier 支持符合以下条件的 S-Function:

  • 使用代码继承工具生成,并且 def.Options.supportCoverageAndDesignVerifier 设置为 true

  • 使用 SFunctionBuilder 生成,并且在 SFunctionBuilder 对话框的编译信息选项卡上选择了启用对 Design Verifier 的支持,或者

  • 使用函数 slcovmex (Simulink Coverage) 编译,并且传递了选项 -sldv

编译 S-Function 以使其与 Simulink Design Verifier 兼容

人工编写的 S-Function 位于文件 sldvexSFunctionHandlingSFcn.c 中,查找表的用户源代码位于文件 sldvexSFunctionHandlingSource.c 中。调用函数 slcovmex (Simulink Coverage) 以编译 C-MEX S-Function,使其与 Simulink Design Verifier 兼容。

slcovmex('-sldv', ...
        '-output', 'sldvexSFunctionHandlingSFcn',...
        'sldvexSFunctionHandlingSource.c','sldvexSFunctionHandlingSFcn.c');
mex /tmp/Bdoc25b_2988451_609737/tp3982e13a_a874_4fe6_832b_a5477b5e98bf/tp100c6fee_639f_4132_9d3e_94f88c84528c.c /tmp/Bdoc25b_2988451_609737/tp3982e13a_a874_4fe6_832b_a5477b5e98bf/tpf4adb494_bb5e_444a_b6dc_31c77377c1be.c -L/mathworks/devel/bat/filer/batfs2566-0/Bdoc25b.2988451/build/runnable/matlab/bin/glnxa64 -lmwsl_sfcn_cov_bridge -output sldvexSFunctionHandlingSFcn
Building with 'gcc'.
MEX completed successfully.
mex sldvexSFunctionHandlingSource.c /tmp/Bdoc25b_2988451_609737/tp3982e13a_a874_4fe6_832b_a5477b5e98bf/sldvexSFunctionHandlingSFcn.c /tmp/Bdoc25b_2988451_609737/tp3982e13a_a874_4fe6_832b_a5477b5e98bf/tp14284a38_16ff_408b_add8_74cd639afa77.c /tmp/Bdoc25b_2988451_609737/tp3982e13a_a874_4fe6_832b_a5477b5e98bf/tpc56c5e2e_457e_47f5_a716_cdb6de16244e.c -L/mathworks/devel/bat/filer/batfs2566-0/Bdoc25b.2988451/build/runnable/matlab/bin/glnxa64 -lmwsl_sfcn_cov_bridge -output sldvexSFunctionHandlingSFcn
Building with 'gcc'.
MEX completed successfully.

创建测试套件

示例模型 sldvexSFunctionHandlingExample 包含人工编写的 S-Function,用于实现查找表算法。S-Function 模块返回第一个输出端口处的插值,并返回第二个输出端口处的插值状态。如果发生下限饱和,则第二个输出端口返回值 -1;如果发生上限饱和,则返回值 1;否则返回值 0。打开 sldvexSFunctionHandlingExample 模型,并通过打开对测试生成的 S-Function 支持来配置分析选项。运行分析后,Simulink Design Verifier 会返回满足所有覆盖率目标的测试套件。

open_system('sldvexSFunctionHandlingExample');

opts = sldvoptions;
opts.Mode = 'TestGeneration';
opts.ModelCoverageObjectives = 'ConditionDecision';
opts.SaveHarnessModel = 'off';
opts.SaveReport = 'off';
opts.SFcnSupport = 'on';

[status, fileNames] = sldvrun('sldvexSFunctionHandlingExample', opts, true);

验证完整覆盖率

sldvruntest 函数验证测试套件是否实现了完整模型覆盖率。cvhtml (Simulink Coverage) 函数生成覆盖率报告,指示生成的测试向量实现了 100% 的条件和决策覆盖率。

[~, finalCov] = sldvruntest('sldvexSFunctionHandlingExample', fileNames.DataFile, [], true);
cvhtml('Final Coverage', finalCov);

清理

要完成演示,请关闭所有模型。

close_system('sldvexSFunctionHandlingExample', 0);