4、边界条件设计原则:等价类划分、边界值分析、因果图法、正交实验法
做HIL测试这么多年,我越来越觉得——边界条件设计,才是测试用例设计的灵魂。
你想想看,系统在正常工况下跑得好好的,一到了极限状态就崩了。这种事儿我见过太多次了。说白了,边界条件就是系统的「软肋」。今天我就把这四种最经典的方法掰开揉碎了讲给你听。
4.1 等价类划分:别做无用功
等价类划分,核心思想就一句话:把输入域分成若干「等价」的区间,每个区间只测一个值就够了。
为什么?因为同一个区间里的值,系统处理逻辑是一样的。你测了10个、20个,结果都一样,纯属浪费时间。
核心原则:
- 有效等价类:符合需求、系统能正常处理的输入
- 无效等价类:不符合需求、系统应拒绝或报错的输入
举个例子。一个车速信号,范围是0~200 km/h。
| 输入范围 | 等价类 | 测试值示例 |
|---|---|---|
| 0 ~ 200 | 有效等价类 | 100 |
| < 0 | 无效等价类 | -10 |
| > 200 | 无效等价类 | 250 |
我在项目中遇到过有人把0到200之间每个整数值都测了一遍,测了整整两天。我问他为什么,他说「怕漏掉」。其实没必要,等价类划分就是帮你省这个力的。
我的习惯:每个等价类至少选一个代表值。无效等价类尤其不能漏,很多bug就藏在「不该出现」的输入里。
4.2 边界值分析:bug最喜欢待的地方
等价类划分解决了「测哪个区间」的问题,但还不够。经验告诉我,bug最喜欢待在边界上。
边界值分析,就是专门抓这些边界上的bug的。它的逻辑很简单:取每个等价类的边界值,以及边界两侧紧邻的值。
还是那个车速信号,0~200 km/h。边界值分析要测哪些?
- 最小值:0
- 略小于最小值:-1(无效)
- 略大于最小值:1
- 最大值:200
- 略小于最大值:199
- 略大于最大值:201(无效)
你看,一共才6个值,比全量测试少太多了,但覆盖率极高。
注意:边界值分析不能替代等价类划分。两者是互补关系。先划分等价类,再在边界上做文章,这才是标准做法。
我曾经在一个项目中,发现ECU在车速刚好199 km/h时,会误触发一个限速报警。开发查了半天,发现是边界判断条件写成了「>= 200」而不是「> 200」。这种bug,你不测边界根本发现不了。
4.3 因果图法:理清逻辑关系
前面两种方法,处理的是单个输入。但实际系统中,多个输入之间往往有复杂的逻辑关系。这时候就需要因果图法了。
因果图法的核心是:找出「因」(输入条件)和「果」(输出结果)之间的逻辑关系,然后生成测试用例。
常见的逻辑关系有:
- 与(AND):所有条件都满足,结果才成立
- 或(OR):任一条件满足,结果就成立
- 非(NOT):条件不满足时,结果才成立
- 异或(XOR):只有一个条件满足时,结果成立
举个例子。一个电池管理系统,当「电池温度过高」且「持续超过5秒」时,触发过温保护。这就是一个典型的AND关系。
用因果图法,你会得到这样的测试组合:
| 温度过高 | 持续超过5秒 | 预期结果 |
|---|---|---|
| 是 | 是 | 触发保护 |
| 是 | 否 | 不触发 |
| 否 | 是 | 不触发 |
| 否 | 否 | 不触发 |
你看,4个组合就把所有逻辑路径覆盖了。如果不用因果图法,你可能会凭直觉乱测一通,漏掉关键组合。
我的建议:因果图法特别适合有复杂逻辑判断的系统,比如安全策略、故障诊断、模式切换。画一张因果图,比写100行测试用例更管用。
4.4 正交实验法:用最少的组合覆盖最多的场景
当输入条件很多时,全组合测试的用例数量会爆炸。比如有5个输入,每个有3种取值,全组合就是3^5=243种。太多了,测不完。
正交实验法就是来解决这个问题的。它用一套数学方法,选出「最有代表性」的组合,用最少的用例覆盖最多的场景。
正交实验法的核心工具是正交表。比如L9(3^4)表示:最多4个因素,每个因素3个水平,只需要9个测试用例。
举个例子。一个空调控制系统,有4个因素:
- 温度设定:16°C、22°C、30°C
- 风速:低、中、高
- 模式:制冷、制热、送风
- 扫风:开、关
全组合是3×3×3×2=54种。用正交表,可能只需要9~18种。
正交实验法的步骤:
- 确定因素(输入条件)和水平(每个条件的取值)
- 选择合适的正交表
- 将因素和水平映射到正交表上
- 生成测试用例
我记得有一次做VCU的HIL测试,输入条件有7个,每个有2~4种取值。全组合算下来上千种,根本不可能。后来我用正交实验法,只用了32个用例就覆盖了所有关键组合。老板看了直呼内行。
注意:正交实验法不能保证覆盖所有组合,但能保证覆盖所有「两两组合」。对于大多数系统来说,两两组合已经足够发现绝大部分bug了。
4.5 四种方法的对比与选择
说了这么多,你可能会问:到底什么时候用哪种?
我个人的经验是这样的:
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 等价类划分 | 单个输入,取值范围明确 | 简单、高效 | 无法处理多输入逻辑 |
| 边界值分析 | 有明确边界的输入 | 发现边界bug能力强 | 需要配合等价类使用 |
| 因果图法 | 多输入有逻辑关系 | 逻辑覆盖全面 | 画图费时,条件多时复杂 |
| 正交实验法 | 多输入、多水平,组合爆炸 | 用例少、覆盖广 | 无法保证全组合覆盖 |
实际项目中,我通常是混合使用的。先等价类划分和边界值分析搞定单个输入,再用因果图法梳理逻辑关系,最后用正交实验法压缩用例数量。一套组合拳下来,测试质量杠杠的。
避坑指南:我曾经在一个项目中只用了等价类划分,没做边界值分析,结果漏了一个边界bug,导致ECU在低温环境下频繁误报警。从那以后,我再也不敢偷懒了。边界值分析,必须做。
4.6 知识体系总览
下面这张图,是我自己整理的边界条件设计方法的知识体系。你可以把它当作一个快速参考。
好了,边界条件设计的四种方法就讲到这里。记住,测试不是为了证明系统没问题,而是为了找到问题。边界条件,就是问题最喜欢藏身的地方。用心设计,别偷懒。
公众号:蓝海资料掘金营,微信deep3321