4. 测试序列核心概念:测试用例、测试步骤、测试序列、测试包的概念与关系
好,咱们今天来聊聊测试序列设计里最基础、也最容易搞混的几个概念。说实话,我见过不少工程师,干了两年HIL,还在纠结“测试用例”和“测试步骤”到底有啥区别。嗯,这其实不怪大家,因为dSPACE的工具链里,这些概念的层级关系确实需要一点时间来消化。
我个人习惯把这件事想成一个“俄罗斯套娃”的结构。你想想看,最外面是一个大箱子,里面套着中箱子,中箱子里再套着小箱子。咱们的测试架构,说白了也是这个道理。
4.1 测试用例:最小的可执行单元
先说说最核心的——测试用例。我把它定义为“一个完整的、不可再拆分的测试场景”。
什么叫“完整”?就是它必须包含三样东西:
- 输入条件:你要给被测对象什么信号?比如给一个5V的电压,或者发一个CAN报文。
- 执行动作:你要做什么操作?比如等待2秒,或者踩下油门踏板。
- 期望结果:你希望看到什么?比如故障灯亮起,或者转速达到3000rpm。
我在项目中遇到过一种情况:有人把“打开点火开关”和“检查仪表盘自检灯”拆成了两个测试用例。结果呢?执行的时候发现,灯闪了一下就灭了,根本来不及检查。为什么?因为这两个动作在时间上是强关联的,拆开就失去了意义。所以,测试用例的粒度,要以“一次完整的验证闭环”为准。
核心要点:一个测试用例,就是一个“输入-执行-检查”的完整闭环。它不能再拆,拆了就不完整了。
4.2 测试步骤:用例里的最小动作
那测试步骤是什么?说白了,它就是测试用例里的“最小动作单元”。
举个例子,一个测试用例叫“验证车窗一键升降功能”。它里面可能包含这些步骤:
- 发送“下降”指令
- 等待500ms
- 检查车窗位置是否到达底部
- 发送“上升”指令
- 等待500ms
- 检查车窗位置是否到达顶部
你看,这6个步骤合在一起,才构成了一个完整的测试用例。单独拎出来第3步“检查车窗位置”,它什么也验证不了,因为它缺少前面的动作条件。
这里有个容易踩的坑。我曾经见过一个同事,把测试步骤写得特别细,连“延时10ms”都单独写一步。结果测试序列变得又臭又长,维护起来想死的心都有。我的建议是:测试步骤的粒度,以“一个不可中断的操作”为准。比如“发送报文”算一步,“等待响应”算一步,“检查结果”算一步。别把“延时”这种辅助操作单独列出来,除非它对时序有特殊要求。
我的小技巧:写测试步骤时,你可以问自己一个问题:“这一步如果失败了,我能不能明确知道是哪个动作出了问题?”如果能,粒度就合适;如果不能,说明步骤太粗了。
4.3 测试序列:用例的编排与调度
好,有了测试用例,咱们怎么把它们串起来?这就轮到测试序列登场了。
测试序列,说白了就是“测试用例的执行计划”。它定义了:
- 先跑哪个用例,后跑哪个用例
- 用例之间有没有依赖关系
- 如果某个用例失败了,是继续往下跑,还是停下来
- 用例之间需不需要复位系统
我记得有一次做ADAS的HIL测试,客户要求跑100个场景。我一开始傻乎乎地把所有测试用例按顺序排好,结果跑到第37个的时候,系统因为前一个用例的残留状态直接崩溃了。从那以后,我学乖了——测试序列里一定要考虑“状态复位”。要么在每个用例开始前做一次系统初始化,要么在用例之间插入一个“等待系统稳定”的步骤。
在dSPACE的AutomationDesk里,测试序列通常表现为一个流程图。你可以用条件分支、循环、并行执行这些结构来编排用例。我个人习惯把测试序列分成三段:
- 前置准备:上电、初始化、建立通信
- 核心测试:按顺序或按条件执行测试用例
- 后置清理:下电、保存日志、生成报告
注意:测试序列不是简单的“用例列表”。它要处理异常、超时、重试这些真实世界中一定会遇到的问题。如果你写的序列只能跑“完美路径”,那它离实用还差得远。
4.4 测试包:组织与管理的大容器
最后说说测试包。这个概念最简单,也最好理解——它就是用来装测试序列的“文件夹”。
你想想看,一个项目可能有几十个测试序列,分别对应不同的功能模块。比如:
- 动力系统测试包
- 车身控制测试包
- 信息娱乐测试包
- ADAS测试包
每个测试包下面,又可以按子功能继续分层。比如“动力系统测试包”下面,还可以有“发动机测试序列”、“变速箱测试序列”、“混动模式切换测试序列”。
这里我想强调一点:测试包的划分,最好和你的系统架构对齐。我在一个项目里见过有人按“测试工程师的名字”来分测试包,结果换个人接手,根本找不到对应的测试序列在哪。嗯,这种坑咱们就别踩了。
4.5 四者的关系:一张图说清楚
说了这么多,咱们用一张表格来总结一下这四个概念的关系:
| 概念 | 层级 | 作用 | 类比 |
|---|---|---|---|
| 测试包 | 最高层 | 组织和管理测试序列 | 文件夹 |
| 测试序列 | 第二层 | 编排测试用例的执行顺序和逻辑 | 剧本 |
| 测试用例 | 第三层 | 定义完整的测试场景 | 场景 |
| 测试步骤 | 最底层 | 描述具体的操作动作 | 台词 |
你看,从测试包到测试步骤,是一个从“宏观管理”到“微观执行”的逐层细化过程。测试包管的是“测什么模块”,测试序列管的是“按什么顺序测”,测试用例管的是“每个场景怎么测”,测试步骤管的是“每一步具体做什么”。
最后说一句掏心窝子的话:这四个概念本身并不难,难的是在实际项目中保持一致的划分标准。我建议你在项目一开始就定好规则,比如“每个测试用例不超过20个步骤”、“每个测试序列包含5-15个用例”。有了这些硬性约束,你的测试架构才不会随着时间推移变得乱七八糟。
好,这一节就到这里。下一节咱们聊聊怎么用AutomationDesk把这些概念落地成真正的代码。到时候我会带大家手写一个完整的测试序列,敬请期待。