docs(测试说明): 按用途分六个子目录并同步全库引用

分层:流程与规范/ 单元测试/ 板级测试/ 专项验证/ 测试工具/ 测试数据/,
顶层只留新增的目录导航 README.md(归层判据 + 硬约束 + 本次处置记录)。

- 搬迁 28 个路径:测试数据三个目录 58 个文件为纯改名(R100,内容逐字节不变)
- 全库引用同步 124 个文件:AGENTS / docs 索引 / skills / 门禁注释 / scripts
- 门禁面:scripts/check_test_traceability.py 的 glob 改 rglob
  (分层后不递归扫描=追溯门禁直接瞎掉)
- scripts/rename_ref.py:收尾的 ℹ 提示在 GBK 代码页抛 UnicodeEncodeError,
  让进程以退出码 1 收场而改写其实已落盘(RC 与真实结果相反);改为把
  stdout/stderr reconfigure 成 UTF-8,与 check_doc_links.py 等同法
- docs/文档规范.md §1.1 补「子目录文件过多时再分一层」;§3.6 补 rename_ref
  搬整目录的两个实测坑:① 会改写目录内部文件的内容 ② 内部文件的 ../ 出链
  不补层级(本次 23 个被误改的证据文件已按 HEAD 原始字节逐字节还原)
- docs/README.md §6 改为与六个子目录一一对应,并补登原先漏登记的
  「启动日志原子性复验流程」一行
- .cubemx_survival_baseline.json:App/util/task_watchdog.c 的注释路径也随分层更新,
  该文件是存活审计的 watchdog-module 漂移锚点,按脚本自己的提示跑 --write 重建基线
  (实测重建后仅 watchdog-module 一条哈希变化)
- 铁律 4 例外(本次在任务树里改了单写者文件):AGENTS.md 与
  .pre-commit-config.yaml 只被 rename_ref 改写路径字面量(后者全在注释行),
  任务表块与钩子声明一字未动

验证:check_doc_links.py --sections-strict 覆盖全部 88 个改动 .md 全绿;
check_test_traceability.py 输出与主树逐行一致;196 个文本文件无 BOM、无新增
CR、无 U+FFFD、无行尾空白;陈旧引用面由主树 25 处降到 6 处(无新增断链)。
This commit is contained in:
2026-10-30 07:06:38 +08:00
parent fea4cc7502
commit f754d59218
209 changed files with 644 additions and 528 deletions
+4 -4
View File
@@ -56,7 +56,7 @@
## 相关文档
- `docs/测试说明/测试开发标准流程.md` — 测试验证分层与门禁决策表
- `docs/测试说明/自动化测试流程.md` — `@test` 细节与失败模式
- 各模块测试指南:`docs/测试说明/*_Test_Guide.md`
- `docs/测试说明/链路延迟测试说明.md`
- `docs/测试说明/流程与规范/测试开发标准流程.md` — 测试验证分层与门禁决策表
- `docs/测试说明/流程与规范/自动化测试流程.md` — `@test` 细节与失败模式
- 各模块测试指南:`docs/测试说明/板级测试/*_Test_Guide.md`
- `docs/测试说明/专项验证/链路延迟测试说明.md`
+2 -2
View File
@@ -40,6 +40,6 @@
## 相关文档
- 测试指南:`docs/测试说明/CH395F_Test_Guide.md`、`GD5F2GQ5UE_Test_Guide.md`、`SD2506_Test_Guide.md`、`FTP_Test_Guide.md`
- 测试指南:`docs/测试说明/板级测试/CH395F_Test_Guide.md`、`GD5F2GQ5UE_Test_Guide.md`、`SD2506_Test_Guide.md`、`FTP_Test_Guide.md`
- 套件配置:`AGENTS.md`「测试与验证」章
- 容量恢复:`docs/测试说明/存储维护与容量恢复.md`
- 容量恢复:`docs/测试说明/专项验证/存储维护与容量恢复.md`
+5 -5
View File
@@ -26,7 +26,7 @@
* Phase 12 | 硬件层 | 独立运行:SPI 字节命令 / DMA 时延基线(SPI_CMD/SPI_DMA,无需 PC)
* Phase 13 | NET 层 | testTask:芯片 + 队列时延(CHUNK_WAIT~FRAME_RT/LOGTAX,需 PC peer,独立运行)
* Phase 14 | NET 层 | testTask:生产路径时延(PROD_CYCLE~UI_LOOP + 模拟器 A/B,需 PC peer)〔M3 规划〕
* 时延分段定义/判定基线/执行流程:docs/测试说明/链路延迟测试说明.md
* 时延分段定义/判定基线/执行流程:docs/测试说明/专项验证/链路延迟测试说明.md
*/
#ifndef CH395F_TEST_H
@@ -42,7 +42,7 @@ extern "C" {
/*
* 阶段使能开关(取消注释即启用对应阶段)
*
* 构建模式互斥(详见 docs/测试说明/CH395F_Test_Guide.md「构建模式与执行顺序」):
* 构建模式互斥(详见 docs/测试说明/板级测试/CH395F_Test_Guide.md「构建模式与执行顺序」):
* 硬件层模式(阶段 1~5):netTask 入口自挂起(创建但不运行),testTask 独占 CH395F
* NET 层模式 (阶段 6~11):完整网络栈,netTask 轮询 + testTask 监听循环
*
@@ -66,10 +66,10 @@ extern "C" {
* 连接无效,E11 实证);勿与 Phase 6/9/10/13 混选(recv 互抢数据)。
* ⚠ 说明写在**上一行**而不是挂在 #define 行尾:见本节末尾的"开关行注释规范" */
#define ENABLE_PHASE11_TESTS /* [网] KeepAlive 超时断开(判据见 CH395F_Test_Guide) */
/* ---- 链路时延基线(M1;分段/阈值见 docs/测试说明/链路延迟测试说明.md)---- */
/* ---- 链路时延基线(M1;分段/阈值见 docs/测试说明/专项验证/链路延迟测试说明.md)---- */
//#define ENABLE_PHASE12_TESTS /* [硬] SPI 字节命令 / DMA 时延基线(SPI_CMD/SPI_DMA,无需 PC)—— M1 已完成,基线见说明文档 §6.1 */
//#define ENABLE_PHASE15_TESTS /* [硬] 自愈驱动原语:状态回读一致性/cmd_done/sock_reset 状态机跑通/链路缓存(无需 PC)——TC 详见 docs/测试说明/CH395F_Test_Guide.md 阶段 15;台架 21/21 PASS */
/* ---- 链路时延(M2/M3;分段/阈值见 docs/测试说明/链路延迟测试说明.md)---- */
//#define ENABLE_PHASE15_TESTS /* [硬] 自愈驱动原语:状态回读一致性/cmd_done/sock_reset 状态机跑通/链路缓存(无需 PC)——TC 详见 docs/测试说明/板级测试/CH395F_Test_Guide.md 阶段 15;台架 21/21 PASS */
/* ---- 链路时延(M2/M3;分段/阈值见 docs/测试说明/专项验证/链路延迟测试说明.md)---- */
//#define ENABLE_PHASE13_TESTS /* [网] 芯片 + 队列时延(CHUNK_WAIT~FRAME_RT/LOGTAX,需 PC peer)—— M2 已完成,基线见说明文档 §6.2 */
/* [网] 生产路径时延(PROD_CYCLE~UI_LOOP + 模拟器 Δ)—— M3,需 peer --mode remo(:7003);
* 与 Phase 11 共存安全:peer 缺席时有 LAT_P14_TIMEOUT_MS 整体超时,自动 done,
+2 -2
View File
@@ -90,7 +90,7 @@ static void phase1_run(void) {
* 通过:函数返回 CH395F_ERR_SUCCESS(0x00)= SPI 回显取反匹配。
* 失败:返回 CH395F_STATUS_NOT_DETECTED(0xFF)= SPI 通信异常或芯片未响应。
*
* 用例号:TC-NET-101(docs/测试说明/CH395F_Test_Guide.md §2 阶段 1「SPI 命令路径
* 用例号:TC-NET-101(docs/测试说明/板级测试/CH395F_Test_Guide.md §2 阶段 1「SPI 命令路径
* 完整性」——该条目的各步就是本函数按序执行的九个测试项,项号见各项标注)。
*/
{
@@ -187,7 +187,7 @@ static void phase1_run(void) {
* 失败:第二次读非 0x0000(测试期间出现新事件)。
*
* 用例号:本项即原 TC-NET-102(全局中断状态一致性)。该条目在 2026-08-22
* 文档重构时被删、而 docs/测试说明/CH395F_Test_Guide.md 附录 B 的
* 文档重构时被删、而 docs/测试说明/板级测试/CH395F_Test_Guide.md 附录 B 的
* 汇总行遗留至今,故在此把号挂回实现体。
*/
{
+1 -1
View File
@@ -2,7 +2,7 @@
* 模块名称:GD5F2GQ5UE Driver Test Suite
* 模块功能:GD5F2GQ5UE SPI NAND Flash 驱动测试入口,按阶段组织测试用例,
* 覆盖 gd5f2gq5ue.c 全部公开/私有函数,并延伸到 FTL(nand_ftl)与
* FatFS diskio。详见 docs/测试说明/GD5F2GQ5UE_Test_Guide.md。
* FatFS diskio。详见 docs/测试说明/板级测试/GD5F2GQ5UE_Test_Guide.md。
* 适用平台:STM32F4 系列(GD5F2GQ5UE SPI NAND)
* 作者:王建锋
* 创建日期:2026-08-26
+1 -1
View File
@@ -3,7 +3,7 @@
* 模块功能:DWT CYCCNT 微秒时基 + 采样统计(min/med/p95/max/尖峰)+ [LAT]
* 机器可读报告与 verdict;Phase 12(M1):SPI 字节命令 / DMA 时延
* 基线(SPI_CMD/SPI_DMA,硬件层模式,无需 PC)。分段定义与判定基线见
* docs/测试说明/链路延迟测试说明.md。
* docs/测试说明/专项验证/链路延迟测试说明.md。
* 适用平台:STM32F4 系列(CH395F)
* 作者:王建锋
* 创建日期:2026-09-22
+1 -1
View File
@@ -5,7 +5,7 @@
* Phase 12(硬件层,M1):SPI 字节命令 / DMA 时延基线(SPI_CMD/SPI_DMA,无需 PC);
* Phase 13/14(NET 层,M2/M3 规划):芯片发送握手 / 队列往返 /
* 生产路径时延。分段定义、判定基线与执行流程见
* docs/测试说明/链路延迟测试说明.md。
* docs/测试说明/专项验证/链路延迟测试说明.md。
* 适用平台:STM32F4 系列(CH395F)
* 作者:王建锋
* 创建日期:2026-09-22
+3 -3
View File
@@ -494,7 +494,7 @@ static int32_t phase8_verify(uint8_t *buf, uint32_t size, uint32_t offset) {
#endif
/* 用例号:TC-NET-801(SEND 方向)与 TC-NET-802(RECV 方向)——两向由
* PHASE8_DIRECTION 编译期切换,定义见 docs/测试说明/CH395F_Test_Guide.md
* PHASE8_DIRECTION 编译期切换,定义见 docs/测试说明/板级测试/CH395F_Test_Guide.md
* 阶段 8(本函数体从未改过名,只是一直没挂上号,2026-10-21 核对补注)。 */
static void phase8_run(int32_t sockfd) {
#if PHASE8_DIRECTION == PHASE8_DIR_RECV
@@ -610,7 +610,7 @@ static void phase8_run(int32_t sockfd) {
* 通过:select 检测到数据并成功回显。
* 失败:select 未检测到数据或回显失败。
* 用例号:TC-NET-901(单 Socket 就绪检测)与 TC-NET-902(超时返回 0),
* 定义见 docs/测试说明/CH395F_Test_Guide.md 阶段 9——本测试一直在,
* 定义见 docs/测试说明/板级测试/CH395F_Test_Guide.md 阶段 9——本测试一直在,
* 只是从未挂上这两个号(2026-10-21 核对补注)。
* =================================================================== */
@@ -811,7 +811,7 @@ static void phase10_run(int32_t sockfd) {
* 通过:从连接建立到 recv 返回 0 的间隔落在 10s~120s 有界窗
* (芯片定时语义与手册公式 75s 不符,实测判死 18~31s——
* 见《网络自愈架构设计》§5.2 E11 与 phase11_run 内判据注释)。
* 用例号:TC-NET-1101(docs/测试说明/CH395F_Test_Guide.md 阶段 11 KeepAlive 触发断开)。
* 用例号:TC-NET-1101(docs/测试说明/板级测试/CH395F_Test_Guide.md 阶段 11 KeepAlive 触发断开)。
* =================================================================== */
#ifdef ENABLE_PHASE11_TESTS
+1 -1
View File
@@ -229,7 +229,7 @@ void sd2506_test_run(void)
* 不再出现"Phase 2 显示的是含 Phase 1 的累计值"这种易误读输出;
* 2) 末尾输出套件级 `=== RTC Tests: N/M PASSED (failed=0) ===` 汇总行——
* 它是 run_all_suites.py --require-suite-summary 的判定标记
* (见 test_common.h / docs/测试说明/测试开发标准流程.md §3.2)。 */
* (见 test_common.h / docs/测试说明/流程与规范/测试开发标准流程.md §3.2)。 */
uint16_t suite_total = 0U;
uint16_t suite_passed = 0U;
uint16_t suite_failed = 0U;
+1 -1
View File
@@ -6,7 +6,7 @@
*
* 设计取舍:**统计变量仍按套件独立**(各套件持有自己的 `g_xxx_stats`),
* 公共宏只提供"内核",由各套件用一行宏把它绑定到自己的统计变量。
* 理由见 docs/测试说明/测试开发标准流程.md §3.2:
* 理由见 docs/测试说明/流程与规范/测试开发标准流程.md §3.2:
* - 统计变量独立 = 防跨套件串数(历史约定,不能破);
* - 内核共用 = 报告行格式/字段一处维护,改一次即全生效。
*
+2 -2
View File
@@ -26,7 +26,7 @@ extern "C" {
* ⚠️ 默认必须是**产品构建**(全部注释)——pre-commit 钩子 `test-suite-switch` 会拦截
* 未显式放行的测试构建(`--allow-test-build` / `ALLOW_TEST_BUILD=1`)。
* 跑套件回归时取消注释所需套件;跑完务必改回、或直接用 `test/run_all_suites.py`
* (自动改宏 + 结束后无条件还原)。详见 docs/测试说明/测试开发标准流程.md §3.1/§3.6。 */
* (自动改宏 + 结束后无条件还原)。详见 docs/测试说明/流程与规范/测试开发标准流程.md §3.1/§3.6。 */
//#define TEST_SUITE_CH395F
//#define TEST_SUITE_STORAGE
//#define TEST_SUITE_GD5F
@@ -54,7 +54,7 @@ extern "C" {
* 创建"的旧疑点不成立(实测 RTC 套件正常执行;RTC 已计入下方析取,故 RTC 构建下本
* 标记亦置位、testTask 正常保留)。
* 4 个套件(含 RTC)在此补齐:若将来再引入"测试构建下 defaultTask 空闲"等分支而复用
* 本标记,可避免重演"漏 RTC"的隐患。详见 docs/测试说明/实机测试实施指南.md §8.3。 */
* 本标记,可避免重演"漏 RTC"的隐患。详见 docs/测试说明/板级测试/实机测试实施指南.md §8.3。 */
#if defined(TEST_SUITE_CH395F) || defined(TEST_SUITE_STORAGE) || defined(TEST_SUITE_GD5F) || defined(TEST_SUITE_RTC)
#define TEST_SUITE_SELECTED
#endif
+14 -14
View File
@@ -70,10 +70,10 @@
| `nand_port/nand_port_test.c` | 测试单元本体(`#include` 生产源码 + RAM 假芯片;内联一份"只看页首 64 B"的**旧算法对照**,证明断言能咬人) |
| `nand_port/stub/` | 桩头文件(`gd5f2gq5ue.h` 芯片几何与 SPI 原语声明 / `dbg_log.h` 日志宏计数) |
> 详见 `docs/测试说明/看门狗单元测试说明.md`、`docs/测试说明/系统时钟单元测试说明.md`、
> `docs/测试说明/配置文件单元测试说明.md`、`docs/测试说明/ADC输入层单元测试说明.md`、
> `docs/测试说明/相量层单元测试说明.md`、`docs/测试说明/卷锁单元测试说明.md`、
> `docs/测试说明/时间同步单元测试说明.md`;
> 详见 `docs/测试说明/单元测试/看门狗单元测试说明.md`、`docs/测试说明/单元测试/系统时钟单元测试说明.md`、
> `docs/测试说明/单元测试/配置文件单元测试说明.md`、`docs/测试说明/单元测试/ADC输入层单元测试说明.md`、
> `docs/测试说明/单元测试/相量层单元测试说明.md`、`docs/测试说明/单元测试/卷锁单元测试说明.md`、
> `docs/测试说明/单元测试/时间同步单元测试说明.md`;
> harness 用法见 [`common/README.md`](common/README.md)。
> 已挂 pre-commit 钩子(各模块同名 `*-unit-test`,共 **22** 个;逐个说明见
> `docs/代码规范/pre-commit使用说明.md` §2 与 AGENTS.md 门禁条)。
@@ -149,13 +149,13 @@
## 相关文档
- `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` — 时间同步单测(探针窗口心跳缺口逻辑贡献者)
- `docs/测试说明/CH395F_Test_Guide.md`、`FTP_Test_Guide.md`
- `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` — 时间同步单测(探针窗口心跳缺口逻辑贡献者)
- `docs/测试说明/板级测试/CH395F_Test_Guide.md`、`FTP_Test_Guide.md`
+1 -1
View File
@@ -26,7 +26,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误(找不到编译器 / 编译失败 / 无汇总行)。
设计依据:docs/算法/继电保护功能复现规划.md §3.1(采样有效性校验);
docs/测试说明/测试开发标准流程.md §4.2(主机侧纯逻辑单测)。
docs/测试说明/流程与规范/测试开发标准流程.md §4.2(主机侧纯逻辑单测)。
创建日期:2026-10-11
"""
import os
+1 -1
View File
@@ -14,7 +14,7 @@
* 这些在真机上极难复现(需掉电/坏块)。
* 3. 不占 MCU 的 RAM。
*
* 覆盖点(对应 docs/测试说明/配置文件单元测试说明.md 的 TC-CFG-xxx):
* 覆盖点(对应 docs/测试说明/单元测试/配置文件单元测试说明.md 的 TC-CFG-xxx):
* —— 值类型编解码(s_encode / s_decode 经公开 load/save 间接验证 + 直接白盒)——
* TC-CONFIG-001 UINT 1/2/4 字节小端往返(含 0 / 最大值)
* TC-CONFIG-002 UINT 非法:空 / 非数字 / 带后缀 / 超范围
+1 -1
View File
@@ -22,7 +22,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误(找不到编译器 / 编译失败 / 无汇总行)。
设计依据:docs/测试说明/配置文件单元测试说明.md(S1-b,原复审项已闭环);
设计依据:docs/测试说明/单元测试/配置文件单元测试说明.md(S1-b,原复审项已闭环);
创建日期:2026-10-02
"""
import os
@@ -36,7 +36,7 @@ r"""配置存储后端(cfg_file_store_mcu)的主机侧纯逻辑单元测试
设计依据:docs/子系统设计/配置文件设计说明.md §6.2(mtime 令牌)、
docs/架构设计/STM32F4-Base存储架构说明.md §10.1 第 10/11 条、
docs/测试说明/主机单测覆盖率口径.md §9 P2 第 2 项
docs/测试说明/单元测试/主机单测覆盖率口径.md §9 P2 第 2 项
创建日期:2026-10-24
"""
import os
+2 -2
View File
@@ -72,7 +72,7 @@ raise SystemExit(run_host_unit_test(TestBuild(name="...", src="...", ...)))
## 环境要求
同主机侧纯逻辑单测通用要求(见 [`../../../docs/测试说明/测试开发标准流程.md`](../../../docs/测试说明/测试开发标准流程.md) §4.2):
同主机侧纯逻辑单测通用要求(见 [`../../../docs/测试说明/流程与规范/测试开发标准流程.md`](../../../docs/测试说明/流程与规范/测试开发标准流程.md) §4.2):
MSVC `cl.exe`(装了 VS 即有)+ Windows SDK + 纯标准库 Python;**不调 `vcvars64.bat`**
(内部 `reg.exe` 受限),直接拼环境变量调 `cl.exe`。
@@ -104,7 +104,7 @@ MSVC `cl.exe`(装了 VS 即有)+ Windows SDK + 纯标准库 Python;**不
- `DTU_HOST_BUILD=<目录>`:改产物根(CI/容器要固定路径时用)。覆盖率侧同源——
`scripts/check_test_coverage.py` 复用同一个函数,不再用自己那套固定名
(旧 `%TEMP%\dtu_test_cov` 的共享名,正是 docs/测试说明/主机单测覆盖率口径.md 里
(旧 `%TEMP%\dtu_test_cov` 的共享名,正是 docs/测试说明/单元测试/主机单测覆盖率口径.md 里
"并行期每人只跑 `--module` 自己模块"那条规避的由来;分家之后该规避不再必要)。
- `DTU_HOST_BUILD_KEEP=1`:保留本次独占目录不删(要单步调试那个 exe 时用,会打印路径)。
+4 -4
View File
@@ -36,7 +36,7 @@
summary_marker="=== Task Watchdog Tests:",
)))
设计依据:docs/测试说明/测试开发标准流程.md §4.2
设计依据:docs/测试说明/流程与规范/测试开发标准流程.md §4.2
创建日期:2026-10-01
"""
@@ -141,9 +141,9 @@ class TestBuild:
# 套件**就会互相覆盖,而最坏的不是编不过:A 树编译完,B 树把同名 exe 又盖一遍,
# A 树随后执行的是 **B 树编出来的二进制**——两棵树的 summary_marker 一模一样,
# harness 分辨不出来,于是拿着别人的运行结果给自己下结论(比红更难查)。
# 覆盖率侧同源:%TEMP%\dtu_test_cov 也是固定共享名(docs/测试说明/主机单测覆盖率
# 口径.md 里"并行期每人只跑 --module 自己模块"就是为绕开它写的规避;本处修好后
# 那条规避不再必要)。
# 覆盖率侧同源:%TEMP%\dtu_test_cov 也是固定共享名(口径文档
# docs/测试说明/单元测试/主机单测覆盖率口径.md:其中"并行期每人只跑 --module 自己模块"
# 就是为绕开它写的规避;本处修好后那条规避不再必要)。
#
# 口径:**按工作树分家**。产物根 = %TEMP%\dtu_host\<仓库根路径哈希>\,跨树天然不撞,
# 同一棵树内仍复用同一份目录(33 套的编译缓存没必要白白重编)。**不用锁**——锁会把
+3 -2
View File
@@ -1282,9 +1282,10 @@ static void tc_check_then_act(void)
* 这是本套唯一能把"两个生产者并发时,写进 DR 的字节流里不得出现另一条行的字节"
* 做成必然失败断言的把手:修复后是**非阻塞**设计,永远不会调 vTaskDelay,所以既有的
* con_delay_hook 在这条路径上根本不会被触发(拿它当注入点会静默地什么都测不到)。
* 台架一手证据:docs/测试说明/boot_log_data/20261026_prod_console_interleave_evidence.txt
* 台架一手证据:docs/测试说明/测试数据/boot_log_data/20261026_prod_console_interleave_evidence.txt
* —— PROT 行内多出 [ 2 0 三字节,紧接其后的 NAND_FTL 行恰好缺这三个字节的行首。 */
/* 台架 16:37 那次被插字的原文行(boot_log_data/20261026_prod_console_interleave_evidence.txt
/* 台架 16:37 那次被插字的原文行(证据文件同上:
* docs/测试说明/测试数据/boot_log_data/ 那份 interleave 证据的
* OCCURRENCE 1 去掉三个外来字节之后的样子)。M 族拿它当"真实行长与真实前缀"的样本,
* 免得用例自己造一个不像现场的理想行。 */
static const char s_prot_line[] =
+1 -1
View File
@@ -38,7 +38,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/子系统设计/控制台单写者日志设计说明.md、docs/测试说明/主机单测覆盖率口径.md §9「P2 落地」清单第 3 条
设计依据:docs/子系统设计/控制台单写者日志设计说明.md、docs/测试说明/单元测试/主机单测覆盖率口径.md §9「P2 落地」清单第 3 条
创建日期:2026-10-24
"""
import os
+1 -1
View File
@@ -22,7 +22,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误(找不到编译器 / 编译失败 / 无汇总行)。
设计依据:docs/子系统设计/网络配置说明.md §3.4、docs/测试说明/主机单测覆盖率口径.md §9 P1
设计依据:docs/子系统设计/网络配置说明.md §3.4、docs/测试说明/单元测试/主机单测覆盖率口径.md §9 P1
创建日期:2026-10-23
"""
import os
+1 -1
View File
@@ -28,7 +28,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/子系统设计/*104* 设计文档、AGENTS.md 模块约定(单连接 socket 断开语义、
错误码经任务通知值回传)、docs/测试说明/主机单测覆盖率口径.md §9
错误码经任务通知值回传)、docs/测试说明/单元测试/主机单测覆盖率口径.md §9
创建日期:2026-10-23
"""
import os
+1 -1
View File
@@ -3,7 +3,7 @@
Server-driven protocol: the MCU (testTask, port 8080) sends one operation
byte; the peer executes the corresponding traffic pattern. See
docs/测试说明/链路延迟测试说明.md §4.5 for the full protocol spec.
docs/测试说明/专项验证/链路延迟测试说明.md §4.5 for the full protocol spec.
Ops (MCU -> peer):
0x01 QUEUE_RT recv flood : peer sends 50 x 100B (5ms apart)
+2 -2
View File
@@ -29,8 +29,8 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/测试说明/FTP_Test_Guide.md、docs/子系统设计/网络配置说明.md §3.4、
docs/测试说明/主机单测覆盖率口径.md §9
设计依据:docs/测试说明/板级测试/FTP_Test_Guide.md、docs/子系统设计/网络配置说明.md §3.4、
docs/测试说明/单元测试/主机单测覆盖率口径.md §9
创建日期:2026-10-23
"""
import os
+2 -2
View File
@@ -25,8 +25,8 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/子系统设计/网络配置说明.md §3.4、docs/测试说明/FTP_Test_Guide.md、
docs/测试说明/主机单测覆盖率口径.md §9
设计依据:docs/子系统设计/网络配置说明.md §3.4、docs/测试说明/板级测试/FTP_Test_Guide.md、
docs/测试说明/单元测试/主机单测覆盖率口径.md §9
创建日期:2026-10-23
"""
import os
+1 -1
View File
@@ -26,7 +26,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/内存管理/RAM使用分析与优化方案.md §4.2.1、docs/测试说明/主机单测覆盖率口径.md §9 P1
设计依据:docs/内存管理/RAM使用分析与优化方案.md §4.2.1、docs/测试说明/单元测试/主机单测覆盖率口径.md §9 P1
创建日期:2026-10-23
"""
import os
+1 -1
View File
@@ -28,7 +28,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误(找不到编译器 / 编译失败 / 无汇总行)。
设计依据:docs/子系统设计/网络配置说明.md、docs/测试说明/主机单测覆盖率口径.md §9 P1
设计依据:docs/子系统设计/网络配置说明.md、docs/测试说明/单元测试/主机单测覆盖率口径.md §9 P1
创建日期:2026-10-23
"""
import os
+1 -1
View File
@@ -31,7 +31,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/网络/网络自愈架构设计.md §4.10、docs/网络/Net层阻塞模型架构设计.md、
docs/测试说明/主机单测覆盖率口径.md §9
docs/测试说明/单元测试/主机单测覆盖率口径.md §9
创建日期:2026-10-23
"""
import os
+1 -1
View File
@@ -31,7 +31,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/网络/网络自愈架构设计.md §4.10、docs/测试说明/主机单测覆盖率口径.md §9(假 CH395F 实施规格)
设计依据:docs/网络/网络自愈架构设计.md §4.10、docs/测试说明/单元测试/主机单测覆盖率口径.md §9(假 CH395F 实施规格)
创建日期:2026-10-23
"""
import os
+1 -1
View File
@@ -30,7 +30,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:AGENTS.md 模块约定(错误码经任务通知值回传)、
docs/网络/Net层阻塞模型架构设计.md、docs/测试说明/主机单测覆盖率口径.md §9
docs/网络/Net层阻塞模型架构设计.md、docs/测试说明/单元测试/主机单测覆盖率口径.md §9
创建日期:2026-10-23
"""
import os
+1 -1
View File
@@ -25,7 +25,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/网络/Net层阻塞模型架构设计.md、docs/测试说明/主机单测覆盖率口径.md §9 P1
设计依据:docs/网络/Net层阻塞模型架构设计.md、docs/测试说明/单元测试/主机单测覆盖率口径.md §9 P1
创建日期:2026-10-23
"""
import os
+1 -1
View File
@@ -49,7 +49,7 @@
退出码:0=PASS / 1=测试失败(含常量闸不过)/ 2=环境错误。
设计依据:docs/网络/网络自愈架构设计.md §4.10、docs/测试说明/主机单测覆盖率口径.md §9
设计依据:docs/网络/网络自愈架构设计.md §4.10、docs/测试说明/单元测试/主机单测覆盖率口径.md §9
创建日期:2026-10-24
"""
import os
+1 -1
View File
@@ -28,7 +28,7 @@
设计依据:docs/算法/继电保护功能复现规划.md §3.2(全周傅氏系数表 等);
docs/算法/傅氏算法详解.md §2.3(系数口径);
docs/测试说明/测试开发标准流程.md §4.2(主机侧纯逻辑单测)。
docs/测试说明/流程与规范/测试开发标准流程.md §4.2(主机侧纯逻辑单测)。
创建日期:2026-10-10
"""
import os
+1 -1
View File
@@ -21,7 +21,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:App/cfg/prot_set_store.h 的返回码表、docs/测试说明/主机单测覆盖率口径.md §9 P1
设计依据:App/cfg/prot_set_store.h 的返回码表、docs/测试说明/单元测试/主机单测覆盖率口径.md §9 P1
创建日期:2026-10-23
"""
import os
+1 -1
View File
@@ -39,7 +39,7 @@ r"""SOE 落盘胶水层(soe_store)的主机侧纯逻辑单元测试运行器
设计依据:docs/架构设计/STM32F4-Base存储架构说明.md §10.1 第 10/11 条、
docs/算法/继电保护功能复现规划.md §3.4(SOE 记录 / 动作记录,B9)、
docs/测试说明/主机单测覆盖率口径.md §9 P2 第 2 项
docs/测试说明/单元测试/主机单测覆盖率口径.md §9 P2 第 2 项
创建日期:2026-10-24
"""
import os
+1 -1
View File
@@ -24,7 +24,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误(找不到编译器 / 编译失败 / 无汇总行)。
设计依据:docs/测试说明/系统时钟单元测试说明.md(S1-a,原复审项已闭环);
设计依据:docs/测试说明/单元测试/系统时钟单元测试说明.md(S1-a,原复审项已闭环);
创建日期:2026-10-02
"""
import os
+1 -1
View File
@@ -13,7 +13,7 @@
* 断言,见 tc_000;
* - 其余用例用 sys_clock_set(unix, NULL) 建立确定基准(无 RTC 副作用)。
*
* 覆盖点(对应 docs/测试说明/系统时钟单元测试说明.md 的 TC-CLK-xxx):
* 覆盖点(对应 docs/测试说明/单元测试/系统时钟单元测试说明.md 的 TC-CLK-xxx):
* TC-SYSCLK-000 未初始化:sys_clock_get / get_time / get_str 的无效语义
* TC-SYSCLK-001 init 正常:RTC 合法 → 返回 0,基准 = 换算 Unix 秒
* TC-SYSCLK-002 init 闰年换算:2024-02-29 / 2000-02-29(世纪闰)/ 2/29→3/1 间隔
+1 -1
View File
@@ -46,7 +46,7 @@ r"""运行/自检记录落盘后端(sys_log_mcu)的主机侧纯逻辑单元
设计依据:docs/子系统设计/运行与自检记录设计说明.md §4.4/§4.5/§5.3、
docs/架构设计/STM32F4-Base存储架构说明.md §10.1 第 10/11 条、
docs/测试说明/主机单测覆盖率口径.md §9 P2 第 2 项
docs/测试说明/单元测试/主机单测覆盖率口径.md §9 P2 第 2 项
创建日期:2026-10-24
"""
import os
+1 -1
View File
@@ -23,7 +23,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:App/util/task_prof.h、docs/测试说明/主机单测覆盖率口径.md §9 P1
设计依据:App/util/task_prof.h、docs/测试说明/单元测试/主机单测覆盖率口径.md §9 P1
创建日期:2026-10-23
"""
import os
+1 -1
View File
@@ -22,7 +22,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误(找不到编译器 / 编译失败 / 无汇总行)。
设计依据:docs/测试说明/看门狗单元测试说明.md
设计依据:docs/测试说明/单元测试/看门狗单元测试说明.md
创建日期:2026-10-01
"""
import os
+1 -1
View File
@@ -10,7 +10,7 @@
* TASK_WATCHDOG_UNIT_TEST 守卫的测试专用复位,MCU 构建零开销)
* 把模块静态态恢复到"刚上电"。
*
* 覆盖点(对应 docs/测试说明/看门狗单元测试说明.md 的 TC-WD-xxx):
* 覆盖点(对应 docs/测试说明/单元测试/看门狗单元测试说明.md 的 TC-WD-xxx):
* TC-WATCHDOG-001 未启动时 poll 不做任何判定(也不喂狗)
* TC-WATCHDOG-002 节流:< 100ms 的 poll 直接返回
* TC-WATCHDOG-003 全员到位置位 → 喂狗一次,且位图取走清零
+1 -1
View File
@@ -40,7 +40,7 @@
② 防止"某套件长期编不过而无人知"(2026-08~09 CH395F 套件实例)。
注意 RAM 溢出会自然暴露为链接错误 L6406E——这正是想要的。
设计依据:docs/测试说明/测试开发标准流程.md §3.1
设计依据:docs/测试说明/流程与规范/测试开发标准流程.md §3.1
创建日期:2026-10-01
"""