
“软件测试卷到失业”在最近不是一句玩笑话。很多人从功能测试、接口测试一路做到管理岗突然发现自己引以为傲的经验正在被越来越多的外包团队、自动化平台和 AI 工具压缩价值。而另一边嵌入式测试、芯片测试、机器人测试的岗位需求却在持续增长很多公司招不到既懂测试方法论、又愿意碰硬件的人。这篇文章想给出的判断是软件测试的“卷”本质不是岗位变少了而是“没有差异化”的测试变多了。与其在原地拼细节不如把测试思维迁移到嵌入式、芯片和机器人这个供给更稀缺的赛道。转行不是清零重来你过去积累的用例设计、边界分析、风险把控能力恰恰是很多硬件测试工程师最缺的东西。1. 软件测试的“卷”卷在哪里先说结论软件测试的竞争压力不是某一个公司或某一个平台造成的而是结构性原因叠加的结果。第一个原因是入门门槛过低。功能测试、Web 测试、App 测试这些岗位很多内容经过两周培训就能上手。当供给大量增加而需求没有同比例增长时必然出现薪资天花板低、晋升通道窄、可替代性强的问题。第二个原因是业务外包化。很多企业的软件测试工作被拆分为“用例执行”和“用例设计”两层前者大量外包后者留给了极少数核心员工。如果你长期停留在执行层离开平台之后会发现自己的技能包非常单薄。第三个原因是工具和 AI 的替代效应。现在自动化测试平台已经在逐步覆盖回归测试、冒烟测试、UI 自动化AI 辅助测试工具也开始能根据页面变化自动生成基础用例。这不是说 AI 会立刻取代测试工程师而是说你过去赖以生存的“手工点一点、肉眼找 bug”的能力正在快速贬值。所以软件测试不是没有机会而是你需要换一个“测试供给不足”的方向。嵌入式、机器人、芯片测试正好属于这一类。2. 转行嵌入式测试真正要转的是什么很多人一听嵌入式就发怵觉得要重新学 C 语言、单片机、电路觉得这和自己完全不是一个世界。这是一种误解。转行嵌入式测试核心不是让你从零成为一个硬件工程师而是让你把测试能力迁移到“软硬件结合”的场景里。你不需要会设计一颗芯片也不需要会画 PCB但你需要能看懂原理图、看懂 datasheet、能通过调试工具去定位问题发生在硬件层还是软件层。从测试方法论看软件测试和嵌入式测试共用同一套底子等价类划分用来判定输入范围是否合理。边界值分析温度上下限、电压阈值、通信超时时间这些都是典型的边界条件。场景法把设备的上电、初始化、运行、异常、恢复等过程组合成测试场景。缺陷管理依然需要提单、复现、验证、回归。不同的是嵌入式测试多了一个“硬件变量”。软件测试只要保证代码逻辑正确输出基本可预期嵌入式测试里同样的代码在不同温度、不同电压、不同晶振误差下行为可能完全不一样。所以真正要转的不是方法论而是技术栈和调试手段。你需要新接触的东西包括单片机外设寄存器操作、GPIO 高低电平的观察、串口日志分析、示波器和逻辑分析仪的基本使用、交叉编译工具链、固件烧录和版本管理。3. 嵌入式测试与软件测试的核心差异用一个表格来呈现会非常直观对比维度纯软件测试嵌入式测试测试对象应用软件、服务、接口固件、驱动、软硬件整体系统运行环境PC / 服务器 / 容器单片机、开发板、嵌入式 Linux 设备缺陷表现崩溃、报错、结果错误死机、复位、外设无响应、时序错乱主要调试手段日志、断点、抓包串口日志、示波器、逻辑分析仪、JTAG回归风险点业务逻辑变更、依赖变更硬件批次差异、电磁干扰、电源波动自动化难度相对规范平台成熟依赖硬件在环成本更高人才供给多竞争激烈少缺口明显这里面最重要的是“时空维度的差异”。软件测试里一段代码执行完成结果对就是对、错就是错。嵌入式系统里同样一段代码在 3.3V 电源纹波偏大时可能偶尔复位一次在外部干扰强的时候I2C 通信可能丢一帧数据在温度升高后晶振频率漂移可能导致串口波特率误差累计进而出现偶发乱码。这种问题靠纯粹的软件功能测试方法很难复现。你需要理解时钟、中断、寄存器、外设时序这些概念才能知道问题应该从哪一层查起。换句话说嵌入式测试对一个人的“系统理解能力”要求更高。这恰恰是它竞争不那么激烈的根本原因因为能沉下心去学硬件基础的人远少于愿意学软件测试的人。4. ROS2 与机器人测试嵌入式测试的增量市场如果说单片机测试是嵌入式测试的基本盘那么 ROS2 和机器人测试就是最近几年新增量最大的盘。ROS2 全称 Robot Operating System 2它是一个面向机器人的分布式通信框架解决了机器人开发中各模块之间的话题Topic、服务Service、动作Action通信问题。它不是一个传统意义上的操作系统而是一套中间件加工具链跑在 Linux 环境上。那测试人员的机会在哪里现代机器人系统普遍是分层架构底层的电机驱动、传感器采集、舵机控制由 MCU单片机完成逻辑简单但实时性要求高。上层的导航、建图、视觉识别、决策规划由运行 ROS2 的 Linux 主控完成。中间通过串口、CAN、Ethernet 等协议进行数据交换。这个架构给测试带来的新挑战非常明显你不仅要验证底层固件逻辑是否正确还要验证底层的传感器数据在传输到 ROS2 上层之后有没有延时、丢帧、错序不仅要验证单个模块正常时的工作情况还要验证某个节点宕机、网络抖动、电量不足时整个机器人系统会不会进入不可控状态。也就是说机器人测试的测试对象已经从“一个函数”变成了“一个系统”。而这个系统的状态是动态变化的很多 bug 只在特定的时序条件下出现。以前做软件测试时你可能更关注功能和接口现在做机器人测试更关键的是把“多传感器融合”、“异常掉线”、“资源竞争”这些场景逐一拆出来做故障注入。如果从零开始学 ROS2不一定非要先学写节点代码。更快的路线是先理解它的通信机制然后学习怎么用命令行工具去查看话题数据、监控节点状态、回放 bag 包。这些能力恰好可以和测试用例设计结合起来。5. 芯片测试到底测什么从哪里切入芯片测试是一个听起来很高端、实际上也存在大量测试岗位的方向。它主要分三个阶段CP 测试晶圆测试在晶圆切割之前通过探针台对每颗 Die 进行电性能测试筛掉不合格的裸片。FT 测试最终测试芯片封装完成后在测试机上对每颗芯片做完整的电参数测试包括功能、电压、电流、时序等。SLT 测试系统级测试把芯片放到实际应用环境中模拟真实场景来做系统级验证。对于从软件测试转行的人来说最容易切入的入口不是 CP 和 FT 的 ATE自动测试设备程序开发——那需要比较深的电路知识——而是两个方向第一个方向是嵌入式层面的芯片验证测试。很多芯片原厂或方案商需要有人把一颗新的芯片放到实际开发板上跑通外设驱动验证通信接口、功耗、稳定性、兼容性。这要求的是开发板操作能力、C 语言阅读能力、异常日志分析能力和软件测试的关联度很高。第二个方向是自动化测试系统开发。芯片测试中需要大量上位机软件来控制测试仪器、读取测试结果、生成测试报告。这个岗位更接近软件测试中的“测试开发”但你接触的对象从网页和接口变成了万用表、电源、示波器和测试机台。比如一颗电流感应放大芯片 INA240A1它的测试场景包括输入电流为 0 时输出是否为零点附近的合理值不同增益档位下输出是否在精度范围内共模电压变化时输出有没有明显漂移。这些测试逻辑背后依然是边界值分析和等价类划分只不过你操作的对象变成了仪器和控制程序。转行者的优势在于你懂测试架构、懂用例设计、懂数据记录和缺陷复现需要补的短板是基本电路概念、器件 Datasheet 阅读、常用测试仪器操作。这个短板完全可以通过几个月的刻意练习补上。6. 转行路线从单片机到嵌入式测试的完整路径既然方向清楚了接下来最关键的问题是怎么一步步走过去。第一步建议从单片机入门推荐 51 单片机作为起点。原因很现实资料多、教材多、开发板便宜而且 Keil 这个开发环境上手简单不需要啃复杂的 Linux 内核。很多人纠结“要不要直接学 STM32”我个人的判断是如果你本来就没有嵌入式基础先用 51 单片机理解 GPIO、中断、定时器、串口这些最基本的概念比直接上 STM32 和 HAL 库更容易建立系统认知。第二步做两三个带交互和报警功能的小项目。项目不在多而在于你能把“功能实现”和“测试验证”两条线同时走通。例如“51 单片机温度上下限报警系统”就非常适合作为测试思维迁移的练习载体你会接触温度传感器、LCD 显示、按键输入、蜂鸣器输出每一个环节都可以设计测试用例。第三步从单片机逻辑测试转向嵌入式 Linux。单片机测试可以理解寄存器级别的问题但现代机器人和芯片测试往往需要嵌入式 Linux 环境下的能力包括交叉编译、设备树、驱动框架、文件系统。这个阶段建议在 ARM 开发板或者虚拟机上跑 Ubuntu学习怎么编译内核模块、怎么读取串口设备、怎么用 perf 和 gdb 做性能分析和调试。第四步按目标岗位补充专项技能。如果目标是机器人测试就学 ROS2 的基础命令和话题通信机制如果目标是芯片测试就学万用表、示波器、可编程电源的基本操作并尝试看懂一份芯片 Datasheet 中的电气参数表。每一步的时间不用太长但一定要有输出物要么是代码仓库要么是测试报告要么是问题排查笔记。面试的时候这些比你背一百道“软件测试八股文”更有说服力。7. 完整示例51 单片机温度上下限报警系统与测试设计下面用一个最小项目来演示“软件测试思维”如何应用到嵌入式场景。7.1 项目需求系统通过 DS18B20 温度传感器采集环境温度在 LCD1602 上实时显示。用户可以通过按键设置温度上限和下限当温度超过上限或低于下限时蜂鸣器报警。这个项目最核心的业务逻辑其实就是一个判定函数给定当前温度、温度上限、温度下限判断是否应该报警。7.2 核心代码// 文件temperature.c // 说明51单片机温度报警系统核心逻辑已把判定逻辑独立封装。 #include reg51.h sbit BEEP P1 ^ 0; int upper_limit 40; // 温度上限默认40度 int lower_limit 10; // 温度下限默认10度 // 独立出来的温度判定函数方便单元测试 char check_temperature(int temp, int upper_limit, int lower_limit) { if (temp upper_limit || temp lower_limit) { return 1; // 超限需要报警 } return 0; // 正常不报警 } // 从DS18B20读取温度具体实现依赖单总线时序 extern int read_temperature(void); void main(void) { int current_temp; while (1) { current_temp read_temperature(); if (check_temperature(current_temp, upper_limit, lower_limit)) { BEEP 0; // 低电平触发蜂鸣器 } else { BEEP 1; // 关闭蜂鸣器 } delay_ms(200); } }这段代码的关键点在于不要把业务判定逻辑散落在主循环里而是独立成一个纯函数。这就像我们在软件测试中强调的“可测试性设计”。函数不依赖具体硬件输入和输出都是整型这意味着你完全可以在 PC 上为它写单元测试。7.3 在 PC 上编写单元测试把check_temperature函数单独编译到测试工程中用 C 语言写断言// 文件test_temperature.c // 编译方式gcc temperature.c test_temperature.c -o test_temperature #include stdio.h char check_temperature(int temp, int upper_limit, int lower_limit); #define CHECK(cond) \ do { \ if (cond) printf(PASS: %s\n, #cond); \ else printf(FAIL: %s\n, #cond); \ } while (0) int main(void) { // 边界值分析恰好在上下限时不报警越界1度时报警 CHECK(check_temperature(41, 40, 10) 1); // 上限1应报警 CHECK(check_temperature(40, 40, 10) 0); // 等于上限不应报警 CHECK(check_temperature(10, 40, 10) 0); // 等于下限不应报警 CHECK(check_temperature(9, 40, 10) 1); // 下限-1应报警 // 等价类划分 CHECK(check_temperature(25, 40, 10) 0); // 正常区间 CHECK(check_temperature(100, 40, 10) 1); // 极端高温 CHECK(check_temperature(-20, 40, 10) 1); // 极端低温 printf(test finished\n); return 0; }也可以用 Python 做同样的模拟测试更直观# 文件test_temperature_sim.py # 运行方式python3 test_temperature_sim.py import unittest def check_temperature(temp, upper, lower): return 1 if temp upper or temp lower else 0 class TestTemperatureLimit(unittest.TestCase): def test_upper_boundary(self): self.assertEqual(check_temperature(41, 40, 10), 1) self.assertEqual(check_temperature(40, 40, 10), 0) def test_lower_boundary(self): self.assertEqual(check_temperature(10, 40, 10), 0) self.assertEqual(check_temperature(9, 40, 10), 1) def test_normal_range(self): self.assertEqual(check_temperature(25, 40, 10), 0) if __name__ __main__: unittest.main()这种测试方式的价值在于很多嵌入式 bug 并不是单片机时序造成的而是“逻辑设计本身就看错了边界”。把业务判断从硬件中抽出来测一遍能把最容易出错的逻辑问题前置解决掉。7.4 在 Keil 中做硬件调试当逻辑测试通过再把代码烧到单片机里做硬件联调。这里需要学会一个基础操作在 Keil 仿真中观察引脚电平。步骤很简单点击 Debug 菜单选择 Start/Stop Debug Session进入仿真调试模式。打开 Peripherals 菜单选择 Port 1即可看到 P1 口各引脚的电平状态。把变量current_temp、upper_limit、lower_limit添加到 Watch 窗口。单步执行观察当温度变量越界时P1.0BEEP引脚是否从 1 变为 0。在温度为 40 和 41 这两个边界值处分别打断点确认判定逻辑是否走了预期分支。如果你手边有真实硬件也可以用万用表或逻辑分析仪直接量引脚电压看它高电平是不是接近 3.3V 或 5V低电平是不是接近 0V。这些操作不复杂但能帮你建立起“软件代码写的是 0/1实际硬件反应的是电平/电流/时序”这层映射关系。8. 简历、项目和面试准备转行过程中简历和面试是最容易走弯路的环节。先说简历。很多从软件测试转行的人第一版简历还是大篇幅写“负责某某系统的功能测试、接口测试、自动化测试”。如果目标岗位是嵌入式测试这确实会减分。更好的做法是把过去的经验往“系统测试”和“测试平台开发”上靠同时突出你主动补的嵌入式项目和硬件调试能力。可以这样调整把“功能测试”改为“参与嵌入式设备的整机测试流程覆盖上电、异常复位、外设通信等场景”。把“自动化脚本开发”改为“基于 Python 编写上位机测试脚本自动采集串口日志并分析异常关键字”。新增一个项目51 单片机温度上下限报警系统写明你独立完成功能代码、单元测试、Keil 调试和硬件验证。面试方面需要准备的知识大致分三块第一块是嵌入式基础。比如GPIO 有哪几种模式中断和轮询有什么区别I2C 和 UART 有什么区别这些不要求你背得多深但要能用自己的话讲明白。面试官想确认的是你有没有硬件常识而不是能不能立刻写驱动。第二块是测试方法论在嵌入式场景的迁移。比如怎么测一个温度传感器驱动怎么验证串口通信没有丢包怎么做断电重启测试这一类问题的关键不是给出标准答案而是展示你的边界思维和风险意识。比如测串口你不仅要考虑正常收发还要考虑缓冲区溢出、波特率配置错误、长时间通信后是否掉线。第三块是工具使用。示波器、万用表、逻辑分析仪、串口调试助手、Keil、STM32CubeProgrammer、ROS2 命令行工具至少挑两三个能说出来“我在什么场景下用它解决了什么问题”。面试官看重的不是你背了多少知识而是你有没有办法把一个不确定的问题通过拆解、验证、定位、复现一步一步搞清楚。这种能力恰恰是软件测试训练带给你的最大资产。9. 常见误区与风险提示转行不是冲动决策有些坑提前知道会省很多时间。常见误区实际情况建议觉得嵌入式就是不停焊板子嵌入式测试大量工作还是在写用例、录数据、分析日志先补代码和调试能力硬件操作可以边做边学觉得芯片测试门槛高不可攀芯片测试分为 CP/FT/SLT 多段测试开发和上位机方向适合软件背景切入从 Datasheet 阅读和测试脚本开发入手只学单片机不学实时系统单片机只是入门机器人测试还需要接触 Linux、ROS2单片机之后尽快转嵌入式 Linux把软件测试那套自动化平台经验直接搬过来嵌入式自动化依赖硬件在环不能完全复用先跑通串口控制、远程烧录、日志回传这一套基础设施以为三个月就能轻松“上岸”嵌入式知识复杂需要持续学习和项目积累给自己 6-12 个月的时间以项目为里程碑推进还需要提醒一点在真实硬件或生产环境上测试时要遵循设备和实验室的操作规范。尤其是芯片测试、高压电路测试一定要确认电源连接正确、防静电措施到位再给设备上电。测试脚本中用到的读写接口和调试命令基本不要在生产环境的正式数据上直接操作先在自己的开发板和测试环境里验证通过。另一个容易被忽略的风险是并不是所有人都适合转嵌入式。如果你对硬件、电路、底层原理完全提不起兴趣只因为“听说嵌入式工资高”而转行大概率会在学习 C 语言和寄存器配置的阶段卡住。比较稳妥的方式是先用一个月时间照着网上的视频做一个最简单的单片机 LED 闪烁和按键控制实验看看自己是不是真的能从中获得正反馈。这是成本最低的试错方法。如果你发现自己确实对“代码运行在物理世界中”这件事有好奇心那这个方向大概率适合你。从 51 单片机到 STM32从裸机逻辑到嵌入式 Linux从嵌入式测试到 ROS2 机器人测试和芯片系统级验证每一步都在把软件测试的经验放大成更稀缺的综合能力。建议现在就做三件事第一买一块几十块钱的 51 单片机开发板跑通一个 LED 流水灯第二把本文的温度报警系统代码手动敲一遍写一组单元测试第三搜索一份 ROS2 或芯片测试的岗位要求对照检查自己的技能差在哪里。用行动代替焦虑比什么都重要。