尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

软件测试被AI替代?转型嵌入式芯片测试与ROS2实战指南

软件测试被AI替代?转型嵌入式芯片测试与ROS2实战指南 大半年后台咨询里“AI 会不会替代软件测试”出现频率越来越高。不少测试同学发现用例生成有 CoPilot 类工具接口测试有自动化平台连 UI 自动化脚本都能自动录制、自动维护传统手工测试的生存空间确实在被压缩。但如果只盯住 Web/App 测试这一个赛道确实容易焦虑。把视野拉远一点嵌入式、物联网、ROS2、人形机器人、芯片测试这些方向正在出现大量需要“测试思维 软硬件结合能力”的岗位。这篇文章不打算贩卖焦虑而是围绕“软件测试如何向嵌入式/芯片测试转型”这件事系统拆解芯片测试的测试对象、测试方法以及 ROS2 在机器人系统测试中的作用。文中包含可复制的 ROS2 环境搭建步骤、STM32 读取 INA240 电流感应芯片的示例、Unity 单元测试框架的使用方法以及从软件测试转嵌入式测试的学习路线。新手可以按步骤上手有基础的开发也能直接复用里面的测试代码和排错方法。1. 为什么我感觉软件测试正在被 AI 替代先讲一个现实判断AI 替代的不是“测试”这件事而是测试里那些重复、机械、不需要业务理解的环节。1.1 AI 在软件测试里到底能做多少事目前 AI 在软件测试中的应用已经很具体自动生成测试用例根据接口定义、页面元素和需求文档自动补全正常流、异常流用例。智能断言与脚本修复UI 自动化中元素定位变化后AI 可以自动修正脚本。缺陷预测通过历史 bug、代码提交记录、模块复杂度预测高风险区域。测试数据生成自动构造边界值、非法值、组合值。所以“点工型”测试确实面临替代。像只做回归点击、录脚本回放、看图找 bug 这一类工作AI 工具效率高得多。1.2 哪些测试岗位反而更缺人缺人的是那些 AI 不容易插手的领域因为它们不只是“测软件”还要“懂硬件”“懂实时系统”“懂物理世界”。嵌入式软件测试代码跑在单片机/SoC 上要处理中断、时序、寄存器、外设AI 很难凭空生成可靠测试。芯片测试涉及晶圆、封装、ATE自动测试设备、参数边界、可靠性需要人去设计测试方案和写测试程序。机器人系统测试需要验证传感器、控制器、电机驱动之间的协同环境复杂光靠模型无法覆盖。物联网设备测试设备碎片化、网络不稳定、功耗要求高必须结合真机测试。软件测试转向嵌入式、芯片测试不是转行而是把“测试方法论”迁移到一个更高门槛、更依赖经验的领域。1.3 对测试工程师来说真正要补什么个人看法转型核心不是丢掉软件测试知识而是补三块硬件基础看得懂原理图、数据手册知道 GPIO、ADC、PWM、UART、SPI、I2C、CAN 是干什么的。嵌入式开发不需要成为驱动专家但至少能用 C 操作寄存器、用 HAL 库读写外设。机器人中间件ROS2 作为机器人系统的事实标准能看懂节点、话题、服务能写测试脚本验证通信。2. 嵌入式人形机器人芯片测试到底测什么标题里提到“人形机器人芯片测试”是新风口这里先把概念理清楚。很多人以为芯片测试就是把芯片放到测试座上跑一遍程序看 pass 还是 fail。实际没那么简单。2.1 芯片测试的几个阶段测试阶段英文缩写测试对象目的晶圆探针测试CP晶圆上的裸片在封装前筛掉失效 die降低封装成本封装后最终测试FT封装好的芯片验证功能、参数、接口特性系统级测试SLT芯片装到板卡后的整机模拟真实使用场景补 ATE 覆盖不到的场景可靠性测试RA样品芯片验证高温、低温、湿度、ESD 等2.2 人形机器人会用哪些芯片人形机器人功能复杂涉及的芯片种类很多主控 SoC / MCU负责任务规划、运动控制、关节伺服。电源管理芯片管理电池充放电、各模块供电。电机驱动芯片驱动关节电机配合电流检测。电流感应放大芯片检测电机电流用来做力矩控制和过流保护。传感器芯片IMU、激光雷达、摄像头、力传感器、触觉传感器。通信芯片负责机器人内部总线通信和外部联网。芯片厂商出货前需要围绕“功能、参数、边界、可靠性”做一整套测试。比如电流感应放大芯片 INA240就要测输入失调电压、增益误差、共模抑制比、带宽、噪声、以及短路/过流保护功能。2.3 软件测试工程师在芯片测试里能做什么芯片测试不只是硬件工程师的事测试软件和测试流程同样关键测试方案设计根据数据手册列出功能项、参数项、边界条件。测试程序开发在单片机、ATE 或 PC 端写自动化测试脚本控制输入、读取输出、自动判定。数据处理与缺陷分析用 Python/数据分析工具统计参数分布找出失效原因。测试平台搭建搭建“PC 单片机 被测芯片”的自动化测试环境。这些技能软件测试工程师原本就具备只是测试对象从“接口返回数据”换成了“芯片引脚输出的电压值”。3. 转型前先分清几个容易混淆的概念很多人转型时把“嵌入式软件测试”“芯片测试”“硬件在环测试”混在一起。这里用一节课的篇幅做区分。3.1 软件测试、嵌入式软件测试、芯片测试的差别测试类型被测对象主要关注点常用工具/手段软件测试Web / App / 后端服务功能、兼容性、性能、安全Postman、Selenium、JMeter、pytest嵌入式软件测试单片机 / SoC 上的固件逻辑正确性、时序、资源、外设交互Unity、CMock、QEMU、日志断点芯片测试芯片本身 / 封装后器件功能、参数、边界、可靠性ATE、探针台、万用表、示波器、ADC 采样硬件在环测试控制器 真实硬件信号交互、闭环控制、故障注入HIL 台架、Simulink、CANoe3.2 为什么嵌入式测试“可隔离、可控制”这么重要热词里有“软件测试方法 可隔离 可控制”这其实是嵌入式测试的核心方法论。可隔离被测模块不依赖真实硬件也能跑比如把读取 ADC 的函数通过函数指针注入 fake 数据。可控制测试时可以人为制造输入、制造异常比如模拟传感器断线、模拟过压。不可控的系统没法测试如果一切依赖真实硬件时序就难做自动化也难复现 bug。所以转嵌入式测试一定要养成写“可测试代码”的习惯。裸机代码里不要把所有逻辑揉在 main 里至少要拆成独立的模块用参数传状态而不是全局变量满天飞。3.3 单片机、物联网、嵌入式之间的关系一个更通俗的理解嵌入式开发针对特定硬件写软件核心是软硬件结合。单片机嵌入式开发最常见的硬件载体如 STM32、ESP32跑裸机或 RTOS。物联网把嵌入式设备连上网络采集数据、远程控制。ROS2面向机器人系统的分布式通信框架把多个嵌入式节点组合成一套完整机器人系统。所以“嵌入式人形机器人芯片测试”不是单一技能而是一个软硬件结合的岗位方向。想切入这个方向需要掌握从“单片机裸机测试”到“ROS2 系统测试”的完整链路。4. 环境准备ROS2 与嵌入式开发工具链实操之前先把环境搭建好。本节以 Ubuntu 22.04 ROS2 Humble 为例其他版本请按官方文档调整。4.1 安装 ROS2 HumbleROS2 版本很多Ubuntu 22.04 对应 Humble。先更新系统sudo apt update sudo apt upgrade -y安装基础依赖sudo apt install software-properties-common curl -y sudo add-apt-repository universe添加 ROS2 软件源。这一部分官网可能会更新建议打开官方文档对照执行。常规步骤是sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \ -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] \ http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main | \ sudo tee /etc/apt/sources.list.d/ros2.list /dev/null然后安装桌面版sudo apt update sudo apt install ros-humble-desktop安装常用开发工具sudo apt install python3-colcon-common-extensions python3-rosdep -y每次打开新终端需要加载 ROS2 环境source /opt/ros/humble/setup.bash建议写入.bashrc省得每次手动执行echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc4.2 运行小海龟验证 ROS2ROS2 装好后最简单验证方法是小海龟程序。终端 1 启动海龟节点ros2 run turtlesim turtlesim_node终端 2 启动键盘控制ros2 run turtlesim turtle_teleop_key如果都能打开说明 ROS2 基本可用。下一步可以查看当前有哪些节点和话题ros2 node list ros2 topic list正常会看到/turtle1/cmd_vel、/turtle1/pose等话题说明 ROS2 通信没问题。这是后面测试机器人系统的基础。4.3 嵌入式开发工具链做芯片测试和嵌入式测试至少要准备一套能编译单片机的工具链。这里以 STM32 为例STM32CubeMX图形化生成初始化代码。GCC ARM 工具链编译代码。OpenOCD通过 ST-Link/J-Link 烧录和调试。终端串口工具minicom、PuTTY、或者 Python 的 pyserial。在 Ubuntu 上安装 GCC ARM 工具链和 OpenOCDsudo apt install gcc-arm-none-eabi openocd minicom python3-pip -y pip3 install pyserial还需要准备一个 STM32 开发板、一个 ST-Link 下载器以及一根 USB 转串口线。具体型号不限重点是掌握“写代码→编译→烧录→查看输出”的闭环。5. 芯片测试实战以 INA240 电流感应放大芯片为例下面用真实的芯片 INA240 举例演示“芯片功能测试”的完整思路。INA240 是 TI 公司一款高共模电压电流感应放大器常用于电机电流检测、机器人关节电流采样所以和人形机器人场景很匹配。5.1 INA240 测试思路拿到一颗芯片测试前先看数据手册明确供电电压范围。增益规格INA240 有 A1/A2/A3 等不同版本。输出公式输出电压与输入差分电压、参考电压、增益有关。输入端允许的共模电压范围。输出范围不能超过 ADC 量程。当前示例使用单片机 ADC 读取 INA240 输出从而验证芯片基本功能。更完整的芯片测试还会测失调、增益精度、噪声、上电时序、短路响应这里先把链路跑通。5.2 硬件接线硬件接线大致如下具体以开发板丝印为准INA240 供电 VCC 接 5V 或 3.3VGND 共地。IN、IN- 接采样电阻两端。OUT 接 STM32 ADC 引脚例如 PA1。REF 引脚通常接 VCC/2 或 GND取决于输出偏置需求。这里要特别提醒测试时务必确认供电电压和输入量程避免过压、反接损坏芯片和开发板。务必先在实验板上验证再接入实际系统。5.3 STM32 端读取 ADC 电压下面是 STM32 HAL 库的读取片段。使用 ADC1 通道 1对应 PA1。这段代码适合 F1 系列其他系列引脚和时钟配置不同。// 文件main.c 核心片段 #include stm32f1xx_hal.h #include stdio.h #include string.h ADC_HandleTypeDef hadc1; UART_HandleTypeDef huart2; uint32_t adc_read_raw(void) { HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); return HAL_ADC_GetValue(hadc1); } int main(void) { HAL_Init(); // 时钟、GPIO、ADC、UART 初始化由 STM32CubeMX 生成 // 此处省略 uint8_t buf[64]; while (1) { uint32_t raw adc_read_raw(); int len snprintf((char *)buf, sizeof(buf), RAW:%lu\r\n, raw); HAL_UART_Transmit(huart2, buf, len, 100); HAL_Delay(200); } }这段代码把原始 ADC 值通过串口每秒输出 5 次方便 PC 端分析。5.4 PC 端用 Python 采集并计算电流PC 端用 pyserial 读取串口然后根据 ADC 分辨率、参考电压和 INA240 增益计算电流。import serial import time ser serial.Serial(/dev/ttyUSB0, 115200, timeout1) VREF 3.3 # STM32 ADC 参考电压 ADC_MAX 4095 # 12 位 ADC 最大值 GAIN 100 # INA240 A1 增益具体以你手里的版本为准 RSENSE 0.01 # 采样电阻阻值单位欧姆 # INA240 输出与输入电流的关系官方公式里还涉及参考电压 # 这里简化为Vout (I * RSENSE) * GAIN Vref VREF_OUT VREF / 2.0 # 假设 REF 接 VCC/2 def calc_current(raw): vout raw * VREF / ADC_MAX # Vout I * RSENSE * GAIN VREF_OUT current (vout - VREF_OUT) / (RSENSE * GAIN) return current try: while True: line ser.readline().decode().strip() if line.startswith(RAW:): raw int(line.split(:)[1]) current calc_current(raw) print(fRAW:{raw} Vout:{raw * VREF / ADC_MAX:.3f}V I:{current:.3f}A) except KeyboardInterrupt: ser.close()运行前需要添加串口权限sudo usermod -aG dialout $USER然后重新登录再执行脚本python3 read_ina240.py5.5 这个测试能说明什么这个示例看起来简单但它展示了芯片测试的基本链路控制通过采样电阻给已知输入信号。采集通过 ADC 读取输出信号。计算对照数据手册公式分析结果。判定判断结果是否在规格范围内。实际芯片测试要比这复杂流程却是一致的。软件测试工程师的优势在于熟悉用例设计、熟悉自动化脚本、熟悉数据对比和判定这些能力可以直接迁移。6. 用 ROS2 构建机器人系统测试基础单个芯片测试完成后还要把芯片放到整个机器人系统里测试。人形机器人是分布式系统里面有多个 MCU、多个传感器、多个执行器它们之间靠总线通信。ROS2 是这套系统最常见的软件中间件。6.1 ROS2 核心概念速览节点Node一个可执行单元比如“关节电流采集节点”。话题Topic节点之间异步发布/订阅的通道。服务Service请求/响应式同步通信。动作Action用于带反馈的长任务比如运动控制。QoS通信质量策略控制消息可靠性和延迟。测试一个 ROS2 系统本质上就是验证这些节点之间能否按预期交换数据。6.2 最小发布/订阅测试例程下面创建一个工作区写一个发布者和订阅者。先建目录mkdir -p ~/ros2_test_ws/src/test_comm cd ~/ros2_test_ws/src/test_comm创建package.xml?xml version1.0? package format3 nametest_comm/name version0.0.1/version descriptionROS2 communication test/description maintainer emailtestexample.comtest/maintainer licenseApache-2.0/license dependrclpy/depend dependstd_msgs/depend /package创建setup.pyfrom setuptools import setup package_name test_comm setup( namepackage_name, version0.0.1, packages[package_name], py_modules[], install_requires[setuptools], entry_points{ console_scripts: [ talker test_comm.talker:main, listener test_comm.listener:main, ], }, )创建test_comm/talker.pyimport rclpy from rclpy.node import Node from std_msgs.msg import String class Talker(Node): def __init__(self): super().__init__(talker) self.pub self.create_publisher(String, chatter, 10) self.timer self.create_timer(1.0, self.timer_callback) self.count 0 def timer_callback(self): msg String() msg.data fHello, ROS2 test: {self.count} self.pub.publish(msg) self.get_logger().info(fPublish: {msg.data}) self.count 1 def main(): rclpy.init() node Talker() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()创建test_comm/listener.pyimport rclpy from rclpy.node import Node from std_msgs.msg import String class Listener(Node): def __init__(self): super().__init__(listener) self.sub self.create_subscription(String, chatter, self.callback, 10) def callback(self, msg): self.get_logger().info(fReceive: {msg.data}) def main(): rclpy.init() node Listener() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()编译cd ~/ros2_test_ws colcon build source install/setup.bash运行发布者ros2 run test_comm talker新终端加载环境后运行订阅者source ~/ros2_test_ws/install/setup.bash ros2 run test_comm listener预期订阅者终端会持续打印Receive: Hello, ROS2 test: N说明节点通信正常。6.3 如何自动化验证通信实际项目里不可能一直盯着终端看。可以用命令行工具自动化检查。查看话题数据ros2 topic echo /chatter统计话题发布频率ros2 topic hz /chatter查看节点关系ros2 node info /talker这些命令是机器人系统测试的基本手段和在 Web 测试里用 Postman 看接口返回是同一个思路。7. 嵌入式软件测试可隔离、可控制的测试方法嵌入式测试在现场很难复现问题所以“可隔离、可控制”必须是设计阶段就考虑的事。下面用 Unity 测试框架演示单元测试怎么写。7.1 引入 Unity 单元测试框架Unity 是一款轻量级 C 语言单元测试框架很适合嵌入式。先下载源码git clone https://github.com/ThrowTheSwitch/Unity.git假设被测模块是math_ops.c我们先写一个简单加法函数。math_ops.h#ifndef MATH_OPS_H #define MATH_OPS_H int add(int a, int b); #endifmath_ops.c#include math_ops.h int add(int a, int b) { return a b; }7.2 编写测试用例test_math_ops.c#include unity.h #include math_ops.h void setUp(void) { } void tearDown(void) { } void test_add_positive(void) { TEST_ASSERT_EQUAL_INT(5, add(2, 3)); } void test_add_negative(void) { TEST_ASSERT_EQUAL_INT(-1, add(-3, 2)); } void test_add_zero(void) { TEST_ASSERT_EQUAL_INT(0, add(0, 0)); } int main(void) { UNITY_BEGIN(); RUN_TEST(test_add_positive); RUN_TEST(test_add_negative); RUN_TEST(test_add_zero); return UNITY_END(); }编译运行gcc -I Unity/src test_math_ops.c math_ops.c Unity/src/unity.c -o test_math_ops ./test_math_ops预期输出类似test_math_ops.c:13:test_add_positive PASS test_math_ops.c:17:test_add_negative PASS test_math_ops.c:21:test_add_zero PASS ----------------------- 3 Tests 0 Failures 0 Ignored OK7.3 从单元测试到硬件测试的隔离思想在真实项目里read_adc()这类函数依赖硬件不能在 PC 上跑。怎么办通过函数指针或条件编译把硬件依赖隔离开。例如typedef uint32_t (*adc_read_fn)(void); int current_task(adc_read_fn read_fn) { if (read_fn NULL) { return -1; } uint32_t raw read_fn(); if (raw 4095) { return -2; } return (int)(raw * 100 / 4095); }测试时传入 fake 函数uint32_t fake_read_adc(void) { return 2048; } void test_current_task(void) { TEST_ASSERT_EQUAL_INT(50, current_task(fake_read_adc)); }这样测试不依赖真实 ADC也能验证业务逻辑。这就是“可隔离、可控制”在实际代码里的落地方式。8. 常见问题与排查思路环境搭建和测试代码跑起来后会遇到不少坑这里整理高频问题。问题现象常见原因解决思路ROS2 命令找不到环境没有 source执行source /opt/ros/humble/setup.bashcolcon build找不到包在错误目录执行确认当前目录是工作区根目录即包含src的目录Python 报ModuleNotFoundError: rclpyROS2 环境未加载先source /opt/ros/humble/setup.bash再运行串口打开失败Permission denied用户不在 dialout 组sudo usermod -aG dialout $USER后重新登录串口读到乱码波特率不匹配确认 STM32 串口配置和 Python 脚本波特率一致ADC 读到全 0 或全满接线错误、共地问题、输入超量程用万用表量 INA240 OUT 引脚电压确认是否在 ADC 量程内Unity 编译链接失败缺少 unity.c编译命令中包含Unity/src/unity.cMCU 烧录失败下载器驱动或接线问题检查 ST-Link 接线确认驱动识别到设备排查原则先查环境再查硬件最后查代码。ROS2 类问题百分之八十是环境变量问题芯片测试类问题百分之八十是共地、供电、量程问题。9. 从软件测试转向嵌入式测试的实践建议9.1 技能树怎么补从软件测试向嵌入式测试迁移至少覆盖以下能力C 语言指针、结构体、函数指针、内存管理。单片机基础GPIO、ADC、UART、定时器、中断。通信协议UART、SPI、I2C、CAN、Modbus。嵌入式构建Makefile、CMake、交叉编译。ROS2 基础节点、话题、服务、launch 文件。测试能力单元测试、接口测试、硬件在环测试、可靠性测试。数据分析Python 读取串口数据、计算误差、绘制曲线。9.2 推荐一个起步项目与其零散学不如做一个小项目打通“嵌入式 芯片测试 ROS2”链路用 STM32 读取 INA240 电流值。通过串口发送 ADC 原始数据。写 Python 脚本解析、计算电流。把 Python 脚本改写成 ROS2 节点把电流值发布到话题。再写一个订阅节点做数据记录和告警。为电流计算逻辑写 Unity 单元测试。做完这个项目你对“芯片测试”“嵌入式开发”“ROS2 系统测试”的关系会有更直观的理解。面试时也能拿出完整作品比单纯背八股更有说服力。9.3 面试准备重点嵌入式测试岗位面试除了测试理论肯定会问你数据手册怎么看。如何设计一个芯片参数测试方案。讲讲你理解的“可隔离、可控制”。如何解决串口粘包问题。ROS2 和 ROS1 的区别。实时系统里怎么保证测试不干扰业务逻辑。这些内容没有实际动手很难答好。所以在投简历之前至少要把第 9.2 节的完整项目跑通并整理成文档。9.4 最佳实践把这段时间的一些经验沉淀成清单芯片测试前一定先看数据手册手册里给了测试条件和公式。所有测试脚本都要能重复执行输入、输出、预期结果对齐。串口数据要带帧头、数据长度、校验避免粘包后无法解析。嵌入式测试用例尽量做到不依赖真实硬件通过 Mock 实现可隔离。做硬件改动前先断电拔插芯片时注意静电防护。生产环境跑测试程序必须经过测试环境验证并保留回滚方案。记录测试日志时加时间戳方便定位问题。10. 总结与下一步行动回到开头的问题软件测试会不会被 AI 替代重复性测试会但测试思维不会。芯片测试、嵌入式测试、ROS2 系统测试这些方向需要理解硬件、理解通信、理解系统架构AI 只能辅助不能替代工程师去定义“测什么、为什么测、怎么判定结果”。从软件测试转向嵌入式芯片测试路径很清晰先装好 Ubuntu ROS2跑通小海龟。准备一套 STM32 开发板点亮 LED、读 ADC、跑串口。买一颗 INA240 或类似传感器芯片写完整测试脚本。把 USB 转串口数据接入 ROS2 话题。给核心逻辑补单元测试。整理成简历项目去投嵌入式测试或芯片测试相关岗位。别急着把软件测试知识扔掉那是你做测试方案和自动化脚本的基本功。真正拉开差距的是对硬件和系统的理解。动手做一个端到端的小项目比看十篇“AI 替代论”文章都有效。
返回列表