Simulink Test自动化(二)-基于Excel与API的测试用例批量生成与管理
1. 为什么需要Excel+API的测试用例自动化方案
第一次接触Simulink Test时,我也像大多数人一样手动创建测试用例。记得有个项目需要验证200多个边界条件,光是复制粘贴测试步骤就花了整整三天,更别提中间还改过三次需求。这种经历让我深刻认识到:当测试用例超过20个时,手动操作就会成为效率黑洞。
传统手动创建Test Sequence的痛点非常明显:
- 版本迭代成本高:每次需求变更都要重新调整多个测试步骤
- 容易出错:人工操作难免出现跳转条件漏改、步骤顺序错乱
- 难以复用:相似的测试逻辑无法批量克隆和修改
而Excel+API的方案恰好解决了这些问题。我们团队实测下来,用这套方法:
- 生成100个测试用例的时间从8小时缩短到15分钟
- 需求变更时只需修改Excel模板后重新运行脚本
- 测试逻辑通过Excel单元格公式就能实现复用
更重要的是,这种方案不需要高深的编程技巧。只要会用Excel写公式,了解基本的MATLAB脚本操作,就能快速上手。下面我会用具体案例展示如何实现。
2. Excel模板设计的实战技巧
2.1 字段设计背后的逻辑
很多教程只告诉你要在Excel里放哪些列,但没说清楚为什么这样设计。经过十几个项目的实践,我总结出模板设计的黄金法则:
| TestStepName | TestStepAction | WhenCondition | TestVerify | NextStep | Description | |--------------|----------------|---------------|------------|----------|-------------| | Start | x=0; y=0; | - | - | Step1 | 初始化 | | Step1 | x=x+1; | x<5 | verify(x<10)| Step2 | 递增测试 |关键字段的作用:
WhenCondition:控制子步骤执行的条件语句(相当于if判断)TestVerify:验证语句会自动包装成verify(condition,msg)格式NextStep:用字符串匹配实现跳转逻辑,比图形化连线更易维护
2.2 必须避开的三个坑
数据类型陷阱:Excel默认数字是double,但模型可能要求single。建议在模板里添加类型注释列:
| Signal | Type | Value | |--------|--------|-------| | throttle | single | 0.5 |命名冲突:避免使用MATLAB关键字(如end、if)作为步骤名。我习惯加前缀:
| TestStepName | |--------------| | step_end |路径管理:建议用相对路径+环境变量:
projRoot = getenv('PROJECT_ROOT'); excelPath = fullfile(projRoot,'TestCases','scenario1.xlsx');
3. API操作详解与代码实战
3.1 Test Harness的生命周期管理
直接删除重建Harness虽然简单,但在大型项目中会丢失历史数据。更专业的做法是版本控制:
% 检查并备份现有Harness harnessList = sltest.harness.find(modelName); if ~isempty(harnessList) backupName = [harnessList(1).name '_bak_' datestr(now,'yyyymmdd')]; sltest.harness.create(modelName,'Name',backupName,... 'Source',harnessList(1).name); end3.2 动态生成Test Sequence的进阶技巧
条件跳转的智能处理:根据WhenCondition自动设置IsWhenStep属性
for i = 1:height(testSteps) hasWhen = ~isempty(testSteps.WhenCondition{i}) && ... ~strcmp(testSteps.WhenCondition{i},'-'); sltest.testsequence.addStepAfter(seqName, ... testSteps.TestStepName{i}, ... 'Action', testSteps.TestStepAction{i}, ... 'IsWhenStep', hasWhen); end验证语句的自动包装:将Excel中的条件表达式转为verify语句
if contains(testSteps.TestVerify{i}, '>') || ... contains(testSteps.TestVerify{i}, '<') actionStr = ['verify(' testSteps.TestVerify{i} ',''' ... testSteps.Description{i} ''')']; else actionStr = testSteps.TestVerify{i}; end4. 企业级应用的最佳实践
4.1 版本控制集成方案
在团队协作中,我推荐这样的文件结构:
/test_cases /v1.0 template.xlsx # 字段定义文档 scenario_001.xlsx # 具体测试场景 /v1.1 template.xlsx scenario_001.xlsx /scripts generate_harness.m # 主生成脚本 /lib excel_parser.m # Excel解析模块4.2 自动化测试流水线
结合持续集成工具(如Jenkins)可以实现:
- Excel更新触发自动生成测试用例
- 夜间批量执行回归测试
- 自动对比不同版本的测试覆盖率
配置示例:
#!/bin/bash matlab -batch "generate_harness('projectRoot','$WORKSPACE')" sltest -mymodel -report output.pdf5. 调试技巧与性能优化
当遇到生成错误时,建议按这个顺序排查:
Excel格式验证:用
readtable+assert检查必填字段data = readtable('test.xlsx'); assert(~any(ismissing(data.TestStepName)),'步骤名不能为空');API执行日志:启用详细日志记录
sltest.testsequence.enableLogging(seqName,true);内存管理:大批量生成时及时清理
clear seqObj sltest.testsequence.clearAllData(seqName);
对于包含500+测试步骤的项目,可以:
- 分模块生成多个Sequence
- 使用
parfor并行处理 - 禁用实时更新显示
set_param(0,'AutoUpdateUI','off');
这套方案已经在多个汽车ECU项目中验证过稳定性。最近一个变速箱控制项目里,我们用它管理了1200多个测试用例,需求变更时只需修改模板后重新运行脚本,效率提升非常明显。
