2、测试基础理论:黑盒与白盒测试、等价类与边界值、测试用例设计方法
各位同学,咱们今天聊聊测试理论。我知道,一听到「理论」两个字,很多人就开始犯困了。别急,我当年也是这样。但干汽车电子这行十几年,我越来越觉得,这些基础理论才是真正保命的家伙。
说白了,理论就是前人踩过的坑,总结出来的经验。你想想看,一个ECU(电子控制单元)的软件可能有几十万行代码,要是没有一套系统的方法去测,那跟闭着眼睛开车有什么区别?
2.1 黑盒测试 vs 白盒测试
先说说这两个最基础的概念。我习惯这么理解:
- 黑盒测试:你只管输入和输出,不管里面怎么折腾。就像你开车,踩油门车就走,踩刹车车就停。你不需要知道发动机是怎么喷油的,变速箱是怎么换挡的。
- 白盒测试:你得把盖子掀开,看里面的代码逻辑跑得对不对。每条分支、每个条件都得覆盖到。
我在项目中遇到过一件事。有个同事做雨量传感器的测试,只做黑盒——下雨了雨刮就动,没下雨就不动。结果呢?有一次雨刮在晴天突然自己刷起来了。查了半天,原来是代码里有个变量初始化的bug。这就是黑盒测不出来的问题。
我的建议是:黑盒保功能,白盒保质量。两者缺一不可。
汽车电子里,黑盒测试通常用在系统级和集成测试阶段。比如你测一个车窗控制器,你只关心按上升键车窗是否上升,按下降键是否下降。至于控制器里用的是状态机还是PID算法,那是白盒的事。
白盒测试呢,更多用在单元测试和代码审查阶段。我记得有一次做BMS(电池管理系统)的测试,发现一个过压保护的逻辑分支从来没被执行过。为什么?因为前面的条件判断写错了,那个分支根本进不去。这种问题,黑盒是永远测不出来的。
2.2 等价类与边界值
好,接下来是重头戏。等价类和边界值,这两个方法我几乎每天都在用。
等价类划分,说白了就是把输入数据分成几个「类」。同一类里的数据,测一个就够了。比如你测一个温度传感器,输入范围是-40°C到125°C。那你可以分成:
- 有效等价类:-40°C 到 125°C
- 无效等价类(低于下限):小于 -40°C
- 无效等价类(高于上限):大于 125°C
你不需要测-39°C、-38°C、-37°C……每个温度都测一遍。从每个等价类里挑一个代表值就行。这样能大大减少测试用例的数量。
边界值分析,这个更有意思。经验告诉我,80%的bug都出在边界上。为什么?因为程序员写代码的时候,最容易搞混的就是「大于」和「大于等于」这种边界条件。
一个小技巧:边界值一般取边界点、边界点-1、边界点+1。比如范围是[1, 100],那你要测0、1、2、99、100、101这六个值。
我曾经在测试一个车速信号处理模块时,发现车速在0 km/h和1 km/h之间切换时,仪表盘会闪一下。查了半天,原来是代码里写的是 if(speed > 0),应该写成 if(speed >= 0)。边界值没处理好,一个低级错误。
2.3 测试用例设计方法
有了上面的基础,咱们来看看怎么设计测试用例。我常用的方法有这几种:
2.3.1 等价类划分法
刚才讲过了,就是把输入域分成若干等价类,每个类选一个代表。适用于输入数据范围很大的场景。
2.3.2 边界值分析法
专门针对边界条件。适用于有明确数值范围的输入。
2.3.3 因果图法
这个稍微复杂一点。当输入条件之间有逻辑关系时,比如「如果A且B,则输出C;如果A或B,则输出D」。这时候用因果图能帮你理清逻辑。
我记得在测一个自动大灯控制逻辑时,输入条件有:环境光照度、车速、雨刮状态。输出是:大灯开/关。这三个条件之间有复杂的与、或、非关系。用因果图画了一遍,才发现有两个组合情况之前完全没考虑到。
2.3.4 场景法
这个在汽车电子里特别实用。你模拟一个完整的用户操作场景,从开始到结束。比如:
- 用户上车
- 插入钥匙(或按启动按钮)
- 仪表盘自检
- 挂D挡
- 踩油门起步
- 行驶过程中切换各种功能
- 停车熄火
每个步骤里都可能隐藏着bug。场景法能帮你发现那些「孤立测试」发现不了的问题。
2.3.5 错误推测法
这个靠经验。你想想看,哪些地方最容易出问题?比如:
- 数据溢出
- 除零操作
- 空指针
- 并发访问
- 通信超时
我一般会在设计用例时,专门列一个「易错点清单」,对着清单一个个测。嗯,这个习惯帮我省了不少返工的麻烦。
2.4 实战:设计一个测试用例
咱们拿一个具体的例子来练练手。假设你要测试一个「车窗防夹功能」:
- 车窗上升过程中,如果遇到阻力大于100N,立即停止并下降50mm
- 车窗位置范围:0mm(全关)到 500mm(全开)
- 阻力传感器精度:±5N
你会怎么设计测试用例?
按我习惯的思路:
- 等价类划分:阻力值分为小于100N、等于100N、大于100N三类
- 边界值分析:测95N、100N、105N(考虑传感器精度)
- 场景法:车窗在不同位置(0mm、250mm、500mm)遇到阻力的情况
- 错误推测:如果车窗在下降过程中又遇到阻力怎么办?如果连续触发防夹怎么办?
注意:防夹功能是安全相关功能,测试时一定要用假人或者软质物体模拟阻力,千万别用手或者身体去试!我曾经见过有人用手去试,结果被夹得嗷嗷叫。
好了,这一章的内容就到这里。理论是枯燥的,但它是你以后少踩坑的保障。下一章咱们聊聊测试环境的搭建,那才是真正动手的时候。
本章要点回顾:
- 黑盒测试看功能,白盒测试看代码
- 等价类划分减少测试量,边界值分析抓住bug高发区
- 测试用例设计要综合运用多种方法
- 安全相关的测试,安全第一
公众号:蓝海资料掘金营,微信deep3321