主要内容

命令行验证教程

这个示例创建三个测试用例的可调利率限制器和分析的结果模型覆盖使用命令行API模型覆盖工具。

金宝app仿真软件®模型可调利率限制器

Simu金宝applink仿真®子系统可调利率限制器是一个速度限制器模型中“slvnvdemo_ratelim_harness”。它使用三个开关块来控制输出应该有限,限制应用的类型。

输入从工作区块生产“获得”,“增长极限”,和“极限下降”,生成分段线性的信号。输入指定的值有六个变量定义在MATLAB®工作区:t_gain, u_gain, t_pos, u_pos t_neg, u_neg。

打开模型和可调利率限制器子系统。

modelName =“slvnvdemo_ratelim_harness”;open_system (modelName);open_system ([modelName,/可调利率限制器的]);

创建第一个测试用例

第一个测试用例验证输出匹配输入时输入值不变化迅速。它使用一个正弦波的时变信号和常量上升和下降的限制。

t_gain = (0:0.02:2.0) ';u_gain =罪(2 *π* t_gain);

计算的最小值和最大值变化时变输入使用MATLAB diff函数。

max_change = max (diff (u_gain)) min_change = min (diff (u_gain))
max_change min_change = -0.1253 = 0.1253

因为信号变化小于1大于1,将速率限制设置为1和1。的变量都是存储在文件“within_lim垫。垫”,这是之前加载模拟。

t_pos = (0, 2);u_pos = (1, 1);t_neg = (0, 2);u_neg = (1, 1);保存(“within_lim.mat”,“t_gain”,“u_gain”,“t_pos”,“u_pos”,“t_neg”,“u_neg”);

额外的测试用例

第二个测试用例补充第一例与崛起获得超过速度限制。后第二个它增加了速率限制,以便获得变化低于极限。

t_gain = (0, 2);u_gain = (0; 4);t_pos = (0, 1, 1, 2);u_pos = (1; 1; 5; 5) * 0.02;t_neg = (0, 2);u_neg = (0, 0);保存(“rising_gain.mat”,“t_gain”,“u_gain”,“t_pos”,“u_pos”,“t_neg”,“u_neg”);

第三个测试用例是一个镜像的第二,上升的增益下降取代了增益。

t_gain = (0, 2);u_gain = [-0.02, -4.02];t_pos = (0, 2);u_pos = (0, 0);t_neg = (0, 1, 1, 2);u_neg = (1; 1; 5; 5) * 0.02;保存(“falling_gain.mat”,“t_gain”,“u_gain”,“t_pos”,“u_pos”,“t_neg”,“u_neg”);

定义覆盖测试

使用测试用例组织和执行sim卡

在这个例子中,一个模拟输入对象用于设置覆盖配置。

covSet = 金宝appSimulink.SimulationInput (modelName);covSet = setModelParameter (covSet,“CovEnable”,“上”);covSet = setModelParameter (covSet,“CovMetricStructuralLevel”,“决定”);covSet = setModelParameter (covSet,“CovSaveSingleToWorkspaceVar”,“上”);covSet = setModelParameter (covSet,“CovScope”,“子系统”);covSet = setModelParameter (covSet,“CovPath”,/可调利率限制器的);covSet = setModelParameter (covSet,“开始时间”,“0.0”);covSet = setModelParameter (covSet,“StopTime”,“2.0”);

执行覆盖测试

加载数据第一测试用例设置覆盖变量名称,并执行模型使用sim卡

负载within_lim.matcovSet = setModelParameter (covSet,“CovSaveName”,“dataObj1”);simOut1 = sim (covSet);dataObj1
dataObj1 =…cvdata版本:(R2023a)身份证:351类型:TEST_DATA测试:cvt对象rootID: 353校验和:[1 x1 struct] modelinfo: [1 x1 struct]开始时间:03 - mar - 2023 09:06:13 stopTime: 03 - mar - 2023 09:06:13 intervalStartTime: 0 intervalStopTime: 0 simulationStartTime: 0 simulationStopTime: 2过滤器:simMode:正常

验证第一个测试用例通过检查,输出与输入。

次要情节(211)情节(simOut1.tout simOut1.yout (: 1), simOut1.tout, simOut1.yout(:, 4)包含(的时间(秒)),ylabel (“价值”)、标题(获得输入和输出的);次要情节(212)情节(simOut1.tout simOut1.yout (: 1) -simOut1.yout(:, 4)包含(的时间(秒)),ylabel (“差异”)、标题(获得输入和输出之间的区别的);

第二个测试用例执行和策划结果以同样的方式。

注意,一旦产量有限分化从输入它只能恢复速度的最大杀了。这就是为什么情节有一个不寻常的扭结。一旦输入和输出匹配,两个一起变化。

负载rising_gain.matcovSet = setModelParameter (covSet,“CovSaveName”,“dataObj2”);simOut2 = sim (covSet);dataObj2次要情节(211)情节(simOut2.tout simOut2.yout (: 1), simOut2.tout, simOut2.yout(:, 4)包含(的时间(秒)),ylabel (“价值”)、标题(获得输入和输出的);次要情节(212)情节(simOut2.tout simOut2.yout (: 1) -simOut2.yout(:, 4)包含(的时间(秒)),ylabel (“差异”)、标题(获得输入和输出之间的区别的);
dataObj2 =…cvdata版本:(R2023a)身份证:467类型:TEST_DATA测试:cvt对象rootID: 353校验和:[1 x1 struct] modelinfo: [1 x1 struct]开始时间:03 - mar - 2023 09:06:15 stopTime: 03 - mar - 2023 09:06:15 intervalStartTime: 0 intervalStopTime: 0 simulationStartTime: 0 simulationStopTime: 2过滤器:simMode:正常

为第三个测试用例执行和策划的结果。

负载falling_gain.matcovSet = setModelParameter (covSet,“CovSaveName”,“dataObj3”);simOut3 = sim (covSet);dataObj3次要情节(211)情节(simOut3.tout simOut3.yout (: 1), simOut3.tout, simOut3.yout(:, 4)包含(的时间(秒)),ylabel (“价值”)、标题(获得输入和输出的);次要情节(212)情节(simOut3.tout simOut3.yout (: 1) -simOut3.yout(:, 4)包含(的时间(秒)),ylabel (“差异”)、标题(获得输入和输出之间的区别的);
dataObj3 =…cvdata版本:(R2023a)身份证:589类型:TEST_DATA测试:cvt对象rootID: 353校验和:[1 x1 struct] modelinfo: [1 x1 struct]开始时间:03 - mar - 2023 09:06:16 stopTime: 03 - mar - 2023 09:06:16 intervalStartTime: 0 intervalStopTime: 0 simulationStartTime: 0 simulationStopTime: 2过滤器:simMode:正常

生成一个覆盖率报告

假设所有的测试已经通过,产生一个合并的报告从所有测试用例来验证实现100%的覆盖率。覆盖率为每个测试显示在标题“模型层次结构”。Although none of the tests individually achieved 100% coverage, in aggregate, they achieve complete coverage.

cvhtml (“combined_ratelim”,dataObj2 dataObj1 dataObj3);

储蓄覆盖率数据

保存文件”ratelim_testdata收集覆盖率数据。cvt”通过使用cvsave

cvsave (“ratelim_testdata”,dataObj2 dataObj1 dataObj3);

关闭模型和退出覆盖环境

close_system (“slvnvdemo_ratelim_harness”,0);清晰的dataObj *

覆盖率数据加载

从文件“ratelim_testdata.cvt”恢复了覆盖测试打开模型通过使用cvload。检索的数据和测试单元阵列。

open_system (“slvnvdemo_ratelim_harness”);[SavedTests, SavedData] = cvload (“ratelim_testdata”)
SavedTests = 1 x3单元阵列{1 x1 cvt} {1 x1 cvt} {1 x1 cvt} SavedData = 1 x3单元阵列{1 x1 cvdata} {1 x1 cvdata} {1 x1 cvdata}

操纵覆盖率数据对象

操纵cvdata对象使用重载运算符:+,-,*。*操作符用于查找两个覆盖率数据对象的交点,从而导致另一个cvdata对象。例如,以下命令生成一个HTML报告常见的覆盖从所有三个测试。

常见= SavedData {1} * SavedData {2} * SavedData {3} cvhtml (“十字路口”常见的)
常见=…cvdata版本:(R2023a) id: 0类型:DERIVED_DATA测试:[]rootID: 714校验和:[1 x1 struct] modelinfo: [1 x1 struct]开始时间:03 - mar - 2023 09:06:13 stopTime: 03 - mar - 2023 09:06:16 intervalStartTime: 0 intervalStopTime: 0过滤器:simMode:正常

从报道中提取信息的数据对象

从一块路径或检索决定覆盖率信息块处理利用decisioninfo。输出是一个向量的取得和总成果单一模型对象,分别。

x = decisioninfo (SavedData {1} + SavedData {2} + SavedData {3},“slvnvdemo_ratelim_harness /可调利率限制器”)
x = 6 6

使用检索到的覆盖率信息访问百分比覆盖率。

percentCov = 100 * (x x和(1)/ (2))
percentCov = 100

当使用两个输出参数,decisioninfo返回一个结构捕获中的决策和结果模型块或Stateflow®对象。金宝app

(blockCov, desc) = decisioninfo(常见,“slvnvdemo_ratelim_harness /可调利率限制器/δ迹象”)descDecision = desc.decision outcome1 = desc.decision.outcome (1) outcome2 = desc.decision.outcome (2)
blockCov = 0 2 desc =结构体字段:isFiltered: 0 justifiedCoverage: 0 isJustified: 0 filterRationale:“决定:[1 x1 struct] descDecision =结构体字段:文字:“开关触发”filterRationale:“isFiltered: 0 isJustified: 0的结果:[1 x2 struct] outcome1 =结构体字段:文字:“假(= in3)”executionCount: 0 executedIn: [] isFiltered: 0 isJustified: 0 filterRationale:“outcome2 =结构体字段:文字:“真正的(= in)”executionCount: 0 executedIn: [] isFiltered: 0 isJustified: 0 filterRationale:“