4. 场景分类与参数化:功能场景、逻辑场景、具体场景的定义、场景参数化方法(OEDR模型)、场景变体生成技术、基于场景的测试用例设计

各位工程师朋友,咱们今天聊聊场景分类与参数化。说实话,这是整个预期功能安全测试里最核心、也最容易被忽视的一环。我见过太多团队一上来就猛跑仿真,结果跑了一堆无效场景,问题一个没抓到。为什么?因为场景没分清楚,参数没定义好。

好,咱们一步步来。

4.1 场景的三个层次:功能、逻辑、具体

场景分类,说白了就是三个层次:功能场景逻辑场景具体场景。这三个概念,我建议你像记自己的工号一样记牢。

核心理解:功能场景是“做什么”,逻辑场景是“怎么做”,具体场景是“做出来什么样”。

4.1.1 功能场景(Functional Scenario)

功能场景是最抽象的层次。它只描述“发生了什么”,不关心具体数值。比如:

  • “前车突然减速”
  • “行人横穿马路”
  • “车道线模糊”

嗯,这里要注意:功能场景通常用自然语言描述,是测试工程师和系统工程师沟通的起点。我个人习惯在项目初期先拉一个功能场景清单,哪怕只有十几条,也比没有强。

4.1.2 逻辑场景(Logical Scenario)

逻辑场景开始引入参数范围。它不指定具体值,但告诉你参数在什么区间内变化。举个例子:

  • 前车速度:10~60 km/h
  • 自车速度:30~80 km/h
  • 相对距离:5~50 m
  • 路面摩擦系数:0.3~0.8

逻辑场景的价值在于——它定义了测试空间的边界。我在项目中遇到过,有人把逻辑场景的参数范围设得太宽,结果仿真跑了一周还没跑完。后来我建议先做敏感性分析,把关键参数挑出来,范围收窄,效率直接翻倍。

4.1.3 具体场景(Concrete Scenario)

具体场景就是参数都定死了。比如:

  • 前车速度:40 km/h
  • 自车速度:60 km/h
  • 相对距离:20 m
  • 路面摩擦系数:0.7

说白了,具体场景就是一条可执行的测试用例。你把它扔进仿真器,就能跑出结果来。

4.2 场景参数化方法:OEDR模型

好,场景分清楚了,接下来怎么参数化?我个人比较推崇OEDR模型。OEDR是四个维度的缩写:

维度 英文 中文 举例
O Operational 运行环境 天气、光照、路面、交通标志
E Environmental 环境要素 静态障碍物、动态交通参与者
D Dynamic 动态行为 自车速度、目标车加速度、变道意图
R Risk 风险因素 遮挡、传感器退化、通信延迟

为什么用OEDR?因为它覆盖了场景的方方面面。我曾经在做一个城市NOA项目时,团队只关注了O和E,结果D和R没覆盖到,导致一个关键场景漏测——雨天+遮挡+前车急刹。嗯,那次教训挺深刻的。

我的建议:每个逻辑场景至少从O、E、D、R四个维度各选2~3个参数。这样既能保证覆盖度,又不会让参数组合爆炸。

4.3 场景变体生成技术

有了参数化方法,下一步就是生成场景变体。说白了,就是从一个逻辑场景里变出成百上千个具体场景。常用的方法有三种:

4.3.1 组合测试(Combinatorial Testing)

把每个参数的取值范围离散化,然后做组合。比如:

  • 前车速度:{20, 40, 60} km/h
  • 自车速度:{40, 60, 80} km/h
  • 相对距离:{10, 20, 30} m

3×3×3 = 27个具体场景。你想想看,如果参数再多几个,组合数会爆炸。所以一般用pairwise或orthogonal array来降维。

4.3.2 边界值分析(Boundary Value Analysis)

这个我特别喜欢用。为什么?因为很多bug都出在边界上。比如:

  • 相对距离刚好等于最小安全距离
  • 前车速度刚好等于自车速度
  • 路面摩擦系数刚好在干湿交界处

我记得有一次,一个AEB功能在相对距离5.0m时触发正常,但4.9m时就不触发了。查了半天,发现是阈值判断写成了“>5.0”而不是“>=5.0”。边界值分析,真的能救命。

4.3.3 随机采样(Random Sampling)

在参数空间内随机撒点。适合探索未知区域,但效率不高。我一般用它做补充,而不是主力。

注意:随机采样不能保证覆盖到所有关键边界。建议先用边界值分析覆盖边界,再用组合测试覆盖内部,最后用随机采样做补充。

4.4 基于场景的测试用例设计

好,最后一步——怎么把场景变成可执行的测试用例?我总结了一个四步法:

  1. 选场景:从逻辑场景中选一个,确定参数范围
  2. 定参数:用OEDR模型把参数定下来
  3. 生变体:用组合测试或边界值分析生成具体场景
  4. 写用例:把具体场景写成测试用例,包括前置条件、输入、预期输出

举个例子:

测试用例ID: TC-AEB-001
功能场景: 前车突然减速
逻辑场景: 
  - 前车速度: 30~50 km/h
  - 自车速度: 50~70 km/h
  - 相对距离: 10~30 m
具体场景:
  - 前车速度: 40 km/h
  - 自车速度: 60 km/h
  - 相对距离: 20 m
前置条件: 天气晴朗,路面干燥,车道线清晰
输入: 前车以-4 m/s²减速
预期输出: 自车在2.5秒内触发AEB,减速度≥-6 m/s²,且与前车保持≥1m距离

嗯,这里要注意:预期输出一定要写清楚,不能写“系统应正常响应”这种废话。什么叫正常?你得量化。

4.5 本章知识体系总览

最后,我用一张图把本章的核心逻辑串起来。你一看就明白了。

场景分类与参数化知识体系 功能场景 逻辑场景 具体场景 场景参数化方法:OEDR模型 O: 运行环境 E: 环境要素 D: 动态行为 R: 风险因素 场景变体生成技术 组合测试 边界值分析 随机采样 基于场景的测试用例设计(四步法) 抽象→具体 抽象→具体

这张图把整个流程串起来了:从功能场景出发,经过逻辑场景的参数化,再到具体场景的生成,最后落地为测试用例。你想想看,每一步都有明确的方法和工具,是不是清晰多了?

最后说一句:场景分类和参数化,看着是基础工作,但基础不牢,地动山摇。我见过太多项目在后期才发现场景覆盖不全,回头补场景,成本翻了好几倍。所以,一开始就把这个框架搭好,后面会省很多事。


公众号:蓝海资料掘金营,微信deep3321