4、边界值分析法:为什么边界容易出错、边界值选取原则、开区间与闭区间处理、实战案例:温度传感器阈值

边界值分析法,说白了就是找茬。找系统在临界点上的茬。

我做了十几年汽车电子测试,最怕听到的一句话就是:“这个值在边界上测过了,没问题。” 每次听到,我心里都咯噔一下。因为经验告诉我,边界是最容易出鬼的地方。

为什么边界容易出错?

你想想看,代码里最常见的逻辑是什么?是判断。

if (temperature >= 85) {
    // 开启风扇
}

这种判断,在数学上叫“分段函数”。分段函数最脆弱的地方,就是分段点。也就是边界。

为什么会这样?我总结了几点:

  • 开发人员的思维惯性:写代码时,人很容易默认“边界包含在内”。但需求文档可能写的是“大于85度”,而不是“大于等于85度”。一字之差,天壤之别。
  • 浮点数精度问题:汽车电子里大量使用浮点数。85.0 在内存里可能存成 84.99999。你测 85.0 通过了,但实际运行时 85.00001 就触发了另一个分支。这种坑,我踩过不止一次。
  • 时序问题:边界值往往伴随着状态切换。比如温度从84.9跳到85.1,中间经历了什么?采样周期、滤波算法、迟滞处理……任何一个环节出问题,边界就崩了。

核心观点:边界不是一条线,而是一个“灰色地带”。测试要覆盖的,是这个灰色地带里的所有可能性。

边界值选取原则

我个人习惯用“三点法”来选边界值。很简单,就三个点:

  1. 边界点本身:比如阈值是85,那就测85。
  2. 边界点左侧最近的有效值:比如84.9(假设精度是0.1)。
  3. 边界点右侧最近的有效值:比如85.1。

但这里有个细节。如果系统精度是0.5度呢?那左侧最近值就是84.5,右侧是85.5。别死板,要跟着精度走。

我记得有一次,一个同事测温度传感器,只测了85.0和86.0。我说你漏了84.9。他不信。结果一测,84.9的时候风扇没转,但需求里写的是“温度≥85度时开启”。84.9按理说不该转,但客户现场就是出现了误触发。为什么?因为传感器有0.2度的误差。84.9实际可能是85.1。你看,边界就是这么坑。

我的建议:除了“三点法”,再加一个“误差偏移点”。比如传感器精度是±0.5度,那就在85±0.5的位置再各加一个测试点。也就是84.5和85.5。这样能覆盖传感器本身的误差。

开区间与闭区间处理

这是边界值里最容易翻车的地方。开区间和闭区间,在代码里就是“>”和“>=”的区别。

举个例子:

// 闭区间:温度 ≥ 85 时报警
if (temperature >= 85) {
    alarm_on();
}

// 开区间:温度 > 85 时报警
if (temperature > 85) {
    alarm_on();
}

这两种写法,边界值完全不同。

  • 闭区间:边界是85。要测84.9(不报警)、85.0(报警)、85.1(报警)。
  • 开区间:边界是85。要测84.9(不报警)、85.0(不报警)、85.1(报警)。

你看,85.0这个点,在闭区间里是报警,在开区间里是不报警。如果需求文档写的是“大于85度”,但开发写成了“大于等于85度”,那85.0这个点就测不出来了。

我曾经在一个项目中遇到过这种情况。需求写的是“当车速超过120km/h时,发出超速警告”。开发写成了“>=120”。结果测试时,车速正好120,警告响了。客户验收时觉得没问题。但实际路试时,车速在119.9到120.1之间波动,警告时响时不响,搞得驾驶员很烦躁。最后查出来,就是开闭区间的问题。

避坑指南:测试前,一定要确认需求文档里用的是“大于”还是“大于等于”。如果文档写得不清楚,就按最严格的方式测——闭区间和开区间都测一遍。我曾经因为没确认这个,被客户投诉过。从那以后,我拿到需求的第一件事,就是拿红笔圈出所有“大于”、“小于”、“大于等于”、“小于等于”这些词。

实战案例:温度传感器阈值

好了,理论说完了。咱们来点实际的。

假设我们有一个电池包温度传感器。需求如下:

  • 温度 ≤ -20°C:低温保护,禁止充电。
  • -20°C < 温度 < 0°C:低温降功率,充电电流限制为50%。
  • 0°C ≤ 温度 ≤ 45°C:正常工作。
  • 45°C < 温度 < 60°C:高温降功率,放电电流限制为80%。
  • 温度 ≥ 60°C:高温保护,禁止放电。

你看,这里有三个边界:-20°C、0°C、45°C、60°C。而且每个边界的开闭区间都不一样。

我一般会这样设计测试用例:

边界点 测试值 预期行为 说明
-20°C -20.1°C 低温保护(禁止充电) 边界左侧
-20.0°C 低温保护(禁止充电) 边界点本身(闭区间)
-19.9°C 低温降功率(充电电流50%) 边界右侧
0°C -0.1°C 低温降功率(充电电流50%) 边界左侧(开区间)
0.0°C 正常工作 边界点本身(闭区间)
0.1°C 正常工作 边界右侧
45°C 44.9°C 正常工作 边界左侧
45.0°C 正常工作 边界点本身(闭区间)
45.1°C 高温降功率(放电电流80%) 边界右侧(开区间)
60°C 59.9°C 高温降功率(放电电流80%) 边界左侧(开区间)
60.0°C 高温保护(禁止放电) 边界点本身(闭区间)
60.1°C 高温保护(禁止放电) 边界右侧

你看,每个边界点我至少测了3个值。而且特别注意了开闭区间。比如0°C这个点,左侧是-0.1°C(开区间,不包含0),右侧是0.1°C(闭区间,包含0)。这样测下来,基本不会漏。

嗯,这里还要注意一点。温度传感器有迟滞特性。比如温度从下往上经过0°C,和从上往下经过0°C,行为可能不一样。所以边界测试还要考虑方向。我一般会加一组“反向测试”:比如从-1°C升到1°C,再从1°C降到-1°C,看看切换点是否一致。

总结一下:边界值测试不是简单的“测个边界点就行”。你要考虑精度、开闭区间、方向、误差。把这些都覆盖到了,边界才算是真正测透了。

最后说一句。边界值分析法,说白了就是“找茬”。但找茬不是目的,目的是让系统在边界上也能稳定运行。毕竟,汽车电子这东西,出一次边界问题,可能就是一次安全事故。咱们做测试的,责任重大啊。