ECU-HIL 嵌入式车载软件测试零基础学习路线和面试描述方式(1)
- 目标岗位:ECU-HIL 嵌入式车载软件测试
- 可用条件:一台电脑
- 每天时长:3-4小时
- 最终产出:BCM 车身控制器 HIL 测试项目(简历可直接引用)+ 30 条用例 + 6 个 Bug 案例 + 正式测试报告 + CAPL 脚本
学习路线
| # | 精华 | 来源 |
|---|---|---|
| 1 | BCM 项目贯穿 14 天 + 全虚拟环境实操 + 简历直接产出 | 第三版核心:边学边做完整项目,工具链 CANoe → DBC → CAPL → VEOS → Linux → Jira 全覆盖 |
| 2 | UDS 诊断补充 + CAN 帧结构加深 + 通信专业差异化答题 | 第一版 + 建议:你是通信工程专业,CAN 是天然优势,面试碾压竞争者 |
| 3 | 每天闭环(知识点 → 练习题 → 话术 → 复盘)+ D11 同步投简历 | 第二版 + 建议:面试导向学习,边投边面,面试本身就是最好的模拟 |
CANoe / VEOS License 风险预案
| 方案 | 工具 | 说明 |
|---|---|---|
| Plan A(首选) | CANoe 14 试用版 + VEOS Demo | Vector 官网申请 30 天试用,确认 Virtual CAN 可用 |
| Plan B(备选) | python-can + cantools + can-utils | Python 库解析 DBC、收发虚拟报文,功能等价,面试同样能说"用过" |
面试话术(License 问题): "我在学习阶段用 BUSMASTER + python-can 搭建了虚拟总线环境,导入 DBC 文件完成报文收发和信号解析,入职后可以快速切换到 CANoe 正式环境。"
BCM需求文档(贯穿全周期的项目背景)
| 需求编号 | 功能描述 | CAN 报文 | 信号 | 逻辑 |
|---|---|---|---|---|
| REQ-01 | 上锁 | 0x120 | Lock_Sig=1 | 四门落锁,近光灯关闭 |
| REQ-02 | 解锁 | 0x120 | Lock_Sig=0 | 四门解锁,近光灯点亮 30s 后熄灭 |
| REQ-03 | 车速保护 | 0x120 | - | 车速>30 km/h 时,拒绝解锁指令 |
| REQ-04 | 雨刮间歇 | 0x135 | Wiper_Mode=1 | 每 3 秒摆动 1 次 |
| REQ-05 | 低压保护 | 0x120 | - | 电压<9V 时,上锁报文可能丢失 |
| REQ-06 | UDS诊断 | 0x7DF | SID=0x22 | 读取BCM版本信息(新增,练习UDS用) |
阶段一:基础 + CAN 核心(Day1-Day5)
Day1:测试理论 + BCM 需求拆解 + 首批用例(3-4h)
核心知识点(3个,不贪多):
- 车载测试标准流程(面试必背)
- 需求分析 → 测试方案 → 用例设计 → 搭建 HIL/实车环境 → 执行测试 → Bug 提交 → 回归测试 → 测试报告
为什么需要测试方案?
测试方案有很多图示,便于测试用例的设计,后续执行也方便,执行测试和路测 的时候设计用例看不懂,也可以参考测试方案。
场景举例:
ADAS(先进驾驶辅助系统)- LKA (车道保持辅助)

- 4 个黑盒方法(重点边界值)
- 等价类划分:有效/无效输入分组
什么是等价类划分法?
一种用例设计方法。指所有可能的输入数据分成若干个集合,每个集合中都是对于揭露软件错误等效的少数具有代表性的数据。核心是清楚出现 bug,是哪条规则的问题。
有效:对程序需求说明有意义、合理的、正确的输入数据所构成的集合。
无效:指不合理的或无意义的输入数据所构成的集合。
"无效等价类每条只能覆盖一个"------原因是:如果一条用例同时测了"密码为空"和"密码含特殊字符",两个都报错,你分不清是哪个触发的。
如何使用等价类划分设计用例?

总结:按数据范围、数据类型、为空、需求规则约束角度划分等价类,并规定唯一编号
设计测试用例,每一条尽可能多的覆盖有效等价类,直到覆盖所有有效等价类
设计测试用例,每一条只能覆盖一条无效等价类,直到覆盖所有无效等价类
举例:以密码的有效等价类测试为例:


口述 :根据需求,定义类型,之后逐个划分有效和无效等价类集合,并编号。每个集合内取代表性例子,设计有效等价类,尽可能多的覆盖有效等价类,直到覆盖完全。设计无效等价类每一个只能覆盖一条无效等价类,直到覆盖完全为止。无效等价类类似于控制变量法,每次只引入一个变量,实现判断是哪一个输入导致的问题。我之前做光栅解调仪测试,温度区间在
0-90 摄氏度,小于 0 或者大于 100,则是无效,在此区间内则是有效。分别设计验证场景。方法类似。
车载软件测试的例子,车速大于 30,BCM 车门自动上锁。设计有效条件为 1 车速处于 0-30,车门不上锁。2 大于 30。车门上锁。无效条件为,3 小于 0,4 空格信号丢失或非数字信号。之后分别设计测试用例。
**记忆口诀:有效就是有意义,只要能触发某个事件就行。无效是无法触发任何事件。**
- 边界值分析:车速 30km/h 临界点(29.9 / 30.0 / 30.1)
什么是边界值分析法? 是对等价划分法的一个补充,对于有范围值或者个数的限制的需求下,针对边界情况设计测试用例。
举例:

提示,对于车载测试速度方面对精度要求比较高,往往会选取29.9,30,30.1。
面试模拟问题:
给你一个车载场景:BCM雨刮间歇模式,每3秒摆动1次,允许设置间隔1~5秒。用边界值分析法,你测哪些值?
0.9、1、1.1、4.9、5、5.1
记忆口诀:所有边界,以及边界上下各选择一个,不关心中间的任何值。
-
场景法:模拟整车真实工况(上电→行驶→停车→锁车)
定义:多用于冒烟测试中,模拟用户在真实的使用中的各种情况。分为基本流和备选流(出现问题)。
打开车载空调
基本流:打开中控大屏---点击开空调---空调打开
备选流:电量不足无法打开空调 没有联网无法打开空调 车机未上电无法打开空调
-
错误推测法:低压9V、总线负载过高、掉电重启
定义:人员自身的经验,结合给出的场景。
- Bug四要素 + Jira字段
- 标题、复现步骤、预期结果、实际结果、附件(CAN报文截图、ECU日志)
实操任务:
- 按BCM需求编写8条测试用例(覆盖REQ-01~04)
- 格式:用例ID | 模块 | 前置条件 | 测试步骤 | 预期结果 | 优先级
Day1 面试模拟题(6 道)
1. 车载软件测试和普通互联网 APP 测试有什么区别?
(面试开篇必问,至少说3点)
--- 安全性要求不一样,车载要求高,互联网测试只是影响用户体验感。
车载需要软硬件结合,需要ECU+执行器+总线+传感器。还需要HIL台架。
通信协议不同,互联网用HTTP/JSON;车载用CAN/LIN/UDS诊断协议
周期不同,互联网迭代快(天/周);车载周期长(2-4年),发布后不可OTA全改。
面试的时候可以简单回答:车载测试要考虑硬件耦合、总线通信、电压波动、高低温等物理环境因素,安全优先级最高
2. 给你一个BCM 车窗控制功能:车速 > 30 km/h 时禁止一键升降,请用边界值分析法设计测试用例,说出你测哪些速度值?
设计测试用例:
29.9 一键升降可用
30 一键升降禁止
30.1 一键升降可用
3. 一条完整的测试用例包含哪些必要字段?
八个要素,编号、所属模块、标题、重要级别、预设条件、测试数据、测试步骤、预期结果。

4. 车载测试标准流程是什么?从需求到报告,按顺序说出来。
需求分析--测试计划--测试方案--测试用例--测试环境搭建--测试执行--缺陷管理--测试报告
① 需求分析(理解需求,提取测试点)
② 测试计划(资源、时间、范围)
③ 测试方案设计(策略、方法选择)
④ 测试用例设计(等价类/边界值)
⑤ 测试环境搭建(台架、CAN工具、DBC)
⑥ 测试执行(跑用例、记录结果)
⑦ 缺陷管理(提Bug、跟踪、回归验证)
⑧ 测试报告(覆盖率、遗留Bug、结论)
5. 你提交一个 Bug,开发说"我这里复现不了,不是 Bug",你怎么处理?
我会先自己多次复现,记录详细的步骤、日志和环境信息,然后带着证据和开发当面沟通。如果确实是偶发问题,我会标记为待观察,记录触发概率和条件,持续跟踪,不会直接关闭。
6. 你没有车载测试经验,凭什么能胜任这个岗位?
我有三个优势:
**软硬件联调经验:**做过FBG光纤光栅解调系统调试,涉及传感器+上位机+数据传输,和车载ECU+传感器+总线的架构是同一思路
**测试方法论扎实:**系统学过等价类、边界值、V模型,能独立从需求设计测试用例
**学习能力强:**两周内掌握了BUSMASTER和python-can工具链,能独立完成CAN报文收发和DBC解析
口头作答,每题控制在1分钟内。答完发我,我逐题批改打分。
面试话术(背诵):
"车载测试和互联网测试最大的区别是:车载测试要考虑硬件耦合、总线通信、电压波动、高低温等物理环境因素,安全优先级最高。我之前做 FBG 光纤光栅传感器调试时,也要考虑信号采样异常和硬件干扰,和车载测试的思维是一致的。。"
当日收尾: 8条用例写完。
BCM 需求回顾
| 编号 | 需求描述 |
|---|---|
| REQ-01 | 收到 Lock_Sig=1 → 车门上锁 |
| REQ-02 | 收到 Lock_Sig=0 → 车门解锁,灯光亮 30s 后自动灭 |
| REQ-03 | 车速 > 30 km/h 时,拒绝解锁请求 |
| REQ-04 | 雨刮拨杆切到间歇档 → 雨刮以 3s 间隔工作 |
8 条测试用例
TC-01:正常上锁
| 字段 | 内容 |
|---|---|
| 用例编号 | BCM-TC-01 |
| 所属模块 | 车门锁控制 |
| 用例标题 | 收到上锁信号,车门正常上锁 |
| 优先级 | P0 |
| 前置条件 | 车门处于解锁状态,车速=0 |
| 测试数据 | Lock_Sig=1 |
| 测试步骤 | ① 启动BCM ② 发送 Lock_Sig=1 |
| 预期结果 | 车门上锁,Lock_Status=1 |
TC-02:正常解锁+灯光
| 字段 | 内容 |
|---|---|
| 用例编号 | BCM-TC-02 |
| 所属模块 | 车门锁控制 |
| 用例标题 | 收到解锁信号,车门解锁并亮灯30s |
| 优先级 | P0 |
| 前置条件 | 车门处于上锁状态,车速=0 |
| 测试数据 | Lock_Sig=0 |
| 测试步骤 | ① 启动BCM ② 发送 Lock_Sig=0 ③ 等待30s |
| 预期结果 | 车门解锁,灯光亮起,30s后自动熄灭 |
TC-03:车速 30.1 时解锁被拒(边界值)
| 字段 | 内容 |
|---|---|
| 用例编号 | BCM-TC-03 |
| 所属模块 | 车门锁控制 |
| 用例标题 | 车速>30km/h时解锁请求被拒绝 |
| 优先级 | P0 |
| 前置条件 | 车门处于上锁状态 |
| 测试数据 | 车速=30.1 km/h,Lock_Sig=0 |
| 测试步骤 | ① 设置车速=30.1 ② 发送 Lock_Sig=0 |
| 预期结果 | 解锁被拒绝,车门保持上锁,灯光不亮 |
TC-04:车速 30 时解锁允许(边界值)
| 字段 | 内容 |
|---|---|
| 用例编号 | BCM-TC-04 |
| 所属模块 | 车门锁控制 |
| 用例标题 | 车速=30km/h时解锁请求正常执行 |
| 优先级 | P1 |
| 前置条件 | 车门处于上锁状态 |
| 测试数据 | 车速=30 km/h,Lock_Sig=0 |
| 测试步骤 | ① 设置车速=30 ② 发送 Lock_Sig=0 |
| 预期结果 | 解锁正常执行(30不满足>30),灯光亮30s |
TC-05:车速 29.9 时解锁允许(边界值)
| 字段 | 内容 |
|---|---|
| 用例编号 | BCM-TC-05 |
| 所属模块 | 车门锁控制 |
| 用例标题 | 车速=29.9km/h时解锁请求正常执行 |
| 优先级 | P1 |
| 前置条件 | 车门处于上锁状态 |
| 测试数据 | 车速=29.9 km/h,Lock_Sig=0 |
| 测试步骤 | ① 设置车速=29.9 ② 发送 Lock_Sig=0 |
| 预期结果 | 解锁正常执行,灯光亮30s |
TC-06:雨刮间歇模式
| 字段 | 内容 |
|---|---|
| 用例编号 | BCM-TC-06 |
| 所属模块 | 雨刮控制 |
| 用例标题 | 间歇档雨刮3s周期工作 |
| 优先级 | P1 |
| 前置条件 | 雨刮处于关闭状态 |
| 测试数据 | Wiper_Switch=INTERMITTENT |
| 测试步骤 | ① 启动BCM ② 拨杆切到间歇档 ③ 观察雨刮动作3个周期 |
| 预期结果 | 雨刮每 3s 刮一次,周期稳定 |
TC-07:无效锁信号
| 字段 | 内容 |
|---|---|
| 用例编号 | BCM-TC-07 |
| 所属模块 | 车门锁控制 |
| 用例标题 | 收到无效Lock_Sig信号不执行动作 |
| 优先级 | P2 |
| 前置条件 | 车门处于上锁状态 |
| 测试数据 | Lock_Sig=0xFF(无效值) |
| 测试步骤 | ① 启动BCM ② 发送 Lock_Sig=0xFF |
| 预期结果 | 车门保持原状态,不执行上锁/解锁,无灯光响应 |
TC-08:已上锁重复上锁
| 字段 | 内容 |
|---|---|
| 用例编号 | BCM-TC-08 |
| 所属模块 | 车门锁控制 |
| 用例标题 | 上锁状态再次发送上锁信号(幂等性) |
| 优先级 | P2 |
| 前置条件 | 车门已处于上锁状态 |
| 测试数据 | Lock_Sig=1 |
| 测试步骤 | ① 确认车门已上锁 ② 再次发送 Lock_Sig=1 |
| 预期结果 | 车门保持上锁,无异常报错,无重复执行声 |
8 条用例覆盖方法一览
| 用例 | 覆盖方法 | 覆盖需求 |
|---|---|---|
| TC-01 | 等价类(有效) | REQ-01 |
| TC-02 | 等价类(有效) | REQ-02 |
| TC-03 | 边界值(30.1) | REQ-03 |
| TC-04 | 边界值(30) | REQ-03 |
| TC-05 | 边界值(29.9) | REQ-03 |
| TC-06 | 等价类(有效) | REQ-04 |
| TC-07 | 等价类(无效输入) | 异常处理 |
| TC-08 | 状态转换(幂等) | REQ-01 |
面试话术:这8条用例覆盖了正常流程(TC-01/02/06)、边界值(TC-03/04/05)、异常输入(TC-07)和状态幂等(TC-08),符合V模型中需求级测试的设计要求。