a6cdebde62
- D-6 目录规范化:docs 根目录散落文档归入 UI设计/子系统设计/架构设计/审查记录/ 环境与部署/网络 等子目录,去掉目录名空格,重命名 嵌入式C语言代码规范_V1.0.md - D-7 三档一致性门禁:新增 scripts/check_doc_links.py(链接存在性)、 scripts/gen_task_table.py(FreeRTOS 任务表数值)、scripts/check_mem_numbers.py (内存/Flash 体积),均支持 --check/--write/--diff,pre-commit 钩子同步注册 - D-5 文档索引:新建 docs/README.md,新建 docs/文档规范.md 约束目录命名与链接写法 - D-1 芯片手册瘦身:删除 1069 张无引用孤儿图片(77.06 MB), docs/芯片手册 120 MB → 41 MB,已引用图片零断链 - 同步 C 源码注释中的文档路径引用(D-6 重组后),构建 0 错误 0 警告
6.6 KiB
6.6 KiB
自动化测试流程(AI 迭代闭环)
目标:AI 改完代码后,可自动完成「构建 → 烧录 → 抓取串口调试信息 → 校验 → 迭代」,无需人工开终端/串口助手。
总体流程
@test 命令触发
│
├─ Step 0 预检 .venv + serial_tool(selftest/ports 确认 COM)
├─ Step 1 构建验证 MDK-ARM/build.bat (0 错误 0 警告才继续)
├─ Step 2 烧录 + 采集(一条命令编排:开串口 + 清日志 → 烧录 → wait-idle → 提取)
│ test/run_boot_test.py (内置 serial_tool + download.bat + verify_log.py)
├─ 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.py |
test/run_boot_test.py |
一键闭环:open + clear → 烧录 → wait-idle(静默 8s/超时 30s)→ 提取 [RX] → verify,退出码 0=PASS/1=FAIL/2=采集或烧录错误/3=用法错误 |
tools/serial_tool/serial_tool.py |
tools/serial_tool/ |
Python 串口助手(常驻 daemon + 薄 CLI):ports/open/send/status/log/clear/wait-idle/selftest;全量日志 state/serial.log(20MB 自动截头) |
test/verify_log.py |
test/verify_log.py |
对日志做标记校验,输出 PASS/FAIL 并返回退出码 |
判定标准
- 构建:
@build退出码 0(0 错误 0 警告),否则不进入硬件环节。 - 烧录:
@download退出码 0(run_boot_test.py内部调用)。 - 日志:
verify_log.py退出码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 |
默认 Forbidden 模式:FAIL;ERROR;HardFault;[ERR]
⚠ 固件错误级日志前缀是
[ERR](DBG_ERROR→[时间][ERR][TAG] 消息),与ERROR子串并不匹配。2026-09-21 起默认列表显式加入[ERR]——此前驱动/模块的错误行 不会被自动闭环拦截(历史日志中的[ERR]全是漏检)。产品构建正常开机应为零[ERR]。
失败模式应对
| 现象 | 处理 |
|---|---|
selftest FAIL / ModuleNotFoundError: pyserial |
venv 未建或依赖缺失:按 AGENTS.md「Python 环境」重建 .venv + pip install -r requirements.txt |
| daemon 无响应 / 自动拉起失败 | 查 tools/serial_tool/state/daemon.log;serial_tool.py restart 重建 daemon;检查 COM 是否被其他程序占用 |
抓到日志缺 Network Init |
-SettleMs 太小(boot 任务间有 ~3-4s 自然静默间隙),用默认 8000ms |
烧录后无数据(no_data) |
开串口 + clear 必须在烧录前完成(run_boot_test.py 已保证);核对 COM 号、板子供电,看 state/serial.log 有无 SYS 异常行 |
端口被占用(port busy) |
先 serial_tool.py close 或 restart;检查其他程序占用;Keil ST-Link 不占 COM |
| 日志中无 UI 相关输出 | 见下节「UI 自动化」 |
日志出现 [ERR] 行 |
固件错误级日志(DBG_ERROR),默认 Forbidden 会判 FAIL:按 TAG 查对应模块的 docs/问题记录/*_Trap_Records.md;若属测试套件的预期错误(守卫负路径、非法名校验等),用 --forbidden 放宽 |
UI 屏幕自动化
- 初始化回归:
App/task/ui_task.c已有UI port init: OK/UI menu init: OK/UI net sink: started打印(见@test命令示例);将其加入-Required即可经串口自动回归 UI 初始化。 - 屏幕内容回归:由 LVGL 模拟器像素回归覆盖(文本级断言 + 11 页黄金参考 + 池水位门禁,
见
docs/UI设计/UI_自动化测试流程.md);上机屏幕仍需人工目检(L3 层,见测试开发标准流程.md§1)。
扩展用法
- 单模块回归:
@test后接-Required定制,例如网络回归用-Required "App init OK;Network Init;net init: OK;PHY: 100M FULL"。 - 测试套件构建:
test/test_config.h开启某个TEST_SUITE_*后,把套件打印的=== ... Test:标题作为 Required 标记,配合test/下各用例输出判断。 破坏性用例默认不跑:test_config.h的ENABLE_DESTRUCTIVE_TESTS(默认关闭)控制写/擦 NAND、 格式化、坏块注入与 FatFS 写类用例;关闭时套件为只读模式(开机打印mode: READ-ONLY), 可随时在在用设备上执行且不改动卷内容。首次上电/产线验证时才打开(打印mode: DESTRUCTIVE)。 注意:套件内预期的错误日志会打印[ERR](GD5F 的TC-GD5F-704/705DMA 守卫 负路径与 FTL 运行期坏块、FatFs 非法名校验等),与默认 Forbidden 冲突,须显式放宽:--forbidden "FAIL;HardFault"([FAIL]仍会拦截真实断言失败); 例:GD5F 只读--required "=== GD5F2GQ5UE Tests: 16/16 PASSED",破坏性68/68。 - 长时间采集:daemon 全量持续写入
state/serial.log(20MB 上限自动截头保尾 10MB),直接读文件即可;或用log --tail 0 --grep <标记>过滤。
变更记录
| 日期 | 变更 |
|---|---|
| 2026-09-13 | 「UI 屏幕自动化(当前缺口)」更新:UI 初始化 DBG 打印已实现(ui_task.c),屏幕内容已纳入模拟器像素回归;测试分层与门禁见 测试开发标准流程.md |
| 2026-09-15 | 采集机制整体切换:serial-mcp-server(采集窗口/first-byte/EOF 重试)→ 仓库内置 Python 串口助手(daemon 常驻全量日志 + wait-idle 静默判据 -SettleMs/-MaxWaitMs);serial_capture.ps1 删除,流程/脚本清单/失败模式表同步 |
| 2026-09-21 | 默认 Forbidden 增补 [ERR]:固件 DBG_ERROR 前缀是 [ERR](≠ ERROR 子串),此前驱动/模块错误日志不会被自动闭环拦截;verify_log.py / run_boot_test.py 默认值同步,测试套件运行需显式放宽 |