Files
STM32F4-Base/test/host
wandering1 c936441c83 门禁扩容:新增 lv-conf-sync、simulator/ 纳入全部钩子;含 L3 定值/元件框架落地
本轮把"自研代码落在门禁之外"的口子收掉,同时落地 LVGL 特性裁剪与
L3 保护定值/元件框架。

门禁(.pre-commit-config.yaml,26 个钩子)
- 新增 scripts/check_lv_conf_sync.py + 钩子 lv-conf-sync:比对两份
  lv_conf.h 的**生效值**(未定义则取 lv_conf_internal.h 兜底默认),
  抓 MISMATCH / LVGL 不认的宏名 / 同文件重复定义
- 顶层 exclude 删掉 simulator/:其下 21 个 tracked 文件全是本项目自研
  代码,生成物(build/、SDL2/、tests/ref/、shot*)已在 .gitignore;
  doc-links 的 exclude 同步删除
- lv-conf-sync 的 files: 覆盖两端配置 → 只改 simulator/lv_conf.h 也触发
  (pre-commit 4.x 已移除 always: true,实测只告警并跳过,无兜底开关)
- 新增 prot-set-unit-test / prot-elm-unit-test 两个主机侧单测钩子
- S11(2.3.5) 判定细化:禁的是"用路径找文件",尖括号系统头带子目录
  (如 <sys/stat.h>)不再误报;全仓库复核仅 2 处项目代码判定变化

模拟器代码整改(纳入钩子后暴露,全部修代码而非豁免)
- cppcheck 4 处:sim_syslog.c 判空分支内解引用 p_epoch(真实 bug)、
  2 处 struct tm 未初始化、1 处指针可加 const
- coding-standard 61 处:44 处函数左大括号并到右括号同行、8 处补函数
  注释、3 处补文件头注释块、2 处 __ 前缀保护宏改 XXX_H、2 处 sprintf
  改 snprintf(写入字节数与原来完全一致)

LVGL 特性裁剪(F-1/F-2/F-3)
- 两端 lv_conf.h 对齐同一特性子集:删 26 个 LVGL 9.3 不存在的选项名、
  3 处重复定义,10 项靠默认值隐式生效的改为显式固化
- 实测对镜像体积中性;价值在防漂移,且模拟器 golden 回归跑的正是固件
  实际编译的配置

L3 软件侧
- App/algo/prot_set.* Q10 定值模型(范围校验 / 整表 all-or-nothing /
  校验和封存-自检-闭锁)+ prot_elm.* 通用"滞回+定时限"元件框架 7 实例
- test/host/prot_set、test/host/prot_elm 主机侧单测;uvprojx 挂载两处

文档同步
- pre-commit使用说明:§2.8 S11 口径、§2.15 lv-conf-sync 详解、新增 §5.5
  复盘(教训:exclude 只写真正不该进钩子的路径)
- AGENTS.md、UI_设计架构 §1.4 第 10 条、RAM 分析、审查报告刷新与销项

验证
- @build BUILD_OK 0/0(Code=194276 RO=15872 RW=876 ZI=139892)
- 模拟器重建:菜单 8 状态像素逐字节一致(池 5368 B)、11 内容页黄金参考
  全过(往返 5448 B)、remo sink 0/25600 位差异、--logtest/--cfgtest PASS
- 全仓库 cppcheck / coding-standard / no-mojibake --all-files 全过
- check_doc_links --all 129/0;check_mem_numbers --check 内存数字一致
- 端到端:往 simulator/lv_conf.h 注入一行漂移 → 钩子 FAIL(exit 1)
2026-10-11 08:48:49 +08:00
..

test/host/ — 主机端测试脚本

PC 侧的测试驱动与判读脚本(Python,跑在开发机上,经串口/网络与目标板交互)。

文件一览

流程与判读

脚本 作用
run_boot_test.py @test 一键闭环:开串口+清日志 → 烧录 → wait-idle → verify_log 校验(退出码 0=PASS)
verify_log.py 日志标记校验:Required / Forbidden 标记 → PASS / FAIL;可选 --require-suite-summary 校验套件汇总行(=== <名称>: N/M PASSED (failed=0) === 且 N>0),抓"没跑到汇总行/断言数为 0"的盲区(T-2)
e02_probe.py E-02 专项探针(错误码传播审计)

网络 / FTP

脚本 作用
ch395f_socket_test.py Socket 通信测试(回显服务器 / 文件收发)
ftp_test.py FTP 基本功能测试
ftp_up_dl_test.py FTP 上传下载测试
ftp_speed_test.py FTP 传输速度测试
ftp_capture.py FTP 流量抓取
ftp_regression.py FTP 回归套件

时间 / 时延

脚本 作用
latency_peer.py 链路时延测试的 PC 对端(peer)
time_sync_server.py 时间同步推送服务(对时源)

主机侧单元测试(纯逻辑,无硬件)

文件 作用
common/unit_test_harness.py 通用单测 harness(L0.5):探测 MSVC → 拼 INCLUDE/LIB → 编译 → 运行 → 判定退出码。各模块运行器只做声明式配置(TestBuild),不含工具链细节
watchdog/run_unit_test.py 看门狗判定状态机单测:声明 TestBuild 后调 harness,用 MSVC 离线编译真实 App/util/task_watchdog.c(可观测桩驱动),39 用例穷举边界。零硬件、秒级(退出码 0=PASS/1=FAIL/2=环境错误)
watchdog/watchdog_test.c 测试单元本体(#include 生产源码 + 平台钩子桩)
watchdog/stub/ 桩头文件(main.h/iwdg.h/dbg_log.h),覆盖 MCU 版以在 PC 上编译
sys_clock/run_unit_test.py 系统时钟换算单测:离线编译真实 App/util/sys_clock.c,以可控时钟 + 阴影 RTC 桩驱动,100 断言点覆盖闰年/月末/世纪/2038 上限/星期/30 天惰性再基准化/RTC 故障降级
sys_clock/sys_clock_test.c 测试单元本体(#include 生产源码 + 强符号桩;不改生产代码)
sys_clock/stub/ 桩头文件(main.h/FreeRTOS.h/task.h/dbg_log.h),覆盖 MCU 版以在 PC 上编译
cfg_file/run_unit_test.py 配置引擎单测:离线编译真实 App/cfg/cfg_file.c,以内存虚拟文件系统桩驱动,149 断言点覆盖 INI 解析/四种值类型编解码/段注册校验/load-save-poll 契约/超长守卫/故障注入
cfg_file/cfg_file_test.c 测试单元本体(#include 生产源码 + cfg_store_* 内存 FS 后端桩;不改生产代码)
cfg_file/stub/ 桩头文件(dbg_log.h),覆盖 MCU 版以在 PC 上编译
phasor/run_unit_test.py 相量层(L2)单测:离线编译真实 App/algo/phasor.c + sample_ring.c(无需任何桩,纯算法),57 用例覆盖傅氏系数表 / 幅值·相位 / 谐波抑制与提取 / 频偏 / 采样环 / 双区原子交换
phasor/phasor_test.c 测试单元本体(#include 两个生产源码 + 合成任意波形)
adc_input/run_unit_test.py ADC 输入层(L1)单测:离线编译真实 App/algo/adc_input.c,101 用例给每个 Rank 注入互异码值逐通道钉死映射,并覆盖 DMA 挂载失败 / 乒乓半区选择(撕裂帧防线) / 超拍丢帧 / 停摆 / HAL 回调句柄守卫 / 停摆拍陈旧帧 / 参数错等真机难复现分支
adc_input/adc_input_test.c 测试单元本体(#include 生产源码 + HAL / TPAFE 可注入桩)
adc_input/stub/ 桩头文件(adc.h / tpafe5160.h)
vol_lock/run_unit_test.py 卷锁单测:离线编译真实 App/fs/vol_lock.c,33 断言点覆盖创建 / 获取 / 释放契约(fail-open 不变量:创建失败仍返回 1 且零阻塞)/ 幂等 / 超时透传
vol_lock/vol_lock_test.c 测试单元本体(#include 生产源码 + CMSIS 互斥桩)
vol_lock/stub/ 桩头文件(cmsis_os.h)
time_sync/run_unit_test.py 时间同步单测:离线编译真实 App/sync/time_sync.c,80 断言点覆盖分片喂狗延时 / 监听退避 / 时间包重组(半包·粘连·EOF·真错·预算耗尽·tick 回绕)/ 任务主循环(N-17 的全部逻辑贡献者)
time_sync/time_sync_test.c 测试单元本体(#include 生产源码 + 网络 / 事件 / RTOS 可脚本化桩 + longjmp 跳出 for(;;) 任务循环)
time_sync/stub/ 桩头文件(FreeRTOS.h / task.h / cmsis_os2.h / net_socket.h / sys_clock.h / sys_events.h / dbg_log.h)

详见 docs/测试说明/看门狗单元测试说明.md、docs/测试说明/系统时钟单元测试说明.md、 docs/测试说明/配置文件单元测试说明.md、docs/测试说明/ADC输入层单元测试说明.md、 docs/测试说明/相量层单元测试说明.md、docs/测试说明/卷锁单元测试说明.md、 docs/测试说明/时间同步单元测试说明.md; harness 用法见 common/README.md。 已挂 pre-commit 钩子 watchdog-unit-test、sys-clock-unit-test、cfg-file-unit-test、 phasor-unit-test、adc-input-unit-test、vol-lock-unit-test、time-sync-unit-test。

运行方式

# @test 一键闭环(推荐,需真机)
& '.venv\Scripts\python.exe' .dsh/skills/serial-boot-test/scripts/run_boot_test.py

# 测试套件构建的回归:要求套件跑到汇总行且断言数 > 0(T-2)
& '.venv\Scripts\python.exe' .dsh/skills/serial-boot-test/scripts/run_boot_test.py `
    --required "=== Storage Tests:" --forbidden "ERROR;HardFault;[ERR]" `
    --require-suite-summary "Storage Tests"

# 看门狗判定状态机单测(纯逻辑,无需真机)
& '.venv\Scripts\python.exe' test/host/watchdog/run_unit_test.py

# 系统时钟换算单测(纯逻辑,无需真机)
& '.venv\Scripts\python.exe' test/host/sys_clock/run_unit_test.py

# 配置引擎单测(纯逻辑,无需真机)
& '.venv\Scripts\python.exe' test/host/cfg_file/run_unit_test.py

# 相量层(L2)单测(纯逻辑,无需真机)
& '.venv\Scripts\python.exe' test/host/phasor/run_unit_test.py

# ADC 输入层(L1)单测(纯逻辑,无需真机)
& '.venv\Scripts\python.exe' test/host/adc_input/run_unit_test.py

# 卷锁单测(纯逻辑,无需真机)
& '.venv\Scripts\python.exe' test/host/vol_lock/run_unit_test.py

# 时间同步单测(纯逻辑,无需真机)
& '.venv\Scripts\python.exe' test/host/time_sync/run_unit_test.py

串口端口配置在 .serialtest/config.json(单一配置源,当前 COM6/115200)。

⚠️ 注意

  • PYTHONPATH/路径敏感:脚本按仓库根相对路径读写,从仓库根执行
  • 本目录被 pre-commit 门禁的 cppcheck / 代码规范排除(test/ 豁免); 但各模块的 run_unit_test.py 自身作为独立钩子参与门禁(见上,共 7 个)
  • 台架探针族(TCP 复连 / FTP 中止等)在 MDK-ARM/*.py,与本目录分工不同
  • 全部主机侧单测(watchdog/、sys_clock/、cfg_file/、phasor/、adc_input/、 vol_lock/、time_sync/)都需要本机装有 MSVC(VS2019/2022/2026 的 C++ 工具链); 无则脚本报环境错误(退出码 2)

相关文档

  • docs/测试说明/自动化测试流程.md — @test 细节与失败模式
  • docs/测试说明/测试开发标准流程.md — 测试分层与门禁
  • docs/测试说明/看门狗单元测试说明.md — 主机侧单测(用例 / 平台层 / 扩展方法)
  • docs/测试说明/系统时钟单元测试说明.md — 系统时钟换算单测(用例 / 桩 / Zeller 缺陷记录)
  • docs/测试说明/配置文件单元测试说明.md — 配置引擎单测(内存 FS 桩 / 抓出的 P0)
  • docs/测试说明/ADC输入层单元测试说明.md — ADC 输入层单测(逐 Rank 钉死映射)
  • docs/测试说明/相量层单元测试说明.md — 相量层单测(傅氏系数 / 双区交换)
  • docs/测试说明/卷锁单元测试说明.md — 卷锁单测(fail-open 不变量)
  • docs/测试说明/时间同步单元测试说明.md — 时间同步单测(N-17 逻辑贡献者)
  • docs/测试说明/CH395F_Test_Guide.md、FTP_Test_Guide.md