3. 测试用例设计方法:等价类划分法、边界值分析法、因果图法、判定表法在Simulink中的应用

做测试这么多年,我越来越觉得——测试用例设计,才是整个测试工作的灵魂。你Simulink模型搭得再漂亮,如果测试用例没设计好,那就像盖了栋大楼却忘了装消防系统。今天咱们就聊聊四种经典的测试用例设计方法,以及它们在Simulink里怎么落地。

核心观点:测试用例设计不是为了证明程序没bug,而是为了发现隐藏的bug。好的用例设计,能让你用最少的测试成本,覆盖最多的功能场景。

3.1 等价类划分法:把无穷变成有限

等价类划分,说白了就是把输入数据分成几个“等价”的组。同一组里的数据,程序处理方式应该是一样的。你只需要从每组里挑一个代表来测就行。

举个例子。假设你有个Simulink模型,功能是判断车速是否超限。输入范围是0~200 km/h。那我们可以这样划分:

  • 有效等价类:0 ≤ 车速 ≤ 200(正常范围)
  • 无效等价类:车速 < 0(负值)
  • 无效等价类:车速 > 200(超范围)

我在项目中遇到过一件事。有个同事把输入范围设成了0~255,但他只测了50、100、150三个值。结果上线后,用户输入了-1,模型直接崩溃了。为什么?因为他没测无效等价类。嗯,从那以后,我每次评审测试用例,都会先问一句:“无效等价类覆盖了吗?”

Simulink实战技巧:在Simulink Test中,你可以用Test Sequence模块来定义不同等价类的输入。每个Step对应一个等价类,方便又清晰。

3.2 边界值分析法:bug最喜欢藏在边界上

经验告诉我,程序出问题的地方,十有八九在边界上。边界值分析法就是专门抓这些边界bug的。它和等价类划分是黄金搭档——等价类划分确定范围,边界值分析聚焦边界。

还是车速的例子。边界值要测哪些点?

边界类型 测试值 说明
下边界 0 最小值
下边界+1 1 最小值右侧
上边界 200 最大值
上边界-1 199 最大值左侧
内点 100 中间值(可选)

你想想看,如果模型里有个判断条件是“车速 >= 0”,那测0和测-1的结果可能完全不同。边界值分析法就是帮你抓住这些“差之毫厘,谬以千里”的场景。

注意:在Simulink中,浮点数比较要特别小心。比如判断“车速 == 0”,由于浮点精度问题,0.0000001可能被判为不等于0。我建议用容差比较,或者用abs(x - target) < eps的方式。

3.3 因果图法:理清输入输出的逻辑关系

因果图法,名字听着挺唬人,其实核心就一句话:搞清楚“什么原因导致什么结果”。它特别适合处理输入条件之间有逻辑组合的场景。

举个例子。一个汽车门锁控制系统:

  • 原因(输入):C1 = 钥匙插入,C2 = 车门关闭,C3 = 按下锁车键
  • 结果(输出):E1 = 车门上锁

逻辑关系是:只有钥匙插入且车门关闭时,按下锁车键才会生效。用因果图画出来,就是C1和C2是与关系,再和C3是与关系,最后得到E1。

我个人习惯,在Simulink里做因果图分析时,会先用Truth Table模块来建模。这个模块天然支持逻辑表达,你只需要把原因和结果填进去,它自动帮你生成逻辑矩阵。

我的经验:因果图法最大的价值不是画图本身,而是帮你梳理需求。很多时候,需求文档里写的逻辑是模糊的,一画因果图,矛盾就暴露出来了。我曾经用这个方法,在项目早期就发现了三个需求逻辑冲突,避免了后期返工。

3.4 判定表法:穷举所有组合

判定表法,说白了就是一张“如果...那么...”的表格。它把所有的条件组合都列出来,然后告诉你每种组合下应该是什么结果。它和因果图法是孪生兄弟——因果图帮你理清逻辑,判定表帮你穷举测试。

还是门锁的例子。三个条件(钥匙插入、车门关闭、按下锁车键),每个条件有真/假两种取值,总共2^3=8种组合。判定表长这样:

条件/规则 1 2 3 4 5 6 7 8
钥匙插入 T T T T F F F F
车门关闭 T T F F T T F F
按下锁车键 T F T F T F T F
车门上锁 T F F F F F F F

你看,只有规则1(三个条件全真)时,车门才会锁上。其他7种组合都不会锁。这就是判定表法的威力——它逼着你把每一种可能性都想到。

Simulink实战技巧:在Simulink Test中,你可以用Test Condition模块来定义判定表中的条件。每个条件对应一个输入端口,然后通过Test Sequence来遍历所有组合。我一般会写一个脚本自动生成这些组合,省得手动一个个敲。

3.5 四种方法的综合运用

你可能会问:“那我到底该用哪种方法?”我的回答是:别死板,组合着用。

  • 等价类划分 + 边界值分析:处理单个输入参数的取值范围。先划分等价类,再聚焦边界值。这是最基础、最常用的组合。
  • 因果图 + 判定表:处理多个输入参数之间的逻辑组合。先用因果图理清关系,再用判定表穷举测试。这是处理复杂逻辑的利器。

我记得有一次,一个ESP系统的模型有12个输入条件。如果用判定表穷举,2^12=4096种组合,根本测不完。怎么办?我先把输入条件按功能分组,每组用因果图分析,找出关键条件,然后对关键条件用判定表,非关键条件用等价类。这样一优化,测试用例从4096降到了不到200个。效果还很好,上线后没出过问题。

核心原则:测试用例设计不是越多越好,而是越精越好。用等价类划分缩小范围,用边界值分析抓住关键点,用因果图理清逻辑,用判定表确保覆盖。四者结合,才能设计出高效的测试用例。

3.6 本章知识体系

下面这张图,是我梳理的本章知识体系。它展示了四种方法的核心思想、适用场景以及它们之间的关系。你可以把它当作一个快速参考。

测试用例设计方法知识体系 测试用例设计方法 等价类划分法 边界值分析法 因果图法 判定表法 核心:分组测试 适用:单个输入范围 核心:聚焦边界 适用:输入边界值 核心:逻辑关系 适用:多条件组合 核心:穷举组合 适用:逻辑验证 常用组合:等价类 + 边界值(处理范围) | 因果图 + 判定表(处理逻辑) Simulink落地:Test Sequence + Truth Table + Test Condition 原则:用最少的用例,覆盖最多的场景

好了,这四种方法就讲完了。你可能会觉得理论有点多,但别急,后面几章我们会结合具体的Simulink模型,一步步演示怎么用这些方法设计测试用例。到时候你就知道,这些方法不是纸上谈兵,是真能帮你省时间的。


公众号:蓝海资料掘金营,微信deep3321