2. 测试环境搭建:Simulink基础配置、测试工具链选择、模型在环测试平台搭建
好,咱们直接进入正题。测试环境搭建这件事,说白了就是给MIL测试搭个台子。台子搭不好,后面的戏全白唱。我见过太多团队,模型写得漂亮,结果一跑测试就崩,最后发现是环境配置的锅。
我个人习惯,在开始任何MIL测试之前,先把三件事理清楚:Simulink怎么配、工具链怎么选、平台怎么搭。这三件事搞定了,后面至少省一半的调试时间。
2.1 Simulink基础配置:别让默认设置坑了你
Simulink默认配置其实挺“佛系”的。它不会主动帮你做代码生成优化,也不会帮你检查模型规范。你想想看,如果直接用默认配置跑MIL测试,结果能靠谱吗?
我建议你按下面这几步来配:
- 求解器设置:固定步长,选
discrete (no continuous states)。为什么?因为MIL测试里我们只关心离散逻辑,连续求解器反而会引入不必要的计算误差。我在项目中遇到过,有人用了变步长求解器,结果测试结果每次都不一样,查了两天才发现是求解器的问题。 - 数据类型检查:打开
Signal Attributes > Signal Conversion,强制所有信号类型显式定义。别让Simulink帮你自动推断类型,那玩意儿在复杂模型里容易翻车。 - 代数环检测:在
Diagnostics > Algebraic Loop里设为error。代数环是MIL测试的头号杀手,我曾经因为一个隐藏的代数环,让整个测试平台卡死了一整天。 - 模型引用:如果你的模型是分模块开发的,记得把
Model Referencing的Rebuild选项设为If any changes detected。不然你改了子模型,主模型还是用旧版本跑测试,结果对不上。
核心要点:Simulink配置的核心就一句话——让模型的行为可预测、可重复。任何可能导致随机性或不确定性的设置,统统关掉。
2.2 测试工具链选择:别贪多,够用就行
工具链这块,我见过两种极端:一种是啥工具都不用,纯手工写脚本;另一种是啥工具都装上,结果互相冲突。说实话,这两种我都踩过坑。
我个人推荐的标准配置是这样的:
| 工具类别 | 推荐工具 | 为什么选它 |
|---|---|---|
| 测试管理 | Simulink Test | 原生集成,不用额外装插件,测试用例和模型绑定得最紧 |
| 覆盖率分析 | Simulink Coverage | 和Simulink Test无缝对接,跑完测试直接出报告 |
| 数据管理 | Excel + MATLAB脚本 | 轻量级,团队里谁都会用,不用额外培训 |
| 自动化执行 | MATLAB脚本 + Jenkins | 免费、灵活,适合持续集成场景 |
嗯,这里要注意:别一上来就上企业级工具链。我刚开始做MIL测试时,团队非要上某个商业测试管理平台,结果光培训就花了两周,最后发现很多功能根本用不上。说白了,工具是为你服务的,不是让你去伺候工具的。
我的经验:如果团队小于10个人,先用Simulink Test + Excel撑半年。等测试用例超过500条了,再考虑上更重的工具链。别问我怎么知道的——都是血泪教训。
2.3 模型在环测试平台搭建:从零到一
平台搭建这块,我习惯分三步走。每一步都有坑,我一个个说。
第一步:搭建测试框架
测试框架说白了就是“测试用例怎么跑、结果怎么存、报告怎么出”。我常用的结构是这样的:
MIL_Test_Project/
├── Models/ # 被测模型
│ └── Controller.slx
├── TestCases/ # 测试用例
│ ├── TC_001.m
│ └── TC_002.m
├── TestResults/ # 测试结果
│ └── 2024-01-01/
├── Scripts/ # 自动化脚本
│ ├── run_all_tests.m
│ └── generate_report.m
└── Config/ # 配置文件
└── test_config.m
这个结构我用了好几年,最大的好处是清晰。新同事来了,看一眼目录结构就知道东西放哪。我曾经在一个项目里见过,测试脚本和模型文件混在一起,找条测试用例得翻半天文件夹。
第二步:编写测试执行脚本
脚本不用太复杂,但一定要能批量执行、自动记录。我给你看个简化版的例子:
% run_all_tests.m
% 批量执行所有MIL测试用例
% 加载模型
load_system('Controller');
% 获取所有测试用例文件
testFiles = dir('TestCases/*.m');
% 循环执行
for i = 1:length(testFiles)
% 执行测试用例
run(testFiles(i).name);
% 记录结果
save(['TestResults/', datestr(now, 'yyyy-mm-dd'), '/', ...
testFiles(i).name(1:end-2), '_result.mat']);
end
% 生成报告
generate_report();
你看,核心逻辑就这几行。别整那些花里胡哨的框架,先把基础跑通再说。
第三步:验证平台可用性
平台搭好了,别急着上正式测试。先跑几个“冒烟测试”验证一下:
- 空跑测试:输入全零,看输出是不是预期值。如果连空跑都不过,说明模型或者平台有问题。
- 边界测试:给最大最小值,看模型会不会崩。我遇到过,模型在正常工况下跑得好好的,一到边界就报错。
- 重复性测试:同一个用例跑三遍,看结果是不是完全一致。如果不一致,说明环境有随机因素没关干净。
避坑指南:我曾经在搭建平台时,忽略了Simulink的缓存机制。结果第一次跑测试正常,第二次跑就报错。查了半天才发现,是Simulink缓存了旧版本的模型。解决方案很简单:在脚本开头加一句 Simulink.fileGenControl('set', 'CacheFolder', tempdir),每次跑测试都用新的缓存目录。
2.4 平台搭建后的第一件事:跑个“Hello World”
平台搭好了,我建议你先别急着写复杂的测试用例。先跑一个最简单的“Hello World”测试:给一个常量输入,看输出是不是常量。这一步能验证:
- 模型加载没问题
- 测试脚本能正常执行
- 结果能正常保存
- 报告能正常生成
说白了,就是确认整个链条是通的。我见过有人花了两周搭平台,结果第一个测试就跑不通,最后发现是模型路径配错了。这种低级错误,一个“Hello World”测试就能发现。
总结一下:测试环境搭建这件事,别追求一步到位。先把基础配好,选个趁手的工具链,搭个能用的平台,然后跑个“Hello World”验证一下。后面再慢慢优化。记住,能跑起来的简单平台,比永远在搭建中的完美平台强一百倍。
好,这一章就到这。下一章咱们聊聊测试用例设计的具体方法,到时候我会分享一些我在实际项目中用过的“骚操作”。