第2章:测试环境搭建——硬件、软件与网络
测试环境搭建,说白了就是给脚本找个能跑的地方。我见过太多人,脚本写得漂亮,一上环境就崩。为什么?环境没搭对。
这一章,咱们把硬件台架、软件工具、网络链路这三块说透。你跟着走一遍,后面写脚本心里就有底了。
2.1 硬件环境:台架、HIL、实车
硬件环境分三个层级。我按项目阶段给你排个序:
| 类型 | 适用阶段 | 核心设备 | 我的建议 |
|---|---|---|---|
| 台架 | 功能开发、模块验证 | 开发板、屏幕、MCU | 适合脚本调试,成本低 |
| HIL | 集成测试、回归测试 | 实时机、IO板卡、负载箱 | 能模拟故障,脚本必须过这关 |
| 实车 | 验收测试、路试 | 整车、诊断仪、数据记录仪 | 最后一道防线,脚本要稳定 |
关键点:台架测功能,HIL测边界,实车测体验。脚本在这三个环境里跑,结果可能完全不同。
我个人习惯,先在台架上把脚本逻辑调通。台架响应快,重启也方便。等脚本稳定了,再上HIL跑一轮。HIL能模拟各种极端情况——比如CAN总线断掉、电源掉电、温度过高。这些场景,实车很难复现。
小技巧:台架和HIL的硬件接口尽量保持一致。我遇到过台架上用USB转CAN,HIL上用PCIe CAN卡,结果脚本里波特率配置不一样,折腾了半天。
2.2 软件环境:ADB、串口工具、日志抓取
软件工具是脚本和硬件之间的桥梁。我常用的三件套:
2.2.1 ADB(Android Debug Bridge)
智能座舱大部分基于Android。ADB就是你的远程控制手柄。
常用命令:
# 连接设备
adb connect 192.168.1.100:5555
# 安装应用
adb install -r test_app.apk
# 模拟触摸
adb shell input tap 500 300
# 抓取日志
adb logcat -c
adb logcat -v time > logcat_output.txt
注意:ADB连接不稳定时,脚本里要加重试机制。我曾经因为ADB断连,导致一个回归脚本跑了3小时全废了。
2.2.2 串口工具
串口是调试的最后一根救命稻草。系统卡死了,ADB连不上,串口还能看输出。
我推荐的工具:
- PuTTY:轻量,支持串口和SSH
- SecureCRT:功能强,支持脚本录制
- minicom:Linux下首选
串口配置参数:
| 参数 | 常见值 | 说明 |
|---|---|---|
| 波特率 | 115200 | 大部分板子默认 |
| 数据位 | 8 | 固定 |
| 停止位 | 1 | 固定 |
| 校验位 | None | 无校验 |
避坑指南:我曾经在HIL上遇到串口乱码,折腾了半天发现是地线没接好。串口线一定要用屏蔽线,长度别超过3米。
2.2.3 日志抓取
日志是脚本的“黑匣子”。测试挂了,第一件事就是看日志。
我常用的日志抓取方式:
- logcat:Android系统日志,按级别过滤
- dmesg:内核日志,看驱动和硬件问题
- tcpdump:网络包日志,分析通信问题
- 自定义日志:脚本里自己打log,方便定位
Python脚本里抓日志的示例:
import subprocess
import threading
class LogCollector:
def __init__(self, device_ip):
self.device = device_ip
self.log_file = "test_log.txt"
def start_capture(self):
cmd = f"adb -s {self.device} logcat -v time"
self.process = subprocess.Popen(
cmd.split(),
stdout=open(self.log_file, 'w'),
stderr=subprocess.STDOUT
)
def stop_capture(self):
if self.process:
self.process.terminate()
self.process.wait()
2.3 网络环境:CAN与以太网
智能座舱里,CAN总线和以太网是两条命脉。脚本要跟它们打交道。
2.3.1 CAN总线
CAN总线控制着车辆的核心功能——车窗、空调、车门、灯光。脚本通过CAN发送和接收报文。
CAN报文结构:
| 字段 | 长度 | 说明 |
|---|---|---|
| ID | 11位/29位 | 报文标识符 |
| DLC | 4位 | 数据长度(0-8字节) |
| Data | 0-8字节 | 实际数据 |
Python操作CAN的示例(使用python-can库):
import can
# 初始化CAN接口
bus = can.interface.Bus(
channel='can0',
bustype='socketcan'
)
# 发送报文
msg = can.Message(
arbitration_id=0x123,
data=[0x01, 0x02, 0x03, 0x04],
is_extended_id=False
)
bus.send(msg)
# 接收报文
for msg in bus:
print(f"ID: {hex(msg.arbitration_id)}, Data: {msg.data.hex()}")
注意:CAN总线有优先级。ID越小优先级越高。脚本里发送报文时,别把关键报文(比如刹车信号)的ID设得太低,否则会干扰车辆控制。
2.3.2 以太网
以太网负责高带宽数据——导航地图、OTA升级、视频流。脚本通过TCP/UDP跟座舱通信。
我常用的以太网测试场景:
- 网络连通性:ping、telnet
- 带宽测试:iperf
- 协议测试:HTTP、MQTT、SOME/IP
- 延迟测试:ping延迟、TCP往返时间
Python脚本里测试网络延迟:
import subprocess
import re
def ping_test(host, count=10):
cmd = f"ping -c {count} {host}"
result = subprocess.run(
cmd.split(),
capture_output=True,
text=True
)
# 提取平均延迟
match = re.search(
r'rtt min/avg/max/mdev = [\d.]+/([\d.]+)',
result.stdout
)
if match:
return float(match.group(1))
return None
2.4 环境搭建的整体流程
我把环境搭建的步骤画成了一张流程图。你照着走,基本不会漏。
核心原则:环境搭建的顺序不能乱。先硬件,再软件,最后网络。每一步都要验证通过,再往下走。
2.5 常见问题与避坑
我这些年踩过的坑,列几个典型的:
- ADB设备列表为空:检查USB调试是否开启,驱动是否安装,换根数据线试试
- 串口乱码:波特率不匹配,或者地线没接好
- CAN总线无响应:终端电阻没接(120欧姆),或者CAN_H/CAN_L接反了
- 以太网丢包:网线质量差,或者交换机端口协商失败
- 日志文件太大:设置日志轮转,或者只抓取指定级别的日志
我曾经踩过的一个大坑:在HIL上跑了一整夜的回归测试,第二天发现所有脚本都失败了。查了半天,原来是HIL的时钟不同步,导致日志时间戳错乱,脚本里的超时判断全乱了。从那以后,我每次搭建环境都会先同步时钟。
环境搭建看起来琐碎,但它是脚本稳定运行的基础。你花1小时把环境搭好,后面能省10小时调试时间。嗯,这个账要算清楚。