# 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`,以**内存虚拟文件系统**桩驱动,139 断言点覆盖 INI 解析/四种值类型编解码/段注册校验/load-save-poll 契约/超长守卫/故障注入 | | `cfg_file/cfg_file_test.c` | 测试单元本体(`#include` 生产源码 + `cfg_store_*` 内存 FS 后端桩;**不改生产代码**) | | `cfg_file/stub/` | 桩头文件(`dbg_log.h`),覆盖 MCU 版以在 PC 上编译 | > 详见 `docs/测试说明/看门狗单元测试说明.md`、`docs/测试说明/系统时钟单元测试说明.md`、 > `docs/测试说明/配置文件单元测试说明.md`; > harness 用法见 [`common/README.md`](common/README.md)。 > 已挂 pre-commit 钩子 `watchdog-unit-test`、`sys-clock-unit-test`、`cfg-file-unit-test`。 ## 运行方式 ```bash # @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 ``` > 串口端口配置在 `.serialtest/config.json`(单一配置源,当前 COM6/115200)。 ## ⚠️ 注意 - **PYTHONPATH/路径敏感**:脚本按仓库根相对路径读写,**从仓库根执行** - 本目录**被 pre-commit 门禁的 cppcheck / 代码规范排除**(`test/` 豁免); 但 `watchdog/run_unit_test.py`、`sys_clock/run_unit_test.py`、`cfg_file/run_unit_test.py` 自身**作为独立钩子**参与门禁(见上) - 台架探针族(TCP 复连 / FTP 中止等)在 `MDK-ARM/*.py`,与本目录分工不同 - `watchdog/`、`sys_clock/` 单测需要本机装有 MSVC(VS2019/2022 的 C++ 工具链);无则脚本报环境错误(退出码 2) ## 相关文档 - `docs/测试说明/自动化测试流程.md` — `@test` 细节与失败模式 - `docs/测试说明/测试开发标准流程.md` — 测试分层与门禁 - `docs/测试说明/看门狗单元测试说明.md` — 主机侧单测(用例 / 平台层 / 扩展方法) - `docs/测试说明/系统时钟单元测试说明.md` — 系统时钟换算单测(用例 / 桩 / Zeller 缺陷记录) - `docs/测试说明/CH395F_Test_Guide.md`、`FTP_Test_Guide.md`