仿真与测试:单元测试与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,可以搭建一套成体系的测试方法。
>>返回个人博客总目录
相关文章:
仿真与测试:单元测试与Test Harness
本文描述单元测试的概念,以及Test Harness建立的方法和简单的单元测试过程。 文章目录1 单元测试1.1 场景举例1.2 简单的测试方法2 Test Harness建立2.1 模型配置2.2 创建Test Harness3 总结1 单元测试 单元测试,简单来说就是在Simulink模型中只测试一小…...
面试常问集锦——MySQL部分
Mysql速成大法 请签收MySQL灵魂十连 https://mp.weixin.qq.com/s?__bizMzI4NjI1OTI4Nw&mid2247488721&idx1&sneead82d2b7a0fdf993beacc4dfd60313&chksmebdef5e9dca97cff9d638877e5855850727ae26ebcfd60c7700ae53e311fa6ddb64b63bb9552&scene178&cur_a…...
算法训练第四十四天|完全背包理论 、518. 零钱兑换 II、377. 组合总和 Ⅳ
第九章 动态规划part06完全背包理论基础完全背包C测试代码总结518. 零钱兑换 II题目描述思路总结377. 组合总和 Ⅳ题目描述思路总结完全背包理论基础 参考:https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%…...
0x06多层感知机
感知机 感知机形象的来看就是我们接触过的一个只有两个部分组成(输出和输入)组成的最简单的神经网络之一。 给定输入x,权重w和偏移b以及一个感知函数,感知机就能输出: 这个函数可以形象的用作二分类问题,…...
HTML是什么?HTML简介
HTML 英文全称是 Hyper Text Markup Language,中文译为“超文本标记语言”,专门用来设计和编辑网页。 使用 HTML 编写的文件称为“HTML 文档”,一般后缀为.html(也可以使用.htm,不过比较少见)。HTML 文档是…...
Linux定时服务
目录 1、定时器操作 2.cron表达式的语法规则 参考链接 1、定时器操作 sudo crontab -e 【选择2】 进入进行配置【需要按下 i 】 #sh /home/xx/crontabsh/test.sh的意思是,让sh解释器调用test.sh脚本,到达定时执行任务的效果 # 每一分钟执行一次 *…...
sgi_stl源码学习,官方文档3.2.3String package字符串封装,未完待续
https://www.boost.org/sgi/stl/character_traits.html char_traits<char> char_traits<wchar_t>traits翻译为特征、特性类,一般是指某种类型的特性类应该提供的一组接口、类型定义。 web页面描述了一些接口要求。感觉没有什么特别的。直接看代码吧 c…...
从JavaScript到Java(一):基础知识
Hello World Java和JavaScript虽然有不同的特点,但在一些概念和知识点上是相似的。本文从JavaScript开发者的角度出发,帮助你理解Java基础知识(反过来也行)。 // 解释型 console.log("Hello, World!");// 编译型 pub…...
Android编舞者类Choreographer小结
Android编舞者类Choreographer小结 作用 编舞者类的作用主要是控制绘制节奏,用于发起一次vsync垂直同步信号的监听,当垂直同步信号来的时候会回调注册的Runnable或者FramCallback Choreographer对象获取 Choreographer对象是通过它的getInstance方法…...
大专升本科难度大吗 需要考哪些科目
大专学历可以通过自考和成考提升学历到本科,自考的考试科目有12-16门左右,考试内容不难,但是考试周期长,需要考生通过所有课程才能申请毕业。成考专升本考试科目有政治,外语和专业课,考试内容简单ÿ…...
考研复试-英语问答+解答
每个问题2~3min 一、 1.考官问问题,没听明白 I’m sorry, I didn’t hear that clearly. May I ask you to repeat it, please? Sorry, I have no clear idea about this question for now, but I will think about it later. And if possible, I want to discuss …...
python 文件相关的操作 常用函数(读文件、写文件、文件的追加内容、修改文件内容、复制文件、按行读取文件、with open) json文件的读取
常用函数:open(打开文件),read(读文件到程序中),write(写程序中的变量到文件),close(关闭文件) 示例1:读文件(…...
python 系列 06 -生成及解析二维码
0 说明 二维码不止一种,本文介绍最常见的QR二维码。由于不能发二维码截图,所以所有的执行结果都隐去了。完整版本可以移步到此查看:https://vblogs.cn/momo1938/article?id0407576070659864 1 安装包 python 可以使用qrcode来生成二维码&…...
2023第二届中国绿色钢铁国际峰会
会议背景 钢铁是当今世界上最常用的金属,普遍应用于世界各国基础设施建设与机械、汽车、飞机、船舶、家电等产品的生产制造中。但是,随着各国政府与行业净零排放目标的确立,钢铁行业的减排降碳也成为了关注焦点。据世界钢铁协会称,…...
java 高考志愿填报系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目
一、源码特点 java 高考志愿填报系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0…...
机器学习 vs 深度学习:了解两者的异同
在人工智能领域中,机器学习和深度学习是两个重要的概念。尽管它们都可以用于处理复杂的数据和任务,但它们在其基本原理、算法和应用方面有着显著的不同之处。在本文中,我们将详细介绍机器学习和深度学习的定义、原理、算法和应用,…...
流行的 DAW编曲软件FL Studio 21 有什么新功能?
FL Studio 21 对流行的 DAW 和音乐制作软件进行了多项更新。最重要的变化包括:更快、更精确的音频包络和带有自动交叉推子的增益控制;一个能够标记、制作自定义颜色的标签和访问在线内容的新浏览器,以及一个带有可视化和擦除功能的内嵌音频播…...
【Java】抽象类和接口
抽象类和接口抽象类抽象类的概念抽象类语法抽象类的注意事项抽象类的作用接口接口的概念语法规则接口使用接口注意实现多个接口接口间的继承接口使用实例给对象数组排序Clonable 接口和深拷贝浅拷贝深拷贝抽象类和接口的区别抽象类 抽象类的概念 在面向对象的概念中ÿ…...
Lora:Low-Rank Adapation of Large Language models
Lora:Low-Rank Adapation of Large Language modelsIntroductionMethodExperiment代码Introduction 这篇论文最初与21.06上传与arXiv,作者指出在当时,NLP的一个重要范式是先训练一个通用领域的模型然后在通过微调适应不同的领域与数据&#…...
洛谷-P8466 [Aya Round 1 A] 幻想乡扑克游戏
题目:P8466 [Aya Round 1 A] 幻想乡扑克游戏 题目描述: 题目描述 斗地主是一种使用 �A 到 �K 加上大小王的共 5454 张扑克牌来进行的游戏,其中大小王各一张,其它数码牌各四张。在斗地主中,牌的…...
weixin279基于微信小程序的场地预约设计与实现+ssm(文档+源码)_kaic
第4章 系统实现 4.1 管理员权限的功能模块实现界面 4.1.1系统登录功能模块的界面实现 当系统调试运行好后,可以先使用系统登录功能,本功能相当于系统的屏障。在本界面里可以看到系统的标题和用户名、密码的文本框。在登录界面里还加入了登录按钮。系统…...
Linux who命令实现:文件读写与系统编程实践
1. 从零实现Linux who命令:深入理解文件读写与系统编程作为一个常年与Linux打交道的开发者,我始终认为理解系统命令的实现原理是提升编程能力的最佳途径。今天我们就来解剖who这个看似简单却内涵丰富的命令,通过亲手实现它来掌握Linux文件操作…...
Claude Code开源第一人,竟是华人辍学博士!CC之父回应:纯手误
51万行Claude Code代码全网裸奔,背后泄密第一人竟是他。就在刚刚,CC之父回应来了:是人,不是Bun。爆出Claude Code源码第一人,竟被全网扒出来了!3月31日凌晨4点23分,安全研究员Chaofan Shou在X上…...
企业做智能问数,最容易被低估的不是模型,而是人工预置工作量
在当前企业数据智能平台选型中,“大模型能力”常被视为决定成败的关键。然而,越来越多的实践表明:真正制约智能问数从 POC(概念验证)走向规模化落地的瓶颈,并非模型本身,而是隐藏在技术方案背后…...
避坑指南:Android 10分区存储下File API失效的5种替代方案
Android 10分区存储适配实战:5种File API替代方案详解 当你的应用在Android 10设备上突然开始崩溃,控制台不断抛出"File.mkdir() failed: EACCES (Permission denied)"之类的错误时,作为开发者可能会感到措手不及。这正是分区存储&…...
LeetCode138. 随机链表的复制(2024秋季每日一题 34)
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 ne…...
PyTorch 2.8镜像功能体验:支持多卡计算,大幅缩短模型训练时间
PyTorch 2.8镜像功能体验:支持多卡计算,大幅缩短模型训练时间 1. PyTorch 2.8镜像概述 PyTorch 2.8镜像是一个开箱即用的深度学习环境,预装了PyTorch 2.8和CUDA工具包。这个镜像最大的亮点是支持多GPU并行计算,能够显著加速模型…...
颠覆体验:Mac鼠标滚动优化完全指南——从卡顿到丝滑的蜕变之路
颠覆体验:Mac鼠标滚动优化完全指南——从卡顿到丝滑的蜕变之路 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction indepen…...
KeymouseGo:让重复操作自动化的效率工具指南
KeymouseGo:让重复操作自动化的效率工具指南 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 在数字化工作环境中…...
别再让广播闪退!Android 14广播安全新规RECEIVER_EXPORTED的保姆级避坑指南
Android 14广播安全新规:RECEIVER_EXPORTED的深度解析与实战指南 去年秋天,当Google正式发布Android 14时,许多开发者发现原本运行良好的广播注册代码突然开始抛出SecurityException。这个看似简单的API变更背后,其实是Android团队…...
