电子说
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模型中,并进行如下的配置,就可以生成我们想要的驱动代码形式了。
这里注意以下几点:
全部0条评论
快来发表一下你的评论吧 !