4.3 KiB
4.3 KiB
自动化测试流程(AI 迭代闭环)
目标:AI 改完代码后,可自动完成「构建 → 烧录 → 抓取串口调试信息 → 校验 → 迭代」,无需人工开终端/串口助手。
总体流程
@test 命令触发
│
├─ Step 0 预检 serial-mcp-server 二进制 + list-ports 确认 COM
├─ Step 1 构建验证 MDK-ARM/build.bat (0 错误 0 警告才继续)
├─ Step 2 烧录 + 采集(一条命令编排,先采集等 first-byte 再烧录)
│ test/run_boot_test.ps1 (内含 serial_capture.ps1 + download.bat + verify_log.ps1)
├─ Step 3 判定:
│ PASS → 报告,结束
│ FAIL → 依据 [MISS]/[HIT] + 日志尾部,修改代码后回到 Step 1
命令与脚本清单
| 名称 | 位置 | 作用 |
|---|---|---|
@build |
.opencode/command/build.md |
仅编译验证(0 错误 0 警告) |
@download |
.opencode/command/download.md |
编译并烧录(ST-Link) |
@test |
.opencode/command/test.md |
完整闭环:build → capture+download → verify → iterate |
test/run_boot_test.ps1 |
test/run_boot_test.ps1 |
一键闭环:采集(含 EOF 重试)→ 烧录 → 提取日志 → verify,退出码 0=PASS/1=FAIL/2=错误 |
test/serial_capture.ps1 |
test/serial_capture.ps1 |
底层采集编排:稳定启动采集 → 烧录 → 等采集结束;内置 EOF 自动重试 |
test/verify_log.ps1 |
test/verify_log.ps1 |
对日志做标记校验,输出 PASS/FAIL 并返回退出码 |
| serial-mcp-server | %LOCALAPPDATA%\serial-mcp-server\serial-mcp-server.exe |
CLI/MCP 串口工具(Adancurusul/serial-mcp-server) |
判定标准
- 构建:
@build退出码 0(0 错误 0 警告),否则不进入硬件环节。 - 烧录:
@download退出码 0(run_boot_test.ps1内部调用)。 - 日志:
verify_log.ps1退出码0= PASS:所有-Required标记均出现,且无-Forbidden模式命中1= FAIL:存在缺失标记([MISS])或违规模式([HIT])2= 日志文件不可读
默认开机标记(来自固件)
| 标记 | 来源 |
|---|---|
App init OK |
App/app_main.c |
RS485 init: OK |
App/app_main.c |
NAND init: |
App/app_main.c |
ADC init: |
App/app_main.c |
SD2506 ID: / time: / temp: / battery: |
App/app_main.c |
Network Init / net init: OK / MAC: / PHY: |
App/task/net_task.c |
失败模式应对
| 现象 | 处理 |
|---|---|
serial-mcp-server 不存在 |
需先编译安装(见 docs/测试说明/serial-mcp-server_串口调试.md) |
采集报 UnexpectedEof: zero bytes |
已由 serial_capture.ps1 自动重试处理;若仍失败,检查 COM 是否被其他程序占用 |
抓到日志缺 Network Init |
IdleTimeoutMs 太小(boot 阶段有 ~3-4s 静默间隙),调到 8000ms |
| 烧录后无数据 | 采集必须在烧录前启动(run_boot_test.ps1 已保证);InitialTimeoutMs 需覆盖编译+烧录耗时(90000) |
| 端口被占用 | 先 serial_close / 结束残留 serial-mcp-server 进程;Keil ST-Link 不占 COM |
| 日志中无 UI 相关输出 | 见下节「UI 自动化」 |
UI 屏幕自动化(当前缺口)
App/task/ui_task.c 目前没有 DBG 打印,串口无法确认 UI 是否成功初始化。建议在固件中补充:
if (ui_port_init() != 0) { DBG_ERROR("UI port init: FAIL"); } else { DBG_INFO("UI port init: OK"); }
if (ui_menu_init() != 0) { DBG_ERROR("UI menu init: FAIL"); } else { DBG_INFO("UI menu init: OK"); }
加完后把 UI port init: OK / UI menu init: OK 加入 @test 的 -Required 标记,即可自动回归 UI 初始化。屏幕上的内容仍需人工目检或后续接入截屏/控制类方案。
扩展用法
- 单模块回归:
@test后接-Required定制,例如网络回归用-Required "App init OK;Network Init;net init: OK;PHY: 100M FULL"。 - 测试套件构建:
test/test_config.h开启某个TEST_SUITE_*后,把套件打印的=== ... Test:标题作为 Required 标记,配合test/下各用例输出判断。 - 长时间采集:serial-mcp-server 支持
--duration-ms长窗口采集(MCPread传duration_ms即进入 capture 模式)。