第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¹²,这谁跑得完?

怎么破?我个人习惯用三种方法:

  1. 正交实验设计:用最少的组合覆盖最多的参数对。比如6参数5水平,全组合要15625,正交表只要25组。
  2. 参数优先级排序:先跑关键参数组合,次要参数固定为典型值。
  3. 机器学习采样:用拉丁超立方或贝叶斯优化,智能选择高价值组合。

我的经验:别一上来就搞全组合。先跑一轮正交实验,看看哪些参数对结果影响大,再针对性地加密采样。这样效率最高。

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%了,但漏了一个关键场景,结果……