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

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

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,可以搭建一套成体系的测试方法。

>>返回个人博客总目录

<think>好的,用户遇到了Git合并时本地更改会被覆盖的问题,需要解决方案。根据之前的引用资料,解决方法主要有commit、stash和revert三种。首先,我得确认用户的具体情况,比如他们的本地更改是否已经完成,是否需要保留,或者是否可以丢弃。用户可能不太清楚这三种方法的适用场景,需要详细解释每个选项的步骤和优缺点。比如,commit适用于需要保留更改的情况,stash适合临时保存以便后续恢复,而revert则是直接撤销更改,适用于不需要保留的情况。需要结构清晰,分点说明,每个方法都给出操作步骤和适用场景,帮助用户理解哪种情况最适合他们。还要注意使用中文,避免技术术语过于复杂,让用户容易理解。同时,生成相关问题,可能涉及如何恢复stash的内容,或者如何避免频繁冲突等,扩展用户的知识点。另外,要确保LaTeX格式正确,但在这个问题中可能用不上数学公式,所以主要关注代码块和引用标识。检查引用是否正确,比如引用[^1]和[^2]的来源是否相关,用户提供的引用内容是否准确对应解决方案。 最后,确保回答真实可靠,操作步骤准确无误,避免误导用户。可能还需要提醒用户根据具体情况选择方法,比如如果有未完成的实验性代码,stash可能是更好的选择,而如果是确定要保留的修改,则应该commit。</think>要解决Git合并时本地更改被覆盖的问题,可根据不同场景选择以下三种方法: ### 一、提交本地更改(commit) **适用场景**:当本地更改已测试通过且需要保留到版本历史中。 **操作步骤**: 1. 将改动添加到暂存区: ```bash git add . # 添加所有文件 # 或指定文件 git add file1.txt file2.py ``` 2. 提交更改并添加描述: ```bash git commit -m "完成用户登录模块优化" ``` 3. 执行合并操作: ```bash git merge origin/main ``` **优点**:保留完整的开发记录,便于后续追溯[^1]。 ### 二、暂存更改(stash) **适用场景**:需要临时保存未完成的修改(如调试代码),优先处理合并操作。 **操作步骤**: 1. 保存当前工作状态: ```bash git stash # 可选添加备注 git stash save "用户登录模块调试代码" ``` 2. 查看暂存记录列表: ```bash git stash list ``` 3. 合并远程分支: ```bash git merge origin/main ``` 4. 恢复暂存内容: ```bash git stash pop # 恢复并删除最近一次暂存 # 或指定特定暂存 git stash apply stash@{1} ``` **优点**:保持工作目录整洁,特别适合处理紧急合并任务[^2]。 ### 三、撤销本地更改(revert) **适用场景**:本地修改可丢弃(如实验性代码或错误修改)。 **操作步骤**: 1. 撤销所有未提交的修改: ```bash git checkout -- . # 全部文件 # 或指定文件 git checkout -- file1.txt ``` 2. 执行合并操作: ```bash git merge origin/main ``` **风险提示**:此操作不可逆,需确认文件无需保留。 --- ### 对比决策表 | 方法 | 保留记录 | 可恢复性 | 适用阶段 | |---------|----------|----------|------------------| | commit | ✅ | ✅ | 功能开发完成时 | | stash | ❌ | ✅ | 开发中途临时切换 | | revert | ❌ | ❌ | 放弃无效修改 | ### 扩展应用场景 - 当存在多个暂存时,可用`git stash list`查看记录,通过`git stash apply stash@{n}`精准恢复 - 合并后出现冲突时,可使用`git mergetool`可视化工具解决冲突 - 长期分支开发推荐使用`git rebase`保持提交历史线性
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chhttty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值