Simulink是基于时间序列的仿真系统,因此在我们进行单元测试的时候,往往会输入一组时间相关的数据,通过Signal Builder、Signal Editor我们可以做到快速地创建一组时间序列数据。但是有的时候,我们更加关注软件某些时刻的行为,且测试的触发取决于一定的先决条件。这个时候,我们就需要基于场景的测试了。在Simulink中,Test Sequence/Test Assessment就很好地满足了这一需求。我们今天主要聚焦于使用Test Sequence完成场景测试的编辑,以及对Test Sequence进行代码生成。
使用Test Sequence
首先创建一个简单的模型,实现一个简单的功能:把输入乘以2之后再输出。这里我们可以选择通过创建Harness来测试,在创建时勾选使用Test Sequence来驱动。
但是我们这里不选择自动创建,而是手动创建Test Sequence,这样我们能够更好地体会它的功能。
新建一个测试专用的模型,并把待测试的目标模型引用进来,再创建一个空白的Test Sequence模块。可以从引用模型的接口看到,该模型需要一个函数调用和一个输入数据进行驱动。我们在Test Sequence模块中完成这一工作。
打开Test Sequence模块,可以看到左侧栏是一些标识符的定义,右侧就是场景编辑界面。每一条测试都是由步骤名、步骤动作、转移条件、下一步骤组成,操作起来很像状态机,语句也都是MATLAB语言,非常自然。
下面尝试编辑一个场景:初始时(t=0),输入赋值为0;t = 1时刻,输入赋值为1,同时调用一次Step函数;t = 5时刻,输入赋值为2,同时调用一次Step函数。我们第一次写出来的Test Sequence如下所示。
连接好测试模型,设置为离散求解器,步长为0.2,仿真时间为10s,记录输出值以及事件。
运行仿真,查看Sequence Viewer如下。遗憾地发现,Step函数并没有像我们预期的那样,在1s和5s时刻运行一遍。这是因为Simulink还是基于时间序列的仿真,并不能真的只在1s和5s各自运行一次。Test Sequence只是提供了一些方便的场景编辑功能,在上面那种写法中,Simulink维持了Step在每个时刻进行调用的设置。对于数据也是同样的道理,虽然用户只设置了一次,但是往后的仿真时间步会延续该次设置值,并持续产生数据。
因此,正确的写法应该是如下所示。这样能够保证,Step函数真的只在期望的时刻发生调用了。
对Test Sequence生成代码
Test Sequence模块无疑是非常好用的工具,那么是否可以应用到SIL的测试场景中呢?答案是可以的。Test Sequence模块可以生成代码,这样我们就可以得到一个C代码的测试驱动程序。我们把上述Test Sequence模块拷贝到一个新的Simulink模型中,并进行如下的配置,就可以生成我们想要的驱动代码形式了。
这里注意以下几点:
- Test Sequence模块既输出了信号,也输出了函数调用,如果希望能够在代码中看到函数调用,就必须构造一个Function Call Subsystem和Function Caller来承接这个函数调用,如下所示。
- 对于输出的信号如果有特殊的接口形式要求(比如某个全局变量,或者接口函数),那么可以通过Simulink自定义存储类来实现,绑定此信号线和一个Simulink.Signal对象。像下面这样,可以让输出为一个全局变量x;也可以是一个标准的RTE接口。
- 要注意驱动模型的仿真步长一定要和被测对象进行匹配。因为本Test Sequence模块是放在一个定速率模型中,其运行节奏是由步长决定的,代码生成中也可以看到,Test Sequence中所谓t == 1 ,after( 1 , sec)也都会转换到相应的步长上。因此如果步长配置错误会导致测试驱动的节奏错误。(额外提一点,包含Test Sequence的模型配置成导出函数模型或AUTOSAR模型的话,在生成代码上有困难。)
-
仿真器
+关注
关注
14文章
1016浏览量
83711 -
MATLAB语言
+关注
关注
0文章
12浏览量
8686 -
simulink仿真
+关注
关注
0文章
75浏览量
8573 -
sequence
+关注
关注
0文章
23浏览量
2840 -
求解器
+关注
关注
0文章
77浏览量
4527
发布评论请先 登录
相关推荐
评论