第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 环境搭建的整体流程

我把环境搭建的步骤画成了一张流程图。你照着走,基本不会漏。

测试环境搭建流程 硬件环境搭建 台架 / HIL / 实车 软件环境搭建 ADB / 串口 / 日志 网络环境搭建 CAN / 以太网 环境验证:连通性测试 + 功能冒烟 脚本执行与结果收集 说明: 1. 硬件环境是基础,必须先搭建并确认供电、通信正常 2. 软件环境依赖硬件,ADB和串口需要正确的驱动和权限 3. 网络环境最后配置,CAN和以太网需要正确的终端电阻和IP 4. 环境验证不能跳过,我见过太多人直接跑脚本然后一脸懵

核心原则:环境搭建的顺序不能乱。先硬件,再软件,最后网络。每一步都要验证通过,再往下走。

2.5 常见问题与避坑

我这些年踩过的坑,列几个典型的:

  • ADB设备列表为空:检查USB调试是否开启,驱动是否安装,换根数据线试试
  • 串口乱码:波特率不匹配,或者地线没接好
  • CAN总线无响应:终端电阻没接(120欧姆),或者CAN_H/CAN_L接反了
  • 以太网丢包:网线质量差,或者交换机端口协商失败
  • 日志文件太大:设置日志轮转,或者只抓取指定级别的日志

我曾经踩过的一个大坑:在HIL上跑了一整夜的回归测试,第二天发现所有脚本都失败了。查了半天,原来是HIL的时钟不同步,导致日志时间戳错乱,脚本里的超时判断全乱了。从那以后,我每次搭建环境都会先同步时钟。

环境搭建看起来琐碎,但它是脚本稳定运行的基础。你花1小时把环境搭好,后面能省10小时调试时间。嗯,这个账要算清楚。