第4章 基于逻辑场景的测试设计:参数空间与组合爆炸
逻辑场景这东西,说白了就是给自动驾驶测试搭了个「参数游乐场」。你想想看,一个场景里有多少变量?车速、距离、光照、道路曲率……每个变量稍微动一动,测试用例就成倍增长。我刚开始做这块时,真被参数组合搞到头秃。
今天咱们就聊聊,怎么在逻辑场景里定义参数空间,怎么对付组合爆炸,以及等价类和边界值这些经典方法怎么用在场景测试里。
4.1 逻辑场景参数空间定义
逻辑场景和具体场景的区别在哪?我个人的理解是:逻辑场景是一个「参数模板」,具体场景是模板的一次实例化。
举个例子,前车切入场景。逻辑场景里,参数包括:
- 自车速度:30~120 km/h
- 目标车速度:20~100 km/h
- 切入角度:10°~45°
- 横向距离:1.5~5.0 m
- 纵向距离:10~80 m
每个参数都有取值范围,这就是参数空间。嗯,这里要注意:参数空间不是越大越好。我在项目中遇到过,有人把自车速度设到0~200 km/h,结果生成了一堆毫无意义的低速场景——你想想看,高速公路上谁会开10 km/h?
核心原则:参数空间要覆盖真实运行设计域(ODD),别为了覆盖而覆盖。
4.2 参数组合爆炸问题
好,现在参数空间定义好了。假设我们有6个参数,每个参数取5个值。全部组合就是5⁶ = 15625个场景。如果每个场景跑30秒,那就是130小时。这还只是一个场景类型!
为什么会这样?说白了就是「维度诅咒」。参数每多一个,组合数就翻倍。我见过最夸张的项目,一个逻辑场景定义了12个参数,每个参数10个值——10¹²,这谁跑得完?
怎么破?我个人习惯用三种方法:
- 正交实验设计:用最少的组合覆盖最多的参数对。比如6参数5水平,全组合要15625,正交表只要25组。
- 参数优先级排序:先跑关键参数组合,次要参数固定为典型值。
- 机器学习采样:用拉丁超立方或贝叶斯优化,智能选择高价值组合。
我的经验:别一上来就搞全组合。先跑一轮正交实验,看看哪些参数对结果影响大,再针对性地加密采样。这样效率最高。
4.3 等价类与边界值分析
等价类和边界值,这俩是软件测试的老朋友了。但在自动驾驶场景里,怎么用?
4.3.1 等价类划分
把参数空间分成几个「等价区域」,每个区域里选一个代表值测试。比如自车速度:
| 等价类 | 范围 | 代表值 | 测试意义 |
|---|---|---|---|
| 低速 | 0~30 km/h | 20 km/h | 城市拥堵场景 |
| 中速 | 30~80 km/h | 60 km/h | 城市快速路 |
| 高速 | 80~120 km/h | 100 km/h | 高速公路 |
我曾经犯过一个错:把低速类划到0~40,结果40 km/h这个值既算低速又算中速,两边都测了,浪费。后来我学乖了,等价类之间要「互斥且完备」。
4.3.2 边界值分析
经验告诉我,很多事故都发生在边界附近。比如:
- 自车速度刚好30 km/h(低速与中速的边界)
- 切入角度刚好45°(最大允许角度)
- 横向距离刚好1.5 m(最小安全距离)
边界值测试要覆盖:上点、下点、内点。举个例子,速度范围30~120 km/h:
上点:30, 120
下点:29, 121(略超边界)
内点:75(中间值)
避坑指南:我曾经只测了边界内的值,忽略了边界外一点点的情况。结果有一次,自车速度29.5 km/h时,AEB系统误触发——因为算法把29.5当成了「低速模式」,阈值判断出了bug。从那以后,边界外0.5~1个单位的值,我必测。
4.4 实战:一个完整的逻辑场景设计
咱们拿「前车急刹」场景练练手。参数定义如下:
| 参数 | 范围 | 等价类 | 边界值 |
|---|---|---|---|
| 自车速度 | 30~120 km/h | 低速30~50, 中速50~90, 高速90~120 | 30, 50, 90, 120 |
| 前车减速度 | -2~-8 m/s² | 轻微-2~-4, 中等-4~-6, 紧急-6~-8 | -2, -4, -6, -8 |
| 初始距离 | 10~80 m | 近10~30, 中30~60, 远60~80 | 10, 30, 60, 80 |
| 路面附着 | 0.3~0.9 | 低0.3~0.5, 中0.5~0.7, 高0.7~0.9 | 0.3, 0.5, 0.7, 0.9 |
用正交表L9(3⁴)设计9个测试用例:
用例1: 自车40, 前车-3, 距离20, 附着0.4
用例2: 自车40, 前车-5, 距离45, 附着0.6
用例3: 自车40, 前车-7, 距离70, 附着0.8
用例4: 自车70, 前车-3, 距离45, 附着0.8
用例5: 自车70, 前车-5, 距离70, 附着0.4
用例6: 自车70, 前车-7, 距离20, 附着0.6
用例7: 自车100, 前车-3, 距离70, 附着0.6
用例8: 自车100, 前车-5, 距离20, 附着0.8
用例9: 自车100, 前车-7, 距离45, 附着0.4
然后再加上边界值用例:
边界用例1: 自车30, 前车-2, 距离10, 附着0.3
边界用例2: 自车120, 前车-8, 距离80, 附着0.9
边界用例3: 自车29, 前车-1.9, 距离9, 附着0.29
一共12个用例,覆盖了主要参数组合和关键边界。你想想看,如果全组合要跑多少?4⁴=256个。效率提升了20倍。
总结一下:逻辑场景测试设计,核心就三步——定义参数空间、用正交/优先级对抗组合爆炸、用等价类+边界值精选测试点。这三板斧用好了,测试效率翻倍,bug检出率还不降。
嗯,今天就聊到这。下一章咱们讲讲「基于场景的测试覆盖率度量」,到时候我会分享一个我踩过的坑——覆盖率100%了,但漏了一个关键场景,结果……