2055de0303
背景:L0.5 主机侧单测落地后复审测试架构,给出 6 条改进意见(P0~P3), 登记进 docs/待处理内容.md「测试与验证基础设施」后逐条实施。 - T-1(P0) 测试套件开关门禁:新增 scripts/check_test_suite.py + pre-commit 钩子 test-suite-switch,默认要求产品构建(全部 TEST_SUITE_* 注释),跑套件回归用 --allow-test-build / ALLOW_TEST_BUILD=1 显式放行。顺带把 test_config.h 中长期 开启的 TEST_SUITE_CH395F 改回注释(仓库此前躺着的是测试固件)。 - T-2(P1) verify_log.py 增加 --require-suite-summary:要求 "=== <名称>: N/M PASSED (failed=0) ===" 且 N>0,堵住"套件没跑到汇总行/ 断言数为 0 仍判 PASS"的盲区;run_boot_test.py 同名参数透传。不传参向后兼容。 - T-3(P1) 抽取通用 harness test/host/common/unit_test_harness.py(工具链探测/ INCLUDE-LIB 拼接/wd4819/GBK 解码/退出码契约);watchdog 运行器 170→55 行,只声明 TestBuild。 - T-4(P2) 新增 test/board/test_common.h 集中断言内核(TEST_CHECK_IMPL/TEST_REPORT_IMPL), 4 套件各用一行宏绑定自身统计变量(保持 g_xxx_stats 独立、防跨套件串数)。 刻意不 include dbg_log.h——否则冻结 DBG_TAG 默认值触发 #47-D 重定义警告。 - T-5(P2) 新增 test/run_all_suites.py 多套件回归编排,try/finally 无条件还原套件开关。 验证:@build 产品构建 0 错 0 警;4 套件逐一构建均 0/0;看门狗单测 39/39 PASS; pre-commit 14 钩子全通过;编排脚本 dry-run/开关切换/异常还原均实测通过。
178 lines
7.7 KiB
YAML
178 lines
7.7 KiB
YAML
# pre-commit 自动化代码审查配置
|
||
# 详见 docs/代码规范/pre-commit使用说明.md
|
||
default_install_hook_types: [pre-commit, commit-msg]
|
||
|
||
exclude: |
|
||
(?x)^(
|
||
\.opencode/node_modules/|
|
||
Lib/lvgl/|
|
||
simulator/|
|
||
MDK-ARM/RTE/
|
||
)
|
||
|
||
repos:
|
||
# 1) 通用钩子(官方)
|
||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||
rev: v5.0.0
|
||
hooks:
|
||
- id: trailing-whitespace
|
||
# 排除第三方库(CubeMX 重生成会带回行尾空白,避免每次重生成产生提交抖动);
|
||
# 自研代码(Drivers/BSP、Src、Inc、App 等)不受影响
|
||
exclude: |
|
||
(?x)^(
|
||
Drivers/CMSIS/|
|
||
Drivers/STM32F4xx_HAL_Driver/|
|
||
Middlewares/
|
||
)
|
||
- id: end-of-file-fixer
|
||
- id: check-added-large-files
|
||
- id: check-merge-conflict
|
||
- id: check-yaml
|
||
|
||
# 2) C 代码格式:只检查,绝不改写(编码铁律)
|
||
# Route A:暂不启用,待全库格式化基线后再放开
|
||
# - repo: https://github.com/pre-commit/mirrors-clang-format
|
||
# rev: v19.1.4
|
||
# hooks:
|
||
# - id: clang-format
|
||
# args: [--dry-run, --Werror]
|
||
|
||
# 3) commit message 格式(宽松规则,兼容中文标题)
|
||
- repo: https://github.com/jorisroovers/gitlint
|
||
rev: v0.19.1
|
||
hooks:
|
||
- id: gitlint
|
||
|
||
# 4) 本地自定义钩子(仓库级)
|
||
- repo: local
|
||
hooks:
|
||
- id: cppcheck
|
||
name: cppcheck
|
||
entry: cppcheck
|
||
# 注意:YAML 流序列中逗号是元素分隔符,含逗号/空格的参数必须加引号
|
||
args: ['--enable=warning,performance,portability,style', '--error-exitcode=1',
|
||
'--inline-suppr',
|
||
'--std=c99', '--quiet',
|
||
'--suppress=missingIncludeSystem', '--suppress=missingInclude',
|
||
'--suppress=invalidPrintfArgType_sint', '--suppress=invalidPrintfArgType_uint',
|
||
'--suppress=unusedFunction', '--suppress=unusedStructMember',
|
||
'--suppress=noExplicitConstructor', '--suppress=useStlAlgorithm',
|
||
'--suppress=constParameterPointer', '--suppress=constParameterCallback',
|
||
'--suppress=redundantAssignment',
|
||
'--suppress=normalCheckLevelMaxBranches',
|
||
'-I', 'Inc', '-I', 'App', '-I', 'Drivers/BSP',
|
||
'-I', 'Drivers/STM32F4xx_HAL_Driver/Inc', '-I', 'Drivers/CMSIS/Include',
|
||
'-I', 'Middlewares/Third_Party/FreeRTOS/Source/include']
|
||
language: system
|
||
types: [c]
|
||
# 仅扫描项目自有代码;排除第三方库与 LVGL 依赖文件
|
||
# (UI 生成文件 ui_font_cn_12/ui_menu_tab 由生成器按工程约定产出,纳入受检)
|
||
exclude: |
|
||
(?x)^(
|
||
Drivers/CMSIS/|
|
||
Drivers/STM32F4xx_HAL_Driver/|
|
||
Drivers/BSP/NET/lftpd/|
|
||
Drivers/BSP/dhara/|
|
||
Lib/|
|
||
Middlewares/|
|
||
MDK-ARM/|
|
||
test/
|
||
)
|
||
- id: no-mojibake
|
||
name: Forbid U+FFFD mojibake
|
||
entry: python scripts/check_mojibake.py
|
||
language: system
|
||
types: [c]
|
||
- id: coding-standard
|
||
name: C coding standard (规范V1.0)
|
||
entry: python scripts/check_coding_standard.py
|
||
language: system
|
||
types: [c]
|
||
# 范围与 cppcheck 钩子一致;另排除 CubeMX 生成文件(Src/、Inc/,重新生成即覆盖)、
|
||
# dhara/FatFS 接口适配层(nand_ftl,函数名由外部 API 固定)
|
||
exclude: |
|
||
(?x)^(
|
||
Drivers/CMSIS/|
|
||
Drivers/STM32F4xx_HAL_Driver/|
|
||
Drivers/BSP/NET/lftpd/|
|
||
Drivers/BSP/GD5F2GQ5UE/nand_ftl\.|
|
||
Drivers/BSP/dhara/|
|
||
Lib/|
|
||
Middlewares/|
|
||
MDK-ARM/|
|
||
test/|
|
||
Src/|
|
||
Inc/
|
||
)
|
||
|
||
# 5) 文档一致性门禁(D-7)
|
||
# 存在性:md 互链 / 反引号路径是否指向真实文件(防迁移/删除后残留死链)
|
||
- id: doc-links
|
||
name: 文档链接存在性 (D-3/D-7)
|
||
entry: python scripts/check_doc_links.py
|
||
language: system
|
||
files: \.md$
|
||
# 外部资料(芯片手册转录)链接形态不受控;第三方目录整体排除
|
||
exclude: |
|
||
(?x)^(
|
||
\.opencode/node_modules/|
|
||
Lib/lvgl/|
|
||
simulator/|
|
||
MDK-ARM/RTE/|
|
||
docs/芯片手册/
|
||
)
|
||
# 数值:README/AGENTS 任务表须与 Src/freertos.c 一致(D-2/D-7)
|
||
- id: task-table
|
||
name: FreeRTOS 任务表一致性 (D-2/D-7)
|
||
entry: python scripts/gen_task_table.py --check
|
||
language: system
|
||
files: ^(README\.md|AGENTS\.md|Src/freertos\.c)$
|
||
pass_filenames: false
|
||
# 体积:内存/Flash 数字须与最新 .map 一致(D-7 第三档)
|
||
# 只在内存文档或代码变动时触发;.map 未生成时脚本自身给出明确提示
|
||
- id: mem-numbers
|
||
name: 内存/Flash 数字一致性 (D-7 体积档)
|
||
entry: python scripts/check_mem_numbers.py --scan
|
||
language: system
|
||
files: ^(docs/内存管理/.*\.md|scripts/check_mem_numbers\.py|App/.*\.c|App/.*\.h|Src/.*\.c|Inc/.*\.h)$
|
||
pass_filenames: false
|
||
|
||
# 6) CubeMX 重生成存活审计(2026-09-29 加)
|
||
# 背景:.ioc 的 KeepUserCode 只保护 USER CODE 标记区;标记之外的手工改动
|
||
# 重生成即被覆盖,且多数不报编译错(崩溃采集被打回空 while(1)、加固宏被删)。
|
||
# 本钩子验证"重生成易失清单"各项是否仍在预期位置,并对关键区做哈希漂移检测。
|
||
# 范围:仅在这些易失文件变动时触发(改动 .ioc 或生成文件本身就值得复核)。
|
||
- id: cubemx-survival
|
||
name: CubeMX 重生成存活审计
|
||
entry: python scripts/check_cubemx_survival.py --check
|
||
language: system
|
||
files: ^(STM32F407-Demo\.ioc|Src/.*\.(c|h)|Inc/.*\.h|App/util/task_watchdog\.(c|h)|MDK-ARM/.*\.uvprojx|scripts/check_cubemx_survival\.py)$
|
||
pass_filenames: false
|
||
|
||
# 7) 看门狗判定状态机主机侧单元测试(2026-10-01 加)
|
||
# 背景:task_watchdog.c 的判定逻辑(位图取走清零 / 掩码 / miss_streak
|
||
# 累计 / 100ms 节流 / tick 回绕)是纯逻辑,板端套件无法穷举边界;本钩子
|
||
# 用 MSVC 离线编译真实源文件(#include 纳入)并用可观测桩驱动,秒级、零
|
||
# 硬件、不占 MCU RAM。仅在被测文件或其平台层 / 测试变动时触发。
|
||
# 详见 docs/测试说明/看门狗单元测试说明.md
|
||
- id: watchdog-unit-test
|
||
name: 看门狗判定状态机单测(主机侧)
|
||
entry: python test/host/watchdog/run_unit_test.py
|
||
language: system
|
||
files: ^(App/util/task_watchdog\.(c|h)|test/host/watchdog/.*|test/host/common/unit_test_harness\.py)$
|
||
pass_filenames: false
|
||
|
||
# 8) 测试套件开关门禁(2026-10-01 加)
|
||
# 背景:test_config.h 的 TEST_SUITE_* 决定固件里编入哪个测试套件,
|
||
# 全部注释 = 产品构建。但此前**无任何门禁检查**——实测已提交的 HEAD 里
|
||
# TEST_SUITE_CH395F 就是开启状态(.map 含 34 处 test 代码),即仓库里
|
||
# 躺着的是测试固件。本钩子抓这个静默漏网:默认要求产品构建,跑套件回归
|
||
# 确需提交测试构建时用 `--allow-test-build` / ALLOW_TEST_BUILD=1 显式放行。
|
||
# 详见 docs/待处理内容.md T-1
|
||
- id: test-suite-switch
|
||
name: 测试套件开关=产品构建
|
||
entry: python scripts/check_test_suite.py
|
||
language: system
|
||
files: ^test/board/test_config\.h$
|
||
pass_filenames: false
|