Files
STM32F4-Base/docs/测试说明/自动化测试流程.md
T
wandering1 a6cdebde62 文档体系重组与 D-7 一致性门禁落地,清理芯片手册孤儿图片
- 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 警告
2026-09-26 00:51:53 +08:00

6.6 KiB
Raw Blame History

自动化测试流程(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/705 DMA 守卫 负路径与 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 默认值同步,测试套件运行需显式放宽