草庐IT

Simulink模型自动化测试

SissonLi 2024-01-17 原文

Simulink模型自动化测试


本文介绍如何使用Simulink Test Manager构建一个测试工程,实现对模型的自动测试。

Test Manager简介

Test Manager是Matlab Simulink建模功能的子模块,用于检测逻辑流程图的功能。其在生成Test项目时会根据所选模型生成两个文件,一为mldatx文件,用于记录测试中的设置;二为xls(xlsx)表格文档文件,我们可以在表格中设置某个时间的输入值,并给出输出预测,模块运行后就会根据给定的输入值运行,并将真实输出值与预测输出值进行比较,最终生成测试结果。

构建一个测试模型

构建一个测试模型,如下图,该模型实现的功能为档IN1为真时OUT1=1,当IN1为假时,OUT1=0;

并在模型上添加IN/OUT Port口;

使用TestManager新建一个测试模板

打开Simulink Test Manager

在Simulink上面选择APPS->Simulink Test,在新的TESTS工具栏中选择Simulink Test Manager

通过教程创建一个测试用例

第一步,在新生成的Test Manager窗口中选择“基于电子表格中指定的数据创建新测试”,通过这个选项可以额外生成Excel表格文档文件,方便后续的测试。

随后开始创建测试文件。在第一步中,如果已有现成的Excel表格文档文件,则选择上方选项,并在路径中选择要使用的表格;若没有,则选择下方的创建选项。

第二步,选择Model和Harness。若事先创建过Test Harness,就可在下方的选项中选择要测试部分,未创建或不选择将默认为“None”,本选项会测试该模型中的所有内容。
这里如果需要测试模型中的某一部分功能,可以对该部分模型创建Test Harness,这样可以选择该Test Harness进行针对性测试,不选择则是对整个模型进行测试。

第三步,选择数据来源。“Parameters”仅在信号线名称与数据字典关联后显示。默认“Inputs”和“Parameters”已勾选。需要手动勾选最后一个“Comparison”选项,否则生成的表格中将没有预测输出部分。后续也无法将实际输出和预测输出进行比对。下侧为测试范围选择,Yes选项会选择所有项目,No选项选择后可以选择屏蔽不参与测试的内容。
这里“Parameters”可以不勾选,目前实际测试过程中未使用过相关内容。

第四步指定生成的表格所包含的单元表页数及其名称。

第五步设定所生成文件的位置和名字,上方为mldatx文件,下方为xlsx文件。

创建成功后结果:

修改测试输入输出进行测试

测试表格说明

图中表格的A列“time”即为输入信号的时间,初始只有0和10两个时间点(单位为秒),可手动添加。右侧B列起的内容为输入信号名称,通过修改本列中对应时间行的数值即可改变该信号在特定时间的不同输入值,不可为空。C列第二个time后为输出预测部分,其右侧D列内容为输出信号在特定时间的输出预测值,可以通过修改这部分的内容完成对输出的预测,并在测试中与实际输出值比对。

编辑表格内信息

在左侧的输入信号下添加时间和输入值,并在更改右侧的预测值。可以写成函数形式,但是可能会对后续的修改造成影响,所以除非输入输出的关系特别简单,否则一般不推荐使用。
注意:编辑表格时应注意输入的变化应在一个周期内变化,我这里设置的步长为0.01S,所以输入每次均在0.01S变化,若超过步长则会默认为斜线变化导致与预期不一致。
编辑结果如下图所示:

执行测试

选中需要测试的Test Case点击Run执行测试。

结果分析

默认配置下仅包含Baseline Criteria Result和Sim Output,Baseline Criteria Result右侧为测试结果和预期结果的比对。

默认配置下仅包含输出部分,如果需要输入部分的曲线,需要勾选测试用例中INPUTS部分的Include input data in test result选项。

勾选后的测试结果如下:

模拟测试与预期不一致情况

修改测试表格如下:

测试结果:

可以看到测试失败,右侧预期与模拟的结果显示不一致,蓝色线为预期的输出,红色线为模拟输出,下面的差别也能看出来实际结果与预期的不一致。

测试报告生成

选中测试结果,点击上方TESTS->Report

在新的窗口中选择测试报告的相关信息并Create测试报告

结束语

使用这种方式已经可以对模型进行全方位的测试,并且可以实现自动化测试。但是这种方式也存在一些弊端,主要是使用起来不是很方便,但是这种生成输入输出excel表格的方式很实用。

有关Simulink模型自动化测试的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  4. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  6. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  7. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  8. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  9. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  10. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

随机推荐