docs: 新增实机测试规划(无 MCU 窗口的验证债执行面)
This commit is contained in:
@@ -93,6 +93,7 @@ docs/
|
||||
| [`测试文档模板规范.md`](测试说明/测试文档模板规范.md) | 测试文档模板与命名规则(TM / TC / DP) |
|
||||
| [`链路延迟测试说明.md`](测试说明/链路延迟测试说明.md) | 网络链路时延分段定义、判定基线、执行流程 |
|
||||
| [`模拟器差距清单.md`](测试说明/模拟器差距清单.md) | **PC 模拟器 vs 真机差距登记册**(L3 门禁可信度依据;改动涉及网络/日志/硬件层前必查 §3 决策规则) |
|
||||
| [`实机测试规划.md`](测试说明/实机测试规划.md) | **上实机后的执行规划**(7 批:环境预检 → `@test`+S7 → IWDG 注入/长跑 → 堆告警 → GD5F 错误通道 → 网络基线 → 工程卫生);每项含判据与精确命令 |
|
||||
|
||||
**主机侧单元测试(L0.5)**
|
||||
|
||||
|
||||
@@ -0,0 +1,377 @@
|
||||
# 实机测试规划(On-Board Test Plan)
|
||||
|
||||
> **用途**:把**当前所有"必须真机才能验证/收尾"的事项**集中成一份**可照做**的执行规划——
|
||||
> 每项给出「现状证据 → 目标 → 判据(可观测的量化指标)→ 执行步骤(含精确命令)→ 风险/回滚」。
|
||||
> **背景**:2026-10-02 起台架进入**无 MCU 窗口**(离线只做 L0/L0.5 与文档),
|
||||
> 第 1/2 波离线改造(S8/S1-a/S1-b/S2/S3/S10/S13/S14/S6)已全部落地并推送,
|
||||
> 遗留的**验证债**(代码已改、判据需真机)即本文的输入。
|
||||
> **前置铁律**:本文所有步骤**均在接上 MCU / 串口 / ST-LINK 之后**执行;
|
||||
> 无实机时**只读本文,不执行任何烧录**。
|
||||
> **上游**:`错误码传播审计.md`(E-xx)· `审查记录/测试与架构改进建议.md`(S7/S9/S11/S5/S4)·
|
||||
> `审查记录/下一步任务规划.md`(阶段 A/C/D)· `待处理内容.md`(登记簿 N-03/N-2/S-1)·
|
||||
> `子系统设计/看门狗设计说明.md`(§10 待台架步骤)。
|
||||
> **约定**:本文是**执行规划**不是结果记录;每项完成后**先销上游登记**,再在本文件 §9 变更记录留一行。
|
||||
|
||||
---
|
||||
|
||||
## 0. 一句话总览
|
||||
|
||||
台架窗口就绪后,按 **P0 → P1 → P2 → P3** 四批顺序执行:
|
||||
|
||||
| 批次 | 事项 | 性质 | 预估单次耗时 |
|
||||
|---|---|---|---|
|
||||
| **P0-A** | 环境预检(串口/ST-LINK/`@build`/`.map` 基线) | 前置 | 5 min |
|
||||
| **P0-B** | 产品 `@test` 闭环 + 自检结果判定(S7 + A1/A2/A3/A4) | 验证债 | 15 min |
|
||||
| **P1-A** | IWDG 故障注入 V2/V4 + 长跑 V5(N-03) | 可靠性 | 45 min |
|
||||
| **P1-B** | 堆低水位告警实测(S11) | 可观测性 | 含于长跑 |
|
||||
| **P2-A** | GD5F 错误通道(S9 = 上游 C2)+ 套件回归 | 结构债 | 60 min |
|
||||
| **P2-B** | 网络重建恢复(P1-8)+ 存量网络项重锁(N-2/N-3) | 稳定性 | 45 min |
|
||||
| **P3** | `test/` 静态检查基线(S5)+ 用例追溯(S4)+ 待核实项 | 工程卫生 | 30 min |
|
||||
|
||||
> **每批出口**:`@build` 0/0 → 一轮 `@test` PASS → ST-LINK 全片回读 `No difference found` →
|
||||
> 上游登记销项 + 本文件 §9 留痕。
|
||||
|
||||
---
|
||||
|
||||
## 1. 环境预检(P0-A,每次上台架前必跑)
|
||||
|
||||
> **目的**:避免"改动没问题、台架有问题"的误判(历史上多次把接线/权限问题误判为代码缺陷)。
|
||||
|
||||
| # | 检查 | 命令 | 通过判据 |
|
||||
|---|---|---|---|
|
||||
| A1 | 工作区干净 | `git status --short` | 无输出(或有明确待提交项) |
|
||||
| A2 | 产品构建 0/0 | `& "MDK-ARM\build.bat"` | 末行 `BUILD_OK: 0 errors, 0 warnings` |
|
||||
| A3 | 构建产物为**产品态** | 检查 `test/board/test_config.h` L30-33 | 四个 `TEST_SUITE_*` **全部注释** |
|
||||
| A4 | `.map` 非测试态 | 看 `MDK-ARM/STM32F407-Demo/STM32F407-Demo.map` 的 `ER_IROM1` | ≈ **262,100 B**(产品固件);若 ≈266,540 = 停在 RTC 套件态 → 重跑 A2 |
|
||||
| A5 | 全量静态门禁 | `pre-commit run --all-files` | **16/16 Passed** |
|
||||
| A6 | ST-LINK 探针可见 | `"C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe" -c SWD -List` | 列出探针 SN `0B250D12A218303030303032` |
|
||||
| A7 | 串口端口正确 | 检查 `.opencode/serial_config.json` 的 `portName` | 与设备管理器一致(默认 COM7) |
|
||||
| A8 | 串口助手 daemon 可用 | `& '.venv\Scripts\python.exe' tools/serial_tool/serial_tool.py status` | 返回 JSON,`open: true/false` 可读 |
|
||||
|
||||
> ⚠️ **A4 的陷阱**(2026-10-02 实测):`@build` 是**增量**构建,`run_all_suites.py` 跑完
|
||||
> 套件后 `.map` 会停在**测试套件体积**;仅还原 `test_config.h` 不够,**必须再编一次产品固件**
|
||||
> (`run_all_suites.py` 已在 `finally` 内自动补这一步)。
|
||||
|
||||
**预检失败处置**:任一项 FAIL → **不上台架**,先修到全绿(避免"带病测试"浪费台架窗口)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 产品 `@test` 闭环 + 自检结果判定(P0-B)
|
||||
|
||||
### 2.1 S7:`@test` 闭环增加"自检结果"判定
|
||||
|
||||
**现状证据**:
|
||||
- `App/log/sys_log.h` 定义 `SYSLOG_SELFTEST` 记录(定长 64B:19B 时间戳 + 空格 + 10B epoch + 空格 + 28B 描述)。
|
||||
- `syslog_post(SYSLOG_SELFTEST, ...)` 全库 **18 个调用点**(见 §2.3 清单),
|
||||
但 `test/host/verify_log.py` **只解析串口日志**,**从不读 `/log/selftest.log`**。
|
||||
- `sys_clock_init` 在 RTC 故障时返回 -1 并触发"时钟芯片异常"自检——**当前闭环捕获不到**。
|
||||
|
||||
**目标**:`@test` 闭环不仅看串口标记,**还看设备的自检结论**:
|
||||
自检有 no-go 项 → FAIL;有 warn 项 → 打印但 PASS。
|
||||
|
||||
**判据**(可观测、量化):
|
||||
1. `verify_log.py --require-selftest-pass` 退出码 0 = PASS / 1 = FAIL;
|
||||
2. 判定规则:`selftest.log` 中**出现任一 `SYSLOG_SELFTEST` 记录** = 有故障 → FAIL(v1 只记故障,不记通过);
|
||||
3. 文件不存在/大小为 0 = **无故障 → PASS**(与"有问题才记录"语义一致)。
|
||||
|
||||
**执行步骤**:
|
||||
```bash
|
||||
# 1) 先确认设备已跑过一轮(selftest.log 已落盘)
|
||||
# 通过 FTP 下载(推荐,验证 R5 可读性同时取数):
|
||||
# 客户端连 <设备IP>:21,匿名/配置账号,GET /log/selftest.log
|
||||
# 或经串口工具触发 FTP 拉取(如已有脚本)。
|
||||
|
||||
# 2) 对本轮串口日志 + selftest.log 联合判定(命令形态待 S7 落地后确认):
|
||||
& '.venv\Scripts\python.exe' test/host/verify_log.py \
|
||||
--log-path <本轮串口日志> \
|
||||
--require-selftest-pass \
|
||||
--selftest-log <下载的 selftest.log 本地副本>
|
||||
# 判据:退出码 0;输出含 "[OK] selftest: no fault record"
|
||||
```
|
||||
|
||||
**S7 落地形态(待实施,本文只给规划)**:
|
||||
|
||||
| 步骤 | 内容 | 备注 |
|
||||
|---|---|---|
|
||||
| 1 | `verify_log.py` 增 `--require-selftest-pass`(可带路径参数) | 纯标准库;与既有 `verify()` 同构 |
|
||||
| 2 | 判定语义:文件缺失/0 字节 = PASS;`filesize/64 > 0` = 有故障 = FAIL | 定长 64B → O(1) 计数 |
|
||||
| 3 | 打印故障条目(时间戳 + 描述)便于定位 | 复用 `sys_log.h` 拆分逻辑思路 |
|
||||
| 4 | `run_boot_test.py` 增 `--selftest-log` 透传 + `--require-selftest-pass` | 保持一键闭环 |
|
||||
| 5 | 文档:`自动化测试流程.md` / `测试开发标准流程.md` 增参数说明 | 门禁决策表同步 |
|
||||
|
||||
**风险/回滚**:纯读取判定,零设备风险;若 FTP 取数不便,可降级为"仅扫串口自检标记"(弱化版)。
|
||||
|
||||
### 2.2 阶段 A 存量验证债(A1~A4,同轮台架做最划算)
|
||||
|
||||
> **来源**:`审查记录/下一步任务规划.md` §2 阶段 A。这些"代码已改、判据需真机"的项,
|
||||
> 与 S7 共用**同一轮台架窗口**,一轮解决。
|
||||
|
||||
| 序 | 事项 | 现状证据 | 判据 | 命令/入口 |
|
||||
|---|---|---|---|---|
|
||||
| **A1** | **P0-1 `cfg_file` 堆分配改造真机验证** | 模拟器用宿主堆,**照不出** `Heap_Size=0x200`(512B)约束下的真实分配行为;P0 修复的**最后一道门** | 串口日志出现 `/config.ini` **`load: OK`**;Forbidden `FAIL`/`[ERR]` 零命中;**保存配置后复位,值持久** | `& '.venv\Scripts\python.exe' test/host/run_boot_test.py` |
|
||||
| **A2** | **P1-8 网络重建失败恢复** | 一次 PHY 抖动 → 网络永久不可用且**零日志**,现场无法定位 | 拔插网线/改 IP 触发重建;失败路径写 syslog 自检 + 30s 周期重试;**不自驻留死循环**;`@test` PASS | `App/task/net_task.c` reconfig 路径;UI 网口设置页改 IP |
|
||||
| **A3** | **E-34 CH395F 字节命令超时** | `ch395f.c:181/195/210` 三处 `HAL_MAX_DELAY` → SPI 异常时 netTask **永久挂死** | 改为有限超时(100~500ms)+ 返回值检查;构建 0/0;**正常通信零回归**(FTP 传输正常) | 代码改后 `@build` + `@test` |
|
||||
| **A4** | **E-04 `remo_send` 返回值** | `ui_net_sink.c:103` 丢弃 `net_send` 返回值;短写 → 客户端 CRC 失败 → **画面卡死黑屏,设备侧日志全正常** | 改返回 `int` 校验 `ret == len`;短写 `DBG_ERROR` + 连续失败强制重连;**UI 推流压力下无黑屏** | UI 远显推流压力回归 |
|
||||
|
||||
> **A5(P1-7 MAC 写入顺序)**:**先查手册**(CH395F §9.2.1 INIT 是否锁存 MAC),
|
||||
> 再决定改或文档化"无需调整"——**属离线可做部分**,不在本文强绑。
|
||||
|
||||
### 2.3 自检项清单(S7 判定对象,18 处)
|
||||
|
||||
> 来源:全库 `syslog_post(SYSLOG_SELFTEST, ...)` 调用点。**这是 S7 的判定覆盖面基准**。
|
||||
|
||||
| 文件 | 自检描述串 |
|
||||
|---|---|
|
||||
| `App/app/app_main.c` | `watchdog reset` / `clock chip fault` / `NAND fault` / `ADC fault` |
|
||||
| `App/cfg/cfg_file.c` | `cfg heap alloc fail`(×3) / `cfg template write fail` / `cfg load oversized` / `cfg load read fail` / `cfg save read fail` / `cfg save overflow` / `cfg save write fail` / `cfg poll oversized` |
|
||||
| `App/task/default_task.c` | `filesystem fault`(×2) / `storage fault`(×2) |
|
||||
| `App/task/net_task.c` | `comms fault` |
|
||||
|
||||
**联动**:`syslog_post` 的两级自愈(L1 文件级重试 / L2 错误去重 `s_fault_reported[]`)
|
||||
决定**持续故障只留第一条**——故 S7 判定"有记录即 FAIL"是**充分**的(不会被去重掩盖)。
|
||||
|
||||
---
|
||||
|
||||
## 3. IWDG 故障注入与长跑(P1-A,N-03 收尾)
|
||||
|
||||
> **来源**:`子系统设计/看门狗设计说明.md` §10 步骤 7~10(⏳ 待台架);
|
||||
> `待处理内容.md` N-03。**代码已落地编译通过**,缺的是**故障注入 + 长跑**。
|
||||
|
||||
### 3.1 三个验收用例
|
||||
|
||||
| # | 用例 | 注入方法 | 通过判据 |
|
||||
|---|---|---|---|
|
||||
| **V2** | 任务饿死 | 临时在 `netTask` 循环插 `while(1);` | 800 ms 后串口 `[ERR] WATCHDOG: task stall mask=0x...`;≤2.5 s 复位;重启后 `[WD] reset cause=watchdog reset` |
|
||||
| **V4** | 关中断死循环 | 临时插 `taskDISABLE_INTERRUPTS(); while(1);` | ≤2.5 s 复位(检验 IWDG **独立于中断**);`cause=watchdog reset` |
|
||||
| **V5** | 长期不误杀(**核心验收项**) | FTP 大文件传输 + UI 菜单遍历 + 配置保存 + 网络重配 **≥30 min** | **零复位**(重点验证 §4.4 白名单是否完备) |
|
||||
|
||||
> ⚠️ **V5 是核心验收项**:误杀比不杀更有害。必须在**真实业务负载**下跑足时长。
|
||||
|
||||
### 3.2 执行步骤
|
||||
|
||||
```bash
|
||||
# --- V2/V4(故障注入,需临时改码)---
|
||||
# 1) 基线:跑一轮产品 @test 确认无复位
|
||||
& '.venv\Scripts\python.exe' test/host/run_boot_test.py
|
||||
|
||||
# 2) 注入:按设计说明 §10 在 netTask 循环插 while(1);(或 taskDISABLE_INTERRUPTS(); while(1);)
|
||||
# —— 改完 @build,然后烧录
|
||||
& "MDK-ARM\build.bat"
|
||||
& "MDK-ARM\reset.bat" flash MDK-ARM\STM32F407-Demo\STM32F407-Demo.hex
|
||||
|
||||
# 3) 抓串口日志,确认 [ERR] WATCHDOG task stall + 复位原因
|
||||
# 4) 回读校验复位后镜像
|
||||
"C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe" \
|
||||
-c SWD -CmpFile MDK-ARM\STM32F407-Demo\STM32F407-Demo.hex 0x08000000
|
||||
# 判据:No difference found
|
||||
|
||||
# 5) 撤销注入,@build 回产品态,再跑一轮 @test 确认正常
|
||||
|
||||
# --- V5(长跑,需真实负载)---
|
||||
# 1) 用 test/host/ftp_speed_test.py / ftp_up_dl_test.py 持续传输大文件
|
||||
& '.venv\Scripts\python.exe' test/host/ftp_speed_test.py
|
||||
# 2) 同时人工/脚本遍历 UI 菜单 + 反复保存配置 + 触发网络重配
|
||||
# 3) 持续 ≥30 min,全程串口记录
|
||||
# 判据:零复位(日志无 "reset cause=watchdog reset");业务不中断
|
||||
```
|
||||
|
||||
**风险/回滚**:
|
||||
- 故障注入用例**会复位设备多次**——确认设备非在用/非已部署。
|
||||
- 长跑涉及 NAND 写入(FTP 上传)**消耗 NAND 块**——若设备已接近容量上限,改用只读传输。
|
||||
- ⚠️ **R5 风险**(设计说明 §9):NAND 擦写偶发超 800 ms 可能误复位——若 V5 出现偶发复位,
|
||||
先按设计说明增大容忍次数或把存储操作改分段置位,**不要盲目放宽全局超时**。
|
||||
|
||||
---
|
||||
|
||||
## 4. 堆低水位告警实测(P1-B,S11)
|
||||
|
||||
**现状证据**:`上一轮实测 free=8,784 / min_ever=4,848 B`(初始 `configTOTAL_HEAP_SIZE` 48KB),
|
||||
**min_ever 已低于 5KB**,余量不到 10%——新增任务/缓冲可能触发分配失败。
|
||||
|
||||
**目标**:在 `defaultTask` 低频循环(LED 闪烁节拍)里检查 `xPortGetMinimumEverFreeHeapSize()`,
|
||||
低于阈值(建议 **4096 B**)时 `DBG_ERROR("[HEAP] low water: %u B")` + 写 syslog selftest。
|
||||
|
||||
**判据**:台架长跑(复用 §3.2 V5 窗口)下,若发生低水位 → 串口出现告警行 + `selftest.log` 有记录;
|
||||
若全程未触发 → 记录"当前负载下 min_ever 仍高于阈值"作为基线。
|
||||
|
||||
**执行步骤**:
|
||||
```bash
|
||||
# 1) 代码改动(约 15 行 + 1 个编译期常量)在 defaultTask 低频循环内
|
||||
# 2) @build 0/0 后,与 §3.2 V5 长跑合并执行
|
||||
# 3) 长跑结束读取 min_ever:
|
||||
# - 串口 [HEAP] 告警行(若有)
|
||||
# - 或 FTP 取 /log/selftest.log
|
||||
# 4) 更新 docs/内存管理/RAM使用分析与优化方案.md 的 min_ever 基线
|
||||
```
|
||||
|
||||
**成本/回滚**:约 15 行 + 零额外缓冲;阈值设编译期常量便于按新基线调整。
|
||||
若长跑中频繁触发但系统正常 → 说明阈值偏紧,据实测值调整(不是缺陷)。
|
||||
|
||||
---
|
||||
|
||||
## 5. GD5F 错误通道统一(P2-A,S9 = 上游 C2)
|
||||
|
||||
> **来源**:`错误码传播审计.md` 第二档 #1(E-10/E-42/E-53/E-54/E-56/E-57);
|
||||
> `测试与架构改进建议.md` §2.3 / §4.2 四要素骨架。
|
||||
|
||||
**现状证据**:`ch395f.c`(1330 行) 与 `gd5f2gq5ue.c`(1496 行) 是同代驱动,但**只有 CH395F**
|
||||
形成了"分类 + 传播 + 审计"完整体系;GD5F 错误处理散落各函数,`Trap_Records` 仅 198 行。
|
||||
|
||||
**统一错误通道四要素**(以 CH395F 为范式):
|
||||
|
||||
| 要素 | 内容 | 对应缺陷 |
|
||||
|---|---|---|
|
||||
| ① **分类** | `wait_busy` 区分「超时 / 真故障 / 参数错」——不得混为一个返回码 | E-53 |
|
||||
| ② **透传** | 底层错误码逐层上报,不吞不猜(禁 `(void)ret`) | E-10 / E-42 |
|
||||
| ③ **分级** | 可恢复(重试)/ 不可恢复(上报自检 + 降级)显式判定 | E-54 / E-56 |
|
||||
| ④ **留痕** | 不可恢复项写 syslog selftest;可恢复项计数并在 UI/日志可见 | E-57 |
|
||||
| — | 返回类型统一 `int32_t` | E-57 |
|
||||
|
||||
**实施顺序**(数据安全优先):
|
||||
1. 先建**分类函数**(`gd5f_wait_busy` 内检查三次 HAL 调用)——所有下游判断的基础;
|
||||
2. 再修**最危险的**:`gd5f_bbt_scan` 失败**放弃持久化**(保护好副本)——**数据安全优先**;
|
||||
3. 补 **init 全链路检查 + 重试 1~2 次**;
|
||||
4. 回读 **B0h 校验 ECC 使能**(bit4);
|
||||
5. `gd5f2gq5ue_read` 的 raw 契约文档化或加 ECCS 检查;
|
||||
6. 全程在 `GD5F2GQ5UE_Trap_Records.md` 留痕,同步 `GD5F2GQ5UE_Test_Guide.md`。
|
||||
7. **RAM 预算**:新增错误分支**不得引入新的大缓冲**(先跑 `ram_report.py` 核算)。
|
||||
|
||||
**判据**:
|
||||
- **E-10 / E-42 / E-53 / E-54 / E-56 / E-57 全部销项**;
|
||||
- **GD5F 套件回归 PASS**:
|
||||
```bash
|
||||
# 套件回归(需实机)
|
||||
& '.venv\Scripts\python.exe' test/run_all_suites.py --suite gd5f
|
||||
# 判据:=== GD5F Tests: N/M PASSED (failed=0) === 且 N>0
|
||||
|
||||
# 只编译验证(离机,改动后随手跑)
|
||||
& '.venv\Scripts\python.exe' test/run_all_suites.py --check-build
|
||||
```
|
||||
|
||||
> ⚠️ **纪律**(呼应 `AGENTS.md` 铁律):自愈逻辑**严禁**把"名字/参数类错误码"
|
||||
> (如 `FR_INVALID_NAME`)归入"卷损坏触发集"——`.fschk` 无限重格式化事故即此类(2026-09-20)。
|
||||
> ⚠️ **破坏性用例**:GD5F 套件默认只跑只读;`ENABLE_DESTRUCTIVE_TESTS` 跑一次消耗一个 NAND 块
|
||||
> (实测 95248→95200),**仅在产线首启或明确需要时打开**。
|
||||
|
||||
---
|
||||
|
||||
## 6. 网络稳定性与基线重锁(P2-B)
|
||||
|
||||
### 6.1 P1-8 网络重建失败恢复(与 §2.2 A2 同一项,此处给网络专项视角)
|
||||
|
||||
**判据**:拔插网线/改 IP 触发重建后——
|
||||
- 失败路径**写 syslog 自检**(不再零日志);
|
||||
- **30s 周期重试**,不自驻留死循环;
|
||||
- 恢复后各 TCP 服务(FTP 21 等)**据代次号重建监听**,功能正常。
|
||||
|
||||
**验证手段**:`test/host/e02_probe.py`(网络探针)+ UI 网口设置页改 IP。
|
||||
|
||||
### 6.2 N-2:49s 全系统日志静默复现与定位
|
||||
|
||||
**现状证据**(登记簿 N-2):2026-09-22 台架实测,串口日志 **49s 无行**
|
||||
(testTask/netTask/[STACK] 行全缺),期间 net 栈照常处理外部连接 → **日志管线停滞**,
|
||||
队列满后各任务日志行被丢;系统功能不受损。
|
||||
|
||||
**目标**:复现条件定位(NAND 写/GC 长尾 vs UART TX 卡滞)+ 队列满的丢弃计数/告警
|
||||
(**现静默丢行,排障不可见**)。
|
||||
|
||||
**判据**:
|
||||
- 复现 49s 静默并定位到具体卡点(NAND GC / UART TX);
|
||||
- 实现**队列满丢弃计数**(至少一个 `DBG_ERROR` 或计数器经 UI/日志可见)。
|
||||
|
||||
**执行步骤**:长跑(§3.2 V5)期间周期性打点 + 对照 `CH395F` 无关的 SD2506 侧日志判别卡点。
|
||||
|
||||
### 6.3 N-3:L5 队列往返基线重验
|
||||
|
||||
**现状**:L5 基线(1223/988µs)属**分片时代**;L3 对该路径逐位不变 → 机制上无影响,
|
||||
但严格重锁需跑一轮 Phase 13(**需 PC peer**)。
|
||||
|
||||
**判据**:Phase 13 窗口跑一轮,基线数值与阈值余量(>8×)对照,重锁数值。
|
||||
|
||||
---
|
||||
|
||||
## 7. 工程卫生(P3)
|
||||
|
||||
### 7.1 S5:`test/` 代码宽松静态检查
|
||||
|
||||
**现状证据**:`test/` 完全豁免 pre-commit("自律"要求),而 `test/board/` 下 **6300+ 行 C 代码**
|
||||
(实测 `.c`+`.h` 合计 6,313 行)**且编入固件**。曾出现 `s_rx_buf` 使用先于声明。
|
||||
|
||||
**目标**:抓 `test/board/` 固件测试代码的**真实缺陷**(未初始化/越界/空指针),
|
||||
但不引入存量 style 噪音。
|
||||
|
||||
**执行步骤(先跑基线,离机可做)**:
|
||||
```bash
|
||||
# 1) 基线统计(不需实机)
|
||||
cppcheck --enable=warning --error-exitcode=1 test/ 2>&1 | tee test_cppcheck_baseline.txt
|
||||
|
||||
# 2) 若存量可控(建议 <20 条)→ 加 test-cppcheck 钩子,只开 warning
|
||||
# 3) 若存量较多 → 先建 suppress 清单(明确每条豁免理由),再挂钩子
|
||||
# 4) 务必排除模拟器桩/第三方头(test/host/watchdog/stub/ 等)
|
||||
```
|
||||
**判据**:`test-cppcheck` 在 CI PASS;新增测试代码越界/未初始化被自动拦截。
|
||||
> **注意**:若基线告警过多,**保持现状亦可接受**——此时应把该决策写明确("理由:存量 N 条")。
|
||||
|
||||
### 7.2 S4:用例追溯脚本
|
||||
|
||||
**现状**:文档声称 91 个 TC、代码有 222 个 `TEST_CHECK`(断言点数 > 用例数是正常的),
|
||||
但**双向是否一一对应无人校验**。
|
||||
|
||||
**目标**:新增 `[计划] scripts/check_test_traceability.py`——
|
||||
输入 `test/board/*_test_task.c` 的 TC 注释 + `docs/测试说明/*Test_Guide.md` 的 TC 编号;
|
||||
输出 ① 文档有、代码无(未实现)② 代码有、文档无(未登记)。
|
||||
**默认仅告警(warning),不阻断提交**(与 `doc-links` 演进路径一致)。
|
||||
|
||||
**判据**:一键列出双向差异清单;差异收敛后再考虑升为门禁。
|
||||
|
||||
### 7.3 待核实项:`TEST_SUITE_SELECTED` 未含 `TEST_SUITE_RTC`
|
||||
|
||||
**现状证据**(`test/board/test_config.h`):
|
||||
- L45 互斥检查**已包含** `TEST_SUITE_RTC`(4 个套件互斥正确);
|
||||
- **L49-51 的 `TEST_SUITE_SELECTED` 只含前三个**(CH395F / STORAGE / GD5F),**未含 RTC**。
|
||||
|
||||
**疑似影响**:`TEST_SUITE_SELECTED` 被用于 `defaultTask` 是否空闲、是否创建 `testTask` 等分支——
|
||||
若 RTC 套件构建下 `TEST_SUITE_SELECTED` 未定义,**testTask 可能不被创建 → RTC 套件不执行**。
|
||||
但 `run_all_suites.py --check-build` 实测 RTC 套件**能编译通过**(那只是编译,不是运行)。
|
||||
|
||||
**判据**:有实机时,选 `TEST_SUITE_RTC` 构建并烧录,观察:
|
||||
- 串口是否出现 `=== RTC Tests: N/M PASSED ===` 汇总行;
|
||||
- 若**无汇总行** → 证实缺陷,`TEST_SUITE_SELECTED` 需补 `|| defined(TEST_SUITE_RTC)`;
|
||||
- 若**有汇总行** → 说明另有分支覆盖,属"有意为之",在 `test_config.h` 注释说明。
|
||||
|
||||
**执行步骤**:
|
||||
```bash
|
||||
# 1) 改 test_config.h:取消注释 TEST_SUITE_RTC(其余保持注释)
|
||||
& "MDK-ARM\build.bat"
|
||||
# 2) 烧录(注意 reset.bat flash 后必须 -Rst -Run)
|
||||
& "MDK-ARM\reset.bat" flash MDK-ARM\STM32F407-Demo\STM32F407-Demo.hex
|
||||
# 3) 抓串口日志,grep 汇总行
|
||||
# 4) 还原 test_config.h 为产品态 + 重建产品固件(避免 .map 污染)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. 与既有文档的引用闭环
|
||||
|
||||
| 本文项 | 上游文档 | 下游落地文档 |
|
||||
|---|---|---|
|
||||
| S7 自检判定 | `审查记录/测试与架构改进建议.md` §3.7 | `测试说明/自动化测试流程.md`(待补参数) |
|
||||
| V2/V4/V5 | `子系统设计/看门狗设计说明.md` §10 | `待处理内容.md` N-03(销项) |
|
||||
| S11 堆告警 | `测试与架构改进建议.md` §4.4 | `内存管理/RAM使用分析与优化方案.md`(基线更新) |
|
||||
| S9 GD5F | `问题记录/错误码传播审计.md` 第二档 #1 | `问题记录/GD5F2GQ5UE_Trap_Records.md`、`测试说明/GD5F2GQ5UE_Test_Guide.md` |
|
||||
| N-2 日志静默 | `待处理内容.md` N-2 | `问题记录/错误码传播审计.md` E-02 |
|
||||
| P1-8 网络重建 | `审查记录/下一步任务规划.md` 阶段 A | `网络/Net层阻塞模型架构设计.md` |
|
||||
| S5/S4 | `测试与架构改进建议.md` §3.4/§3.5 | `测试说明/测试开发标准流程.md` |
|
||||
| 模拟器差距 | `测试说明/模拟器差距清单.md` §3 决策规则 | 本文为"需回真机"项的执行面 |
|
||||
|
||||
> **模拟器差距清单 §3 的六条"必须回真机"规则**决定"哪些改动**必须在本规划内验证——
|
||||
> 改动触及 `Drivers/BSP/` 寄存器时序 / H-1~H-7 硬件项 / L-2~L-4 / 网络重建并发 / 启动段 / 内存预算,
|
||||
> 一律在本文件找到对应批次。
|
||||
|
||||
---
|
||||
|
||||
## 9. 变更记录
|
||||
|
||||
| 日期 | 变更 |
|
||||
|---|---|
|
||||
| 2026-10-02 | 初版:无 MCU 窗口建立。汇总 P0-A 环境预检 / P0-B `@test`+S7 / P1-A IWDG V2/V4/V5 / P1-B S11 / P2-A S9 / P2-B P1-8+N-2+N-3 / P3 S5+S4+待核实项,共 **7 批**。每项含现状证据 / 目标 / 判据(量化)/ 执行步骤(精确命令)/ 风险回滚。18 处自检调用点清单 + 模拟器差距清单 §3 决策规则交叉引用 |
|
||||
Reference in New Issue
Block a user