一、CarMaker脚本化测试概述

什么是脚本化测试

脚本化测试,说白了就是用代码来替你做测试。

你想想看,平时我们在CarMaker里做测试,是不是这样:打开GUI,点几个按钮,设置场景,然后点运行?一次两次还行,但当你需要跑几百个场景时,手都点酸了。

脚本化测试就是把这些操作写成脚本。CarMaker里用的是Python或TCL脚本。脚本一跑,测试自动执行。结果自动保存。你只需要坐在旁边喝杯咖啡。

我个人习惯把脚本化测试分成三层:

  • 底层:控制CarMaker的API调用,比如启动仿真、读取传感器数据
  • 中层:测试逻辑,比如判断碰撞时间、检查制动距离
  • 上层:测试管理,比如批量调度、结果汇总

我在项目中遇到过一件事。有个同事手动测试了200个场景,花了整整两周。结果客户说参数要调一下。他当场崩溃。后来我们用脚本重写了一遍,参数调整只需要改一个配置文件,重新跑一遍,半天搞定。

核心要点:脚本化测试不是把手工操作翻译成代码,而是用代码思维重新设计测试流程。

为什么需要批量生成

这个问题其实很直接。你想想看,一个ADAS功能要验证多少场景?

测试维度 参数数量 组合数
车速 5个值(30/50/70/90/120 km/h) 5
目标类型 3种(轿车/卡车/行人) 3
天气 3种(晴天/雨天/雾天) 3
道路曲率 3种(直道/弯道/连续弯) 3
总计 135种组合

135个场景,手工搭?搭一个场景平均10分钟,那就是1350分钟,22.5个小时。而且人还会出错。

我曾经有一次手工搭场景,搭到第80个时,脑子已经糊了。结果把两个场景的参数搞反了,导致整个测试结果作废。嗯,从那以后我再也不手工搭批量场景了。

批量生成的好处很明显:

  • 速度快:脚本生成一个场景只要几毫秒
  • 不出错:参数组合由代码控制,不会漏也不会重复
  • 好维护:需求变了,改一行代码就行
  • 可复现:同样的脚本,谁跑结果都一样

小技巧:我建议用Excel或CSV管理参数组合。脚本读文件,自动生成场景。这样测试工程师也能参与参数设计,不用写代码。

CarMaker测试框架简介

CarMaker的测试框架,其实就三块东西:

  1. TestManager:测试管理器,负责调度测试用例
  2. TestRun:测试执行引擎,跑具体的场景
  3. DataManager:数据管理器,存测试结果

它们之间的关系,我画了张图:

CarMaker测试框架核心结构 TestManager 测试调度器 TestRun 执行引擎 DataManager 数据管理器 Python / TCL 脚本层 场景生成 · 参数配置 · 结果解析 调度指令 执行结果 数据存储 测试用例库(Test Case Library) 参数化场景模板 · 边界值 · 组合覆盖 用户:配置参数 → 启动批量 → 查看报告 输出:HTML报告 · Excel · 日志文件

这张图你看懂了吗?我解释一下:

  • TestManager 是大脑。它决定先跑哪个用例,后跑哪个。支持并行执行,也支持依赖关系。
  • TestRun 是手脚。它负责加载场景、启动仿真、采集数据。每个TestRun实例跑一个测试用例。
  • DataManager 是记忆。它把测试结果存成文件,支持CSV、MAT、HDF5等格式。

脚本层在中间,连接用户和框架。你写的Python脚本,通过CarMaker提供的API,调用TestManager、TestRun、DataManager的功能。

注意:CarMaker的API文档有几百页。别想着全看完。我刚开始时也试图通读,结果看了三天,啥也没记住。后来我总结了一个方法:先写一个最简单的脚本跑通,然后遇到问题再查文档。这样效率高得多。

举个最简单的脚本例子:

# 一个最简单的CarMaker脚本
import carmaker

# 创建测试管理器
tm = carmaker.TestManager()

# 加载测试用例
tm.load_test_case("AEB_Straight_30kph")

# 设置参数
tm.set_parameter("ego_speed", 30)  # km/h
tm.set_parameter("target_distance", 50)  # 米

# 运行
tm.run()

# 获取结果
result = tm.get_result("collision_time")
print(f"碰撞时间: {result} 秒")

这段代码虽然简单,但包含了脚本化测试的核心流程:加载、配置、执行、获取结果。后面的章节,我们会一步步把它扩展成能批量生成几百个测试用例的完整框架。

我的经验:刚开始写脚本时,别追求完美。先让一个用例跑通,再考虑批量。跑通一个用例,你就掌握了80%的知识。剩下的20%,是在踩坑中学会的。


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