第四章 测试用例设计方法论:等价类划分、边界值分析、因果图法、场景法在VCU测试中的应用
说实话,很多刚入行的测试工程师问我:VCU测试用例到底怎么设计才靠谱?
我的回答很简单——别一上来就想着全覆盖,那不现实。你得先掌握几把趁手的「兵器」。今天我就把这四样东西掰开了讲:等价类划分、边界值分析、因果图法、场景法。它们不是理论玩具,是真正能帮你发现VCU深层bug的利器。
4.1 等价类划分——别做重复劳动
等价类划分,说白了就是把输入数据分成几个「类」。同一类里的数据,测一个就够了。
我举个例子。VCU有个功能:车速信号输入范围是0~250 km/h。你想想看,0、50、100、200、250,这些值测一遍有意义吗?其实没太大区别。真正要关心的是三类:有效区间内的值、低于下限的值、高于上限的值。
我在项目中遇到过一个问题:某款VCU的油门踏板开度信号,设计范围是0%~100%。测试团队写了30多个用例,从0%、5%、10%一直测到100%。结果呢?漏掉了负值输入和大于100%的输入。后来我让他们改成等价类划分——只测了5个值:-1%(无效)、0%(边界)、50%(有效)、100%(边界)、110%(无效)。bug反而抓出来两个。
4.2 边界值分析——bug最喜欢待的地方
等价类划分的兄弟,就是边界值分析。为什么?因为程序员的判断逻辑,99%的bug都出在边界上。
你想想看,VCU里到处都是阈值判断:电池SOC低于20%报警、车速超过120 km/h限制动力、电机温度高于85°C降功率……这些边界值,就是bug的温床。
我记得有一次,某款VCU的再生制动功能,设定在车速低于5 km/h时退出。测试用例只测了4 km/h和6 km/h。结果呢?实车路试时,司机在5 km/h时踩刹车,再生制动突然退出,制动力瞬间变化,差点出事。后来一查,代码里写的是 if(speed < 5),应该用 <= 才对。
| 输入范围 | 等价类 | 边界值 |
|---|---|---|
| 车速 0~250 km/h | 有效、低于下限、高于上限 | -1, 0, 1, 249, 250, 251 |
| 电池SOC 0%~100% | 有效、低于下限、高于上限 | -1, 0, 1, 99, 100, 101 |
| 电机温度 -40~150°C | 有效、低于下限、高于上限 | -41, -40, -39, 149, 150, 151 |
4.3 因果图法——理清逻辑关系
因果图法,说白了就是画一张图,把「原因」和「结果」之间的关系理清楚。VCU里到处都是这种逻辑:如果A且B,则C;如果A或B,则D;如果非A,则E……
我刚开始做HIL测试时,最怕的就是这种组合逻辑。手动写用例,写100个都未必覆盖全。后来学了因果图法,才明白——先画图,再转判定表,最后生成用例。效率翻倍。
举个例子。VCU的「蠕行功能」逻辑:
- 原因:档位在D或R(C1)、车速低于5 km/h(C2)、刹车未踩下(C3)、油门未踩下(C4)
- 结果:输出蠕行扭矩(E1)
- 逻辑关系:C1 且 C2 且 C3 且 C4 → E1
你看,四个原因,每个有「成立」和「不成立」两种状态,理论上2^4=16种组合。但用因果图法,你可以先排除互斥组合(比如档位同时在D和R),再合并等价组合,最后可能只需要6~8个用例。
4.4 场景法——模拟真实驾驶
前面三种方法,都是「从输入出发」。场景法不一样,它是「从用户行为出发」。
你想想看,司机开车时不会想「我现在输入一个车速信号,再输入一个油门信号」。他只会做一件事:踩油门、踩刹车、打转向灯、挂挡……这些连续的操作,就是场景。
场景法的核心是:识别「基本流」和「备选流」。
- 基本流: 正常驾驶流程。比如:上电→挂D挡→踩油门→加速→松油门→滑行→踩刹车→停车→挂P挡→下电。
- 备选流: 异常或特殊流程。比如:上电后直接挂R挡、行驶中误挂P挡、高速时突然踩死刹车、电池SOC过低时强制加速……
我记得有一次,测试团队用场景法设计了一个「连续坡道起步」的用例:车辆停在30%坡道上,司机反复松刹车、踩油门、溜坡、再起步。结果发现VCU的坡道辅助功能在第三次起步时失效了,车辆后溜了半米。这个bug,用等价类划分和边界值分析根本发现不了。
4.5 四种方法如何搭配使用?
你可能会问:这四种方法,到底怎么选?
我的建议是:别单选,要组合。
- 先用场景法:梳理出VCU的核心功能场景,比如起步、加速、减速、停车、充电、故障处理。
- 再用因果图法:针对每个场景中的逻辑判断,画出因果关系,生成判定表。
- 然后用等价类划分:对每个输入条件,划分有效类和无效类,减少重复测试。
- 最后用边界值分析:对每个数值型输入,补充边界值测试用例。
举个例子。测试「能量回收功能」:
- 场景法:模拟下坡、减速、跟车、红灯停车等场景
- 因果图法:分析「车速>10 km/h 且 刹车踩下 且 SOC<95%」→ 启动回收
- 等价类划分:车速分3类(<10、10~120、>120),SOC分3类(<95%、95%~100%、>100%)
- 边界值分析:车速测9、10、11 km/h,SOC测94%、95%、96%
4.6 实战案例:VCU扭矩仲裁测试
最后,我拿一个真实案例收尾。VCU的扭矩仲裁功能,是整车控制的核心。它要综合驾驶员需求、能量回收需求、限功率需求、故障保护需求,最终输出一个扭矩值。
用场景法,我设计了5个场景:
- 场景1:正常加速(驾驶员扭矩最大)
- 场景2:能量回收介入(回收扭矩优先)
- 场景3:电池过热限功率(限功率扭矩覆盖)
- 场景4:故障保护(输出0扭矩)
- 场景5:多需求冲突(驾驶员踩油门同时触发回收)
用因果图法,我画出了仲裁逻辑的判定表,共12个条件组合。用等价类划分,我把每个扭矩输入分成3类。用边界值分析,我补充了0 Nm、最大扭矩、最小扭矩附近的测试点。
最终,我用了42个用例,覆盖了全部仲裁逻辑。实车测试时,只发现了1个微小的标定参数问题。嗯,这就是方法论的力量。