当前位置: 首页 > news >正文

仿真与测试:单元测试与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翻译为特征、特性类&#xff0c;一般是指某种类型的特性类应该提供的一组接口、类型定义。 web页面描述了一些接口要求。感觉没有什么特别的。直接看代码吧 c…...

从JavaScript到Java(一):基础知识

Hello World Java和JavaScript虽然有不同的特点&#xff0c;但在一些概念和知识点上是相似的。本文从JavaScript开发者的角度出发&#xff0c;帮助你理解Java基础知识&#xff08;反过来也行&#xff09;。 // 解释型 console.log("Hello, World!");// 编译型 pub…...

Android编舞者类Choreographer小结

Android编舞者类Choreographer小结 作用 编舞者类的作用主要是控制绘制节奏&#xff0c;用于发起一次vsync垂直同步信号的监听&#xff0c;当垂直同步信号来的时候会回调注册的Runnable或者FramCallback Choreographer对象获取 Choreographer对象是通过它的getInstance方法…...

大专升本科难度大吗 需要考哪些科目

大专学历可以通过自考和成考提升学历到本科&#xff0c;自考的考试科目有12-16门左右&#xff0c;考试内容不难&#xff0c;但是考试周期长&#xff0c;需要考生通过所有课程才能申请毕业。成考专升本考试科目有政治&#xff0c;外语和专业课&#xff0c;考试内容简单&#xff…...

考研复试-英语问答+解答

每个问题2~3min 一、 1.考官问问题&#xff0c;没听明白 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文件的读取

常用函数&#xff1a;open&#xff08;打开文件&#xff09;&#xff0c;read&#xff08;读文件到程序中&#xff09;&#xff0c;write&#xff08;写程序中的变量到文件&#xff09;&#xff0c;close&#xff08;关闭文件&#xff09; 示例1&#xff1a;读文件&#xff08…...

python 系列 06 -生成及解析二维码

0 说明 二维码不止一种&#xff0c;本文介绍最常见的QR二维码。由于不能发二维码截图&#xff0c;所以所有的执行结果都隐去了。完整版本可以移步到此查看&#xff1a;https://vblogs.cn/momo1938/article?id0407576070659864 1 安装包 python 可以使用qrcode来生成二维码&…...

2023第二届中国绿色钢铁国际峰会

会议背景 钢铁是当今世界上最常用的金属&#xff0c;普遍应用于世界各国基础设施建设与机械、汽车、飞机、船舶、家电等产品的生产制造中。但是&#xff0c;随着各国政府与行业净零排放目标的确立&#xff0c;钢铁行业的减排降碳也成为了关注焦点。据世界钢铁协会称&#xff0c…...

java 高考志愿填报系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 高考志愿填报系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…...

机器学习 vs 深度学习:了解两者的异同

在人工智能领域中&#xff0c;机器学习和深度学习是两个重要的概念。尽管它们都可以用于处理复杂的数据和任务&#xff0c;但它们在其基本原理、算法和应用方面有着显著的不同之处。在本文中&#xff0c;我们将详细介绍机器学习和深度学习的定义、原理、算法和应用&#xff0c;…...

流行的 DAW编曲软件FL Studio 21 有什么新功能?

FL Studio 21 对流行的 DAW 和音乐制作软件进行了多项更新。最重要的变化包括&#xff1a;更快、更精确的音频包络和带有自动交叉推子的增益控制&#xff1b;一个能够标记、制作自定义颜色的标签和访问在线内容的新浏览器&#xff0c;以及一个带有可视化和擦除功能的内嵌音频播…...

【Java】抽象类和接口

抽象类和接口抽象类抽象类的概念抽象类语法抽象类的注意事项抽象类的作用接口接口的概念语法规则接口使用接口注意实现多个接口接口间的继承接口使用实例给对象数组排序Clonable 接口和深拷贝浅拷贝深拷贝抽象类和接口的区别抽象类 抽象类的概念 在面向对象的概念中&#xff…...

Lora:Low-Rank Adapation of Large Language models

Lora&#xff1a;Low-Rank Adapation of Large Language modelsIntroductionMethodExperiment代码Introduction 这篇论文最初与21.06上传与arXiv&#xff0c;作者指出在当时&#xff0c;NLP的一个重要范式是先训练一个通用领域的模型然后在通过微调适应不同的领域与数据&#…...

洛谷-P8466 [Aya Round 1 A] 幻想乡扑克游戏

题目&#xff1a;P8466 [Aya Round 1 A] 幻想乡扑克游戏 题目描述&#xff1a; 题目描述 斗地主是一种使用 &#xfffd;A 到 &#xfffd;K 加上大小王的共 5454 张扑克牌来进行的游戏&#xff0c;其中大小王各一张&#xff0c;其它数码牌各四张。在斗地主中&#xff0c;牌的…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...