仿真与测试:单元测试与Test Harness

本文描述单元测试的概念,以及Test Harness建立的方法和简单的单元测试过程。

文章目录

  • 1 单元测试
    • 1.1 场景举例
    • 1.2 简单的测试方法
  • 2 Test Harness建立
    • 2.1 模型配置
    • 2.2 创建Test Harness
  • 3 总结

1 单元测试

单元测试,简单来说就是在Simulink模型中只测试一小部分单元的功能。关于单元测试的概念网上有很多资料了,这里不再赘述。博主从实际工作经验的角度来谈谈单元测试的价值。

1.1 场景举例

举个简单的例子,某个工程师需要设计一个逻辑,当毫米波雷达跟踪的目标的置信度大于等于90时,认为该目标是有效目标。于是该工程师设计模型如下:
在这里插入图片描述
工程师不小心把判断条件写成大于号,而不是大于等于号。这就导致了置信度为90的目标全部被视为Invalid,从而影响了后面一大片的算法丢失了重要的输入信息。如果没有单元测试,这个问题就会被带到开发流程的后期。例如,该模型生成代码、编译集成、刷到车上以后,实车测试的时候发现后面的功能状态机一直不激活,或者控制信号一直不激活。然后再回头一点点往前撸信号,查找半天才定位到模型中的这个小bug。

这种情况在工作中时常发生,而且并不能因此责怪工程师的水平不行,因为人总会犯错误,避免不了“写bug”这种情况。因此,需要从流程体系的角度来尽可能提早发现设计问题。单元测试就可以做到这样的保障,譬如给上图这一小部分单元输入一个数值为90的Confidence信号,通过模型仿真发现输出竟然是False,就可以快速地定位这个缺陷,尽早地修复他。

1.2 简单的测试方法

既然知道了要在模型中先测试一下,不了解Test Harness的人可能会这么做。把已有的模型改造一下,把inport和outport端口去掉,给他几个输入,再用Scope或者disp模块看看输出对不对。模型改造成如下所示。
在这里插入图片描述
仿真后可以看到disp中的结果。这么做确实看到了输出的结果,发现了输入的置信度为90时,输出的是0。但是这样操作模型会有很多问题:

  • 为了仿真改掉了原有的模型,测完了还得改回去;
  • 测试用例不方便保留下来,以后复测的时候还得手动操作一番;
  • 如果想要多个不同的测试输入得把输入改来改去,不好切换;

针对这些问题,可以直接使用Simulink Test工具箱里的Test Harness,为设计专属的单元测试环境,引用原来模型的某个子系统或者整个模型的算法。后文会用一个例子来说明搭建Test Harness的过程,然后直观地看到他的好处。

2 Test Harness建立

这一节用以前的一篇博客搭建的模型,来演示一下Test Harness的建立过程,并且通过简单的输入进行仿真。

2.1 模型配置

1)首先打开需要测试的模型,这里用以前博主做的一个模型来演示:《Simulink建模:LKA系统功能状态机建模》。
在这里插入图片描述
2)在模型设置里,需要设置为离散,并且仿真步长设置为和实际控制器中的调度周期一致;
在这里插入图片描述
这样的话,模型就配置完毕了。

2.2 创建Test Harness

创建Test Harness有两种做法,为整个slx模型创建,或者为模型中的某个子系统创建。

博主比较倾向于后者,因为单元更小一点,可以聚焦于这部分的功能进行测试。即使是想测试整个模型,也可以将整个模型的最上层打包成一个大型的子系统进行测试。后文就以顶层的子系统LKA_StateMachine为例,来创建TestHarness。

1)右键点击这个子系统,选中Create for XXX
在这里插入图片描述
2)在界面中定一个名字,企鹅定好输入输出的形式;
在这里插入图片描述
这里博主选择了输入为Signal Builder,因为用的比较顺手,也可以选择From Workspace导入外部数据,或者Test Sequence等等。Signal Builder的用法参照《仿真与测试:通过Signal Builder模块生成输入信号》。

另外,如果勾选了Save test harness extern选项后,会生成一个用来保存harness模型的外部文件,否则生成的harness会依附于当前的模型。博主习惯后者,减少一些文件的管理。

3)点击OK后生成了一个Harness模型,按照之前的选择配置了输入为Signal Builder,引用了原模型的子系统作为中间算法;
在这里插入图片描述
这样的话,就不需要对原来的模型进行改造,也能进行单元测试。

4)打开Signal Builder设计一个简单的测试用例输入;
在这里插入图片描述
测试用例输入表示,3s时开关打开,1-5s时,车速从0加到80。然后通过信号log可以看到输出的LKA_Status是否符合该输入的预期。
在这里插入图片描述
这样就完成了一个Test Harness的创建及一个简单的单元测试。这个测试环境可以和

3 总结

本文描述单元测试的概念,以及Test Harness建立的方法和简单的单元测试过程。本文只是一个简单的单元测试,还没有发挥出Test Harness的更多功能。Test Harness配合Test Manager和Design Verify,可以搭建一套成体系的测试方法。

>>返回个人博客总目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/7317.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

63-哈希表

目录 1.哈希表的概念 2.哈希函数的概念 3.哈希函数的设计 3.1.key为整型时哈希函数的设计 3.1.1.普通整数 3.1.2.负整数 3.1.3.大整数 PS:哈希函数设计的3个要求: PS:2种类型的哈希函数(大整数) 3.2.key为其…

【数据结构】树与二叉树的基本概念及性质

目录 一、树的基本概念 1️⃣树的定义 2️⃣基本术语 3️⃣树的性质 二、二叉树的概念 1️⃣二叉树的定义 2️⃣特殊二叉树 3️⃣二叉树的性质 参考资料 一、树的基本概念 1️⃣树的定义 数据结构中的树是什么❓ 树是 个结点的有限集。有且仅有一个特定的称为根(上图A结点…

C++ [内存管理]

本文已收录至《C语言》专栏! 作者:ARMCSKGT 目录 前言 正文 计算机中内存分布 C语言的内存管理 内存申请函数 内存释放函数 C内存管理 new操作符 delete操作符 特性总结 注意 原理探究 operator new和operator delete函数 operator new的底…

【C++】STL之string的使用和模拟实现

初阶的C语法和基本的类和对象我们已经学过了,下面我们会步入一段新的旅程。本章我们将初步了解STL(标准模板库),并且深入探讨其中一个非常重要的容器———string。 目录 (一)STL简介(了解即可) &#xf…

Hashtable、HashMap、ConcurrentHashMap的区别

作者:爱塔居 专栏:JavaEE 作者简介:大三学生,希望和大家一起进步。 Hashtable和HashMap、ConcurrentHashMap 之间的区别? HashMap:线程不安全,key允许为null Hashtable:线程安全,使用synchronized锁Hashta…

2.4 特征工程

2.4 特征工程 李沐 B站:https://space.bilibili.com/1567748478/channel/collectiondetail?sid=28144 课程主页:https://c.d2l.ai/stanford-cs329p/ 1. 为什么需要特征工程: 特征工程 数据集进行特征提取,以使机器学习模型在对经过特征工程处理过的数据进行学习时可以更快…

(02)基础强化:面向对象,变量作用域,封装,继承,虚方法,可访问性

一、面向对象概念复习 1、什么是面向对象?OOP(Object-Oriented Programming) 一种分析问题的方式,增强了程序的可扩展性。 OOP面向对象编程 OOA面向对象分析 OOAD面向对象分析与设计(…

Redis管道(pipeline)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言1、管道(pipeline)的基本概念2、管道实操3、小总结前言 在正式讲解Redis管道之前,先引入一个面试题: 如何优化频繁命令往返造成的性能瓶…

【Hello Linux】线程控制

作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:简单介绍linux中的线程控制 线程控制线程创建线程等待线程终止线程分离线程id和进程地址空间布局线程创建 我们可以通过下面pthread_c…

蓝桥杯基础14:BASIC-1试题 闰年判断

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 给定一个年份,判断这一年是不是闰年。 当以下情况之一满足时,这一年是闰年: 1. 年份…

Java面向对象 - 封装、继承和多态的综合练习(答案+知识点总结)第1关:封装、继承和多态进阶(一)+ 第2关:封装、继承和多态进阶(二)

目录 第1关:封装、继承和多态进阶(一) 报错总结 & 注意事项: 第2关:封装、继承和多态进阶(二) 源码: 报错总结 & 注意事项: 思维导图免费制作网站&#xf…

软考软件设计师下午试题一

数据流图基本图形元素 外部实体 外部系统是当前系统之外的系统 数据存储 在里面存储数据后还能取出来用 跟实体没有关系,他负责存储加工的数据或者提供数据给加工 加工 灰洞的解释比如输入需要两个才能得到输出的,但是他只输入了一个就是灰洞 数…

Matlab傅里叶级数展开(附结果图)

Matlab傅里叶级数展开(附结果图) 代码下载链接 代码下载链接 代码下载链接 如下图所示:

“唯一靶点”的华堂宁会成控糖爆品吗?

一上市,两次“断货”的货华堂宁有爆品那味儿了。 2022年10月28日华领医药-B(02552.HK)公告华堂宁(多格列艾汀)正式进入商业化,一周后各个渠道便进入到了断货和限售的状态。 对于一个不在传统九大降糖药品…

元宇宙与网络安全

元宇宙是一种虚拟现实空间,用户可以在计算机生成的环境中进行互动。元宇宙的应用范围很广,比如房地产,医疗,教育,军事,游戏等等。它提供了更具沉浸感的体验,更好地现实生活整合,以及…

组件、套件、 中间件、插件

组件、套件、 中间件、插件 组件 位于框架最底层,是由重复的代码提取出来合并而成。组件的本质,是一件产品,独立性很强,组件的核心,是复用,与其它功能又有强依赖关系。 模块 在中台产品和非中台产品中&…

C语言程序环境和预处理

文章目录程序的翻译环境和执行环境详解编译和链接翻译环境编译本身也分为几个阶段预处理编译汇编链接段表符号表的合并预处理详解预定义符号#define#define 定义标识符#define定义宏#define替换规则#和#### 的作用带副作用的宏参数宏和参数的对比宏和函数的一个对比命名约定#un…

FastestDet:比yolov-fastest更快!更强!全新设计的超实时Anchor-free目标检测算法

本篇文章转自于知乎——qiuqiuqiu,主要设计了一个新颖的轻量级网络! 代码地址:https://github.com/dog-qiuqiu/FastestDet 1 概述 FastestDet是设计用来接替yolo-fastest系列算法,相比于业界已有的轻量级目标检测算法如yolov5n, yolox-nano, nanoDet, pp-yolo-tiny, Fast…

CSS基础知识,必须掌握!!!

CSS基础知识Background(背景)CSS文本格式文本颜色文本对齐格式文本修饰文本缩进CSS中的字体字体样式字体大小CSS链接(link)CSS列表不同列表标项CSS列表项用图片作为标记CSS列表标记项位置CSS中表格(table)表…

Shell脚本之嵌套循环与中断跳出

1、双重循环 1.1 格式 #!/bin/bash for ((i9;i>1;i--)) do for ((j9;j>$i;j--)) do echo -n -e "$j$i$[$i*$j]\t" done echo done1.2 实例操作 2.1 格式 #!/bin/bash for ((a1;a<9;a)) dofor ((b9;b>a;b--))doecho -n " "donefor((c1;c<…