test-pruning 是 unifi-mcp 项目中的一个测试精简技能。它的目标是在不丢失任何检查的前提下,让测试套件更小,即删除、合并或整合冗余测试。
用途
当被要求裁剪、精简、缩小或去重测试套件,或把重复测试折叠(fold)为参数化测试时使用该技能。允许删除测试的标准写在 AGENTS.md 的 Test Assertions 一节;该技能说明如何在大规模上应用这一标准。脚本位于 scripts/ 目录。
主要风险
覆盖率看不到被削弱的测试:一个测试仍然运行相同代码,但即使结果出错也会通过。首次精简时,分支覆盖率保持零损失,但审查发现了九个被削弱的测试。因此下文每个门禁都旨在捕捉覆盖率遗漏的问题。
使用流程
-
基线:对将要改动的每个套件,在基于提交的未改动工作树上运行 scripts/cov_ctx.sh <worktree> <suite> <out>.coverage。套件包括 core、shared、relay、network、protect、access、api。脚本记录每个测试的分支覆盖率,并先取消设置 UNIFI_* 环境变量,因为导出的设置会改变收集哪些测试。完成标准:每个将改动的套件都有一个基线文件 base.<suite>.coverage,放在同一目录;其他套件的基线也保留在该目录,供第 2 步判断归属。
-
候选:运行 python3 scripts/candidates.py <suite> <baseline-dir> <worktree> <out>.json [exclude.txt],列出覆盖率已被其他测试提供的测试函数,以及与之重叠最多的保留测试。它保留套件自身包内的所有弧,以及其他包中拥有套件未覆盖的弧,与 CI 的覆盖率度量方式一致。安全、脱敏、漂移、对称、契约、基准和事件证据类测试永不作为候选。候选只是线索:在应用套件中,许多管理器现在位于 unifi_core,而 core 套件常运行这些代码却不断言,因此应用测试可能是唯一真实检查;预计要保留大多数应用套件候选,折叠复制粘贴的测试比删除更省。完成标准:每个套件都有候选文件。
-
审查每个候选:打开候选及其重叠的保留测试,依据断言决定。仅在 AGENTS.md 标准下删除:保留测试对相同输入断言相同内容,并记录该保留测试及其确切断言。将主体相同的测试折叠为一个参数化测试,保留每个原始测试的输入与断言;若折叠时替换为更简单的数据(三个产品换成一个、两个值换成一个),则视为削弱测试。其余全部保留,并写一行理由。编写台账:每个被删除或折叠的测试一行,写明覆盖它的保留测试与断言。scripts/foldsummary.py <ledger.md>... 可将台账转为 PR 规模的摘要。完成标准:每个候选都有一行,每个删除都指明确切对应项。
-
PR 前门禁:在完成的分支上运行以下全部检查,每项捕捉不同种类的削弱测试。覆盖率:在分支上运行 scripts/cov_ctx.sh,再运行 python3 scripts/arcdiff.py <suite> <baseline-dir> <after>.coverage,必须报告没有必需的弧丢失。少数弧是非确定性到达的(unifi_api/services/managers.py 第 2045 行附近的循环,以及 unifi_core/network/managers 中由 test_server_cleanup.py 连接竞争到达的连接和事件管理器弧)。只有在未改动基线上重跑并丢失相同弧后,才可视为不稳定。削弱扫描:python3 scripts/weakscan.py <repo> <base-ref> <branch> 标记对返回集合的循环且无长度检查,以及期望值与被测输入共享对象的情况;修复或说明每个发现。独立审查:只把差异、台账和扫描输出交给未做改动的审查者,要求其比较每个被删除或折叠测试的断言与替代物,并指出任何被丢弃的断言或更弱的替代(空数据、不同输入、更宽泛的端到端测试);这是唯一能发现折叠内部丢弃断言或折叠改变输入的检查。变异差异(可选,用于高风险代码中的删除):python3 scripts/mutdiff.py <clean-worktree> <source-file> <function>[,...] <test-file> <base-ref> <branch> 报告原测试能捕获而改动后测试放过的缺陷;每个变异体一次 pytest 运行,因此只针对最不确定的删除所涉函数。完成标准:覆盖率报告无无法解释的损失,每个扫描发现已修复或说明,审查者发现已解决。
-
PR:每个套件组一个 PR,附台账摘要、前后收集用例数、净行数和覆盖率结果,然后在合并前处理 Copilot 审查中的每个有效意见。
适用场景与限制
适用于 unifi-mcp 项目的测试套件维护;依赖仓库内的脚本与 AGENTS.md 标准。资料未提供安装命令、外部依赖、平台要求或收费信息,暂未提供。