From 2d7c4fd40b022ab53480725c35f50c6d72d70c05 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Sat, 24 Oct 2026 07:53:40 +0800 Subject: [PATCH] =?UTF-8?q?ci(gates):=20test-coverage=20=E7=9A=84=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E9=9D=A2=E8=A1=A5=E4=B8=8A=E9=97=A8=E7=A6=81=E8=87=AA?= =?UTF-8?q?=E8=BA=AB=EF=BC=8C=E5=90=A6=E5=88=99=E6=94=B9=E5=9D=8F=20files:?= =?UTF-8?q?=20=E5=B0=B1=E6=B2=A1=E4=BA=BA=E8=B7=91=E8=BF=99=E6=A0=B9?= =?UTF-8?q?=E9=97=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一提交落地后立刻暴露这个口子:那次提交里新钩子显示 Skipped (no files to check), 因为它自己的 files: 不含 .pre-commit-config.yaml —— 也就是说,任何人改坏这一行 正则(哪怕只是打错一个字符),这根闸就永久静默停用,而提交照样全绿。这正是 本仓反对的"会静默失效的门禁",且已有先例处置:lv-conf-sync 与 bsp-err 都把 "门禁自身"写进触发面。 验证方式(不是只测绿的一半): - 改前:pre-commit run test-coverage --files .pre-commit-config.yaml → Skipped - 改后:同一命令 → 实跑并 Passed(约 45 s,28 套) 代价:以后改门禁配置要多等 45 秒——这种提交本来就是低频操作,值。 顺带修两处上一批留下的表述: - 口径 §8 的 YAML 块补同一个 files: 模式(保持与落库那份一致)。 - 该节抬头那句我上次写坏了:JS 里把续行写成独立表达式,导致"…README.md 里只挂 一行索引指向本文"这半句被丢掉,句子断在文档名上。已补全。 - 门禁说明 host-unit-tests.md 的触发面描述同步为"含门禁自身",并写明理由。 自查:doc-links --all --sections-strict 通过;改动文件 U+FFFD = 0、无 CRLF; 零代码改动故未跑 @build。未 push。 --- .pre-commit-config.yaml | 4 +++- docs/测试说明/主机单测覆盖率口径.md | 5 +++-- docs/门禁说明/host-unit-tests.md | 4 +++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 938b3de9..c7998c34 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -606,9 +606,11 @@ repos: # 是同一类坑);宁可在没装组件的机器上被挡一次、看清 [ENV] 那行提示,也不要一根假绿的闸。 # 本机与 CI runner 同一台;实测两份 VS 安装都自带该 exe(口径 §7 第 8 条已按实测更正)。 # 口径 / 分母 / 基线 / 盲区详解都在 docs/测试说明/主机单测覆盖率口径.md,本处只留接线事实。 + # 触发面**含门禁自身**(.pre-commit-config.yaml):不带自身就等于谁改坏这根闸的 files: + # 模式,它就再也不跑且无人察觉(同 lv-conf-sync / bsp-err 的既有做法)。 - id: test-coverage name: 主机单测覆盖率(增量拦截:已覆盖行只增不减) entry: python scripts/check_test_coverage.py language: system - files: ^(App/|Drivers/BSP/|test/host/|scripts/check_test_coverage\.py|scripts/test_coverage_baseline\.json) + files: ^(App/|Drivers/BSP/|test/host/|scripts/check_test_coverage\.py|scripts/test_coverage_baseline\.json|\.pre-commit-config\.yaml$) pass_filenames: false diff --git a/docs/测试说明/主机单测覆盖率口径.md b/docs/测试说明/主机单测覆盖率口径.md index 74503427..ae236eb0 100644 --- a/docs/测试说明/主机单测覆盖率口径.md +++ b/docs/测试说明/主机单测覆盖率口径.md @@ -192,7 +192,8 @@ 不会假报回退(首版会,已修:并集口径下子集必然变小,所以 `--module` 子集跑跳过全部回退判定)。 真实事件(某次改动真把覆盖行弄少了)仍待观察。 -落库的就是下面这份(`.pre-commit-config.yaml` 第 8 节,与文件里逐字一致,只多不少);`docs/门禁说明/README.md` +落库的就是下面这份(`.pre-commit-config.yaml` 第 8 节);`docs/门禁说明/README.md` 里只挂一行索引指向 +本文,同一事实不在两处维护: ```yaml - repo: local @@ -201,7 +202,7 @@ name: 主机单测覆盖率(增量拦截:已覆盖行只增不减) entry: python scripts/check_test_coverage.py language: system - files: '^(App/|Drivers/BSP/|test/host/|scripts/check_test_coverage\.py|scripts/test_coverage_baseline\.json)' + files: '^(App/|Drivers/BSP/|test/host/|scripts/check_test_coverage\.py|scripts/test_coverage_baseline\.json|\.pre-commit-config\.yaml$)' pass_filenames: false ``` diff --git a/docs/门禁说明/host-unit-tests.md b/docs/门禁说明/host-unit-tests.md index 5ec0d4e5..c0da9e2c 100644 --- a/docs/门禁说明/host-unit-tests.md +++ b/docs/门禁说明/host-unit-tests.md @@ -84,7 +84,9 @@ 4. **专属钩子不是唯一防线**(2026-10-24 更正,原写"没有对应钩子的模块 = 零回归",如今不成立):上表 16 个模块各有专属钩子;仓库另有 12 套(P1 新增)没有专属钩子,改坏了由 `test-coverage` **总闸**兜 住——它跑全部 28 套,并守"已覆盖行只增不减"。总闸的触发面是 `App/`、`Drivers/BSP/`、 - `test/host/`、覆盖率脚本与基线;纯文档改动不触发它(那时确实没有可回归的行为)。 + `test/host/`、覆盖率脚本与基线,**外加门禁自身**(`.pre-commit-config.yaml`)——不带上自身 + 就等于谁改坏这根闸的 `files:` 模式,它就再也不跑(同 `lv-conf-sync`/`bsp-err` 的既有做法)。 + 纯 UI/文档改动不触发它,那时确实没有可回归的行为。 5. 时序与并发不在范围:中断抢占、DMA 完成回调、临界区、真机 tick 抖动都照不到(历史上最贵的 几个坑正是这类,见 `docs/问题记录/*_Trap_Records.md`)。 6. 断言写的是"作者当时想到的分支":**行 / 函数覆盖有度量了**(`test-coverage` 总闸出