✅ 完善测试设计规范并清理低价值用例#1628
Conversation
|
的確很多廢話,維護也不容易 |
|
先轉draft 吧 |
PR #1628 对 Agent 测试行为影响:两份独立评估的整合报告一、综合结论两份独立报告虽然采用了不同的 Agent 角色、评分维度和权重,但对核心事实的判断高度一致:
二、评估范围、方法与限制2.1 评估对象评估比较了:
2.2 评估方法两份报告都采用了文档驱动的静态行为模拟,即:
这不是实际运行多个外部模型完成 repository task,也不是实测 multi-agent benchmark。当前环境虽然能够读取 PR、branch 文档与 review 记录,但不能完整 checkout/clone repository、安装依赖、启动多个 LLM runtime 并执行完整测试套件。因此,所有分数都是结构化静态模拟结果,不等同于真实 contributor workflow 或模型运行数据。 2.3 第一套 Persona:任务行为导向
2.4 第二套 Persona:规范治理导向
两组角色存在部分对应关系,但并不完全相同。Literal Agent 与 Checklist Agent 都能暴露机械执行风险;Coverage、Minimal-change 与 Contextual Agent 更关注案例和边界选择;Refactor Agent 与 Scope Guardian 共同检验 scope;CI-fix 与 Cleanup Agent检验失败分类和清理安全性;Reviewer Agent 与 Evidence Auditor检验价值判断和证据质量。 2.5 第一套模拟任务第一份报告固定了以下十类任务:
2.6 两套评分口径评分体系 A:Agent 行为质量
评分体系 B:规范与治理质量
两套评分不能直接相加或平均。 三、PR #1628 Branch 的模拟结果3.1 Literal Agent 与 Checklist Agent:遵循更完整,但容易过度展开PR 要求 Agent 在编写 assertion 前明确表达:
如果无法指出一个测试能够阻止哪一种错误实现,文档会提示该测试可能只是在验证 implementation detail 或 tautology。 因此,Literal Agent 大概率会:
但从 Checklist Agent 视角看,典型输出可能演变为:
文档先要求四元素,又列出六类 behavior space,再加入约六步 cleanup 流程和七项 checklist。对逐字执行型 Agent,这会带来以下行为:
容易被过度分析的例子包括:
3.2 Contextual、Coverage 与 Minimal-change Agent:案例和边界选择明显改善PR 为 Agent 提供了一组统一决策词汇:
这使 Contextual Agent 能先排除不适用的风险维度,而不是机械增加测试。例如,文档明确说明:
典型决策可以是:
这类决策比 main 更容易解释和审查。 对 Coverage Agent,PR 能明显抑制“每个函数都加 test”或“保留所有现有 test”的倾向。文档列出的 no-value test 包括:
这能够减少:
对 Minimal-change Agent,PR 给出了 pure unit、focused component、service/repository、integration/E2E 和 manual verification 的适用条件,推动 Agent 选择“最窄但仍能观察真实 contract”的边界。这可以避免:
3.3 Async、State 与 Concurrency:补足 Agent 最容易漏掉的空间PR 明确要求在适用时考虑:
这些正是 Agent 容易只写 happy path 而漏掉的部分。PR 因此在 async cancellation、stale-result overwrite、重复调用、生命周期和并发语义上明显优于 main。 但这些维度只有在 contract 确实涉及 state、async、security、threshold 或并发时才应展开。当前文档缺少足够前置的 applicability gate,导致 Literal/Checklist Agent 可能把所有维度都视为默认必做项。 3.4 Scope Guardian 与 Refactor Agent:清理判断更安全,但 scope 边界更模糊
PR 对 testing cleanup 又增加了逐项确认程序:
这使 Refactor Agent 更难仅凭“整体看起来重复”批量删除测试,也降低以下不可靠 heuristic 的影响:
但是,testing guide 同时要求“发现 no-value tests 时清理”,由此产生两种都合理但相反的解读:
即使后文要求先读 production path、搜索 coverage、识别 mutation 再删除,也仍未回答“是否允许超出原 task scope”。 PR 自身又同时修改:
PR description 也把“清理低价值用例”列为主要改动,但没有关联 issue,且未完成人工 review。这让 reviewer 很难区分:
因此,PR 对 cleanup 判断质量有提升,但对 Scope Guardian 来说,scope 稳定性反而下降;PR 所倡导的 scope discipline 与 PR 自身的广度形成张力。 3.5 Cleanup Agent 与 CI-fix Agent:失败分类和 replacement-first 明显增强PR 将 failing/slow test 区分为:
这比把所有 failure 都视为同一问题更安全,也比单一的“fix code, not tests”更成熟。预期行为包括:
其中最强的规则之一是:
典型处理为:
这是一条 evidence-based cleanup 路径,能够避免 migration 期间出现临时失去保护的窗口,而不是仅凭测试形式直接删除。 3.6 Reviewer Agent 与 Evidence Auditor:价值判断和证据质量显著提高PR 不仅列出应删除的测试,也列出看起来很薄但应保留的测试:
因此 Reviewer Agent 不再容易仅凭测试行数、mock 数量或 assertion 数量判断价值。 PR 同时要求:
因此,Agent 较少提交:
而更可能提交:
这种证据不仅说明“执行过什么”,还说明“为什么这个测试有价值”。它把决策证据和执行证据结合起来。 3.7 BDD Title 语言规则main 强制 BDD title 使用中文。PR 改为中文或英文均可,但仍要求标题描述真实 trigger 和 observable outcome。 对英文优先的 coding agents,这可以降低:
四、Main Branch 的模拟结果4.1 Main 已有的基础规则main 并非没有测试纪律。它已经包含:
问题在于,这些规则更多是分类和提醒,而不是集中、完整、可执行的决策程序。 4.2 Literal Agent 与 Checklist Agent:负担较低,但缺少回归推理框架main 的 testing guide 约 120 行,主要涵盖执行机制、TDD exceptions、低价值测试类型和 performance hygiene。 它没有提供:
因此 Literal/Checklist Agent 通常只会做到:
其优点是不会生成庞大 checklist,认知负担和 ceremony 更低;缺点是容易漏掉真正重要的 regression reasoning。同一任务也可能因 Agent 对 observable behavior 的理解不同而产生不同测试。 4.3 Contextual 与 Coverage Agent:强 Agent 尚可,平均方差较大main 已有 no-value test 清单,因此 Coverage Agent 不会完全失控,也能识别 pure pass-through render 通常价值较低。但 main 没有完整要求:
也缺乏明确的 equivalence-class 规则,所以 Agent 仍可能:
强 Contextual Agent 仍能凭经验推导出合理测试,但平均 Agent 会因模型偏好、上下文长度和保守程度不同产生更大行为差异。 4.4 Minimal-change Agent:测试边界更依赖个人偏好main 没有完整解释 test boundary 的选择方法,因此 Minimal-change Agent 更可能:
4.5 Scope Guardian 与 Refactor Agent:scope 更稳定,cleanup 更保守main 较少出现新 testing guide 与主规范竞争的问题。Scope Guardian 通常会直接依据
testing guide 虽然也提到遇到低价值测试应清理,但只简短要求删除前逐一对照 source,没有 PR branch 那套大型 cleanup procedure。 因此,main 的行为更保守、一致,scope 稳定性较好;但也可能留下本次修改范围内已经明显无价值的测试。Refactor Agent 和 Reviewer Agent 对“covered elsewhere”也可能采用较弱证据标准。 4.6 Cleanup Agent 与 CI-fix Agent:能识别问题,但安全流程不足main 能识别:
但失败分类不够集中,Agent 仍需自行判断是:
因此,不同 Agent 的处理差异更大。 main 还缺少完整的 replacement-first 证据链,可能产生:
而 PR branch 会要求:
这是两个 branch 最实质的行为差异之一。 4.7 Reviewer Agent 与 Evidence Auditor:执行证据尚可,决策证据偏弱main 已要求:
因此,main 并非完全没有 evidence discipline。 但其 evidence 规则分散,没有集中成 author/reviewer checklist,也没有明确要求:
所以 main 的执行证据尚可,但决策证据较弱,Reviewer 更可能发生 false positive deletion。 五、评分结果与口径解释5.1 评分体系 A:Agent 行为质量加权评分评分范围为 1–10,加权总分以 10 分为满分。
该体系的结论是:PR 在所有主要测试行为指标上均领先,仅在文档简洁和认知负担上退步。由于认知负担仅占 5%,PR 的能力收益显著高于代价。 5.2 评分体系 A:Persona 一致性矩阵
5.3 评分体系 B:Branch 层级治理评分评分范围为 1–5,5 分较佳。
该体系更重视文档治理与 scope 稳定性,因此 PR 在决策质量上的提升被长度、认知负担、review 成本和 scope 模糊性抵消。 5.4 评分体系 B:各 Agent 表现矩阵
5.5 两套评分的综合解释两套结果应同时保留:
六、PR #1628 做得好的地方6.1 从“有测试”转向“测试能阻止哪个回归”这是两份报告共同认为最有价值的改动。 Contract、Trigger、Outcome、Regression 四元素迫使 Agent 解释测试实际保护的行为,而不是依赖 coverage 或测试数量。每一步都可以在生成代码前审查。 6.2 引入等价类和 outcome-changing branchPR 明确要求按 distinct equivalence classes 和 branches 选择案例,而不是无限枚举输入:
这对抑制 Coverage Agent 的低价值 edge case 膨胀尤其有效。 6.3 补足 failure、async、state 和 concurrencyPR 将 repeated calls、idempotency、cleanup、unsubscribe/dispose、stale overwrite、out-of-order completion、overlapping operations、deduplication 和 exactly-once effect 纳入适用性判断,补足 Agent 容易漏掉的非 happy-path 风险。 6.4 明确区分错误测试、无价值测试和错误机制PR 不把所有 failing tests 当作 production bug,也不把所有简单测试当作垃圾,而是区分:
这比“一律修 production”或“看起来低价值就删除”更安全。 6.5 把删除测试变成证据导向的 reviewPR 要求:
这显著降低批量误删和基于外观判断测试价值的风险。 6.6 选择更合适的 enforcement mechanism对 mechanical source constraint,PR 要求先用 lint 或 structural guard 取代 source-text assertion,再移除 Vitest test。 该顺序具体、可执行,并保证迁移过程中不会出现保护空窗。 6.7 为人工 reviewer 与 Agent 建立共同词汇Reviewer 可以直接询问:
这可以降低 review 对个人经验和隐性判断的依赖。 6.8 中英文 BDD Title 更适合多 Agent 生态允许中文或英文,但仍要求真实 trigger 和 observable outcome,有助于英文优先 Agent 写出自然、准确、与 test body 一致的标题。 七、PR #1628 的问题与风险7.1 文档长度和指令密度增长过大核心 testing guide 从约 120 行增至约 270 行,增加约 125%。 新增内容并非无价值,但以下内容全部放在同一文件和同一加载层:
这使一次普通测试修改也可能需要消化整份规范。 对以下 Agent 或工具尤其不利:
它们可能只读到部分规则,或在上下文截断后丢失关键约束。 7.2 规范意图反对机械枚举,但规范形状鼓励机械枚举文档说不要机械枚举 inputs,随后却列出:
再附四元素、cleanup 流程和七项 checklist。 对 Literal/Checklist Agent 来说,最安全的行为仍是全部逐项处理并标记 N/A。规范意图与规范形状不一致。 7.3 缺少 Applicability Gate文档前部缺少一个非常短的入口,例如:
没有这个入口,Agent 容易把所有风险类别当作 mandatory,而不是候选检查维度。 7.4 部分核心术语仍有解释空间虽然 PR 比 main 清楚得多,但以下概念仍需 Agent 自行判断:
不同模型仍可能:
7.5 Scope cleanup 与主规范存在未解决冲突需要明确回答:
这是最需要优先解决的规范问题。 7.6 Decision Model 仍是散文,不是真正的决策表文档实际上已经包含一棵很有用的 decision tree:
但这些规则散布在多个段落中,Agent 必须依赖长上下文自行拼装,无法快速扫描。 7.7 正反例偏向测试形式,缺少 scope 灰区例子PR 对 pass-through、mock、threshold 和 empty array 的例子较好,但缺少以下争议场景:
7.8 Checklist 容易产生无证据的声明式合规Agent 可能逐项声称完成,却不提供可核实证据,例如:
问题不是 checklist 本身,而是模型容易把 checklist 当作文案模板。 7.9 PR 自身范围削弱了规范可信度PR 同时涉及 policy、文档索引、BDD 语言、ESLint、structural test 和多个 component/page test。其自身范围较广,使 reviewer 难以独立验证每类变更,也容易产生“用 policy 合理化 cleanup”或“用 cleanup 结果反向证明 policy”的循环论证。 7.10 PR 仍是 Draft,且尚未完成人工 ReviewPR metadata 显示当前仍是 draft,“Code reviewed by human”未勾选,PR 描述也明确说明尚未人工审查。 现有人工 review 信号与静态模拟的风险判断一致:reviewer 认为内容“很多废话,维护也不容易”,要求先转为 draft,并表示需要慢慢阅读。 因此,静态 simulation 表现较好,不代表所有规则已经经过真实 contributor workflow 验证。 八、改进建议8.1 建立三层信息架构将内容分为:
这可以保留内容质量,同时降低上下文和认知负担。 8.2 在最前面增加 Applicability Gate先判断本次 contract 是否涉及:
只有适用时才展开对应检查,不要求逐项 N/A。 8.3 将散文转成正式 Decision Table至少覆盖:
8.4 明确 Scope Cleanup 的优先级和边界应写明:
8.5 分离 Author Checklist 与 Reviewer ChecklistAuthor 需要执行步骤,例如 reproduction、选 boundary、运行命令、记录结果。 Reviewer 需要证据问题,例如 regression、mutation、existing coverage、replacement guard、scope justification。 强行共用会让 checklist 过长,也容易变成机械文本模板。 8.6 增加概念与 Scope 的正反例应覆盖:
8.7 要求短证据,而不是 Checklist Declaration每个重要判断可以要求极短、可核验的字段:
这比单纯勾选 checklist 更能减少虚假 compliance。 8.8 降低 Always-loaded Instruction 总量把高频、不可违反的规则放在主层;低频、复杂、教学性内容按需检索,避免小模型、retrieval Agent 和 prompt-budget 工具只加载到半套规则。 8.9 将 Policy Change 与 Repository Cleanup 分开验证即使仍在同一 PR,也应建立独立 evidence grouping:
避免用 policy 为 cleanup 自动背书,也避免用 cleanup 结果反向证明 policy。 8.10 建立可重复的 Agent Evaluation Fixture把这次 simulation 固化为固定 prompts 和任务集,定期对不同模型、Agent framework 和 context budget 执行,观察:
8.11 进行真实 Multi-agent Runtime Benchmark正式 benchmark 应固定:
应记录:
这能验证静态模拟中的收益是否能在真实 coding throughput、review 成本和错误率上成立。 九、最终判断PR #1628 对 Agent 行为构成实质改善,方向上应予支持,但当前版本不宜仅以“内容更完整”为理由原样接受。 其最强部分是:
其主要代价是:
综合两份报告,最准确的结论不是“PR 内容错误”,也不是“PR 已经成熟”,而是:
建议保留其核心思想,并在合并前完成以下关键重构:
完成这些调整后,PR 才能同时获得两套评估所关注的优势:既提高 Agent 测试决策质量,又保持 scope 稳定、人工可审查和长期可维护。 |
基于对 PR #1628 的两份独立静态模拟评估,测试指南在提升 Agent 测试决策质量 的同时增加了执行成本与误解风险:文档从散文转为可扫描的决策表并前置 applicability gate(避免逐项机械 N/A);明确 test cleanup 与 AGENTS.md scope discipline 的优先级边界(touched file/behavior 内清理,相邻/仓库级 问题只记录不动手);author/reviewer checklist 拆分为可核验的短证据字段; 补充 observable contract vs implementation detail 等灰区判断示例。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
根据评估评论中两份独立静态模拟报告(Agent 行为质量 8.50 vs 5.35;治理/scope 稳定性 33 vs 33)指出的具体问题,在 2984f21 中做了一轮针对性重构,只改了 采纳的建议
未采纳 / 留待后续
净效果:核心文件从 268 行增至 317 行(约 +18%,而非此前 +125%),但改为表格后单位信息密度更高;两个被其他文档引用的锚点 |
ScriptCat PR #1628:Agent 文档解读差异 Simulation Verification一、结论摘要三个版本的总体结果:
核心判断:
本报告属于结构化静态模拟:固定 Agent persona、任务场景和评分标准,根据各 commit 的文档及代码差异推演行为。它不是多个外部 LLM 实际执行完整 repository task 的实测 benchmark。 二、Simulation 使用的 Agent 行为
这些 Agent 不代表具体模型,而是用于放大文档可能产生的不同行为。 三、固定 Simulation 场景每个 commit 使用相同场景:
正确行为并不等于测试越多,而是:
四、逐 Commit Simulation4.1
|
| Agent | 模拟结果 |
|---|---|
| Literal Agent | 能识别明显 tautology 和 pass-through test,但遇到边界选择时会停留在保守方案 |
| Contextual Agent | 有经验时表现良好;弱模型容易只写 happy path |
| Coverage Agent | 受到 no-value 清单约束,但仍可能通过增加普通样本提升 coverage |
| Scope Guardian | 会遵守 AGENTS scope,但无法准确判断哪些 cleanup 与 changed behavior 直接相关 |
| Cleanup Agent | “发现就清理”与 scope discipline 之间存在解释空间 |
| CI Stabilizer | 性能章节能阻止全局提高 timeout,但失败分类不够结构化 |
| Evidence Reviewer | 能检查命令是否运行,但缺少 regression/equivalence/boundary 的标准证据格式 |
模拟稳定度:约 6/10 场景能得到一致结论。
主要优势是低认知负担;主要问题是 Agent 行为方差较大。
4.2 95ab492:第一版 PR
该版本首次建立完整测试决策模型:
- Contract
- Trigger
- Outcome
- Regression
并要求选择最窄但能够观察真实 contract 的测试边界。
它还明确了 normal、boundary、invalid/failure、state transition、ordering/concurrency 和 compatibility/security,并要求按不同结果和等价类选择案例。
此外,它增加了测试失败分类、安全清理步骤和作者/审查 checklist。
Persona 行为预测
| Agent | 模拟结果 |
|---|---|
| Literal Agent | 会逐项列出四元素、六类行为空间、清理流程和 checklist |
| Contextual Agent | 测试边界和案例选择大幅改善 |
| Coverage Agent | 能区分 branch 和普通 sample,明显减少无意义测试 |
| Scope Guardian | 遇到 testing guide 的“清理 no-value test”和 AGENTS 的“不要扩大 scope”时可能选择不一致 |
| Cleanup Agent | 容易将发现的无价值测试扩大为跨文件清理 |
| CI Stabilizer | 能区分 production regression、wrong contract、flake 和 misclassified integration |
| Evidence Reviewer | 有明确 checklist,但作者执行步骤与 reviewer 验证职责混在同一清单中 |
主要行为偏差
最典型的 Literal Agent 输出可能变成:
先填写四元素,再逐项检查 normal、boundary、invalid、state、ordering、concurrency、compatibility、安全、mock、fixture、cleanup,最后对 checklist 每项填写 N/A。
对于简单 mapping 或单一 accessibility derivation,这种行为成本明显过高。
更严重的是 scope 冲突:基线 AGENTS.md 要求不要动无关文件,而第一版 testing guide 又积极要求清理发现的 no-value test,但没有明确 touched file、changed behavior 和 repository-wide cleanup 的边界。
模拟稳定度:约 8/10 场景能得到高质量结论,但有 2 个主要风险:机械过度执行和 scope 扩张。
4.3 2984f21:最终版本
最终版本在文档最前面加入 applicability gate,明确只有 changed contract 实际涉及某类风险时才进入对应章节;不适用项应直接跳过,不应在 PR 中机械标记 N/A。
测试边界和行为空间改为可扫描的决策表,并进一步强调 distinct branch,而不是按样本数量补测试。
最重要的修复是新增明确的 scope & cleanup boundary:
- 当前任务已经修改的文件或行为中的无价值测试:可以清理;
- 不相关文件中的问题:记录,但不在本 PR 删除;
- repository-wide pattern:单独建 issue/PR;
- 替代当前被删除测试的 lint guard:属于当前 scope。
同一优先级也被补回 AGENTS.md,明确测试清理不构成 scope discipline 的例外。
作者和 reviewer checklist 也被拆分:作者提供 regression、distinct branch、boundary、existing coverage、replacement guard 和实际命令;reviewer 核验这些证据,而不是重新执行同一套作者流程。
Persona 行为预测
| Agent | 模拟结果 |
|---|---|
| Literal Agent | applicability gate 阻止对不适用类别逐项展开 |
| Contextual Agent | 可以快速从 changed contract 路由到相关决策表 |
| Coverage Agent | 同时受到 equivalence class 和 applicability gate 双重约束 |
| Scope Guardian | 能区分当前行为内 cleanup 与无关发现 |
| Cleanup Agent | 不再有理由进行 repository-wide 顺手清理 |
| CI Stabilizer | 可以快速依据失败分类表选择修复方向 |
| Evidence Reviewer | 能要求具体字段,并区分作者证据和 reviewer 核验 |
模拟稳定度:约 9/10 以上场景能产生一致、适度且可审查的决策。
剩余偏差主要来自 enforcement 完整性和 checklist 对极小变更仍可能偏重,而不是核心决策模型。
五、Agent 行为比较矩阵
| Agent | c7543bb |
95ab492 |
2984f21 |
|---|---|---|---|
| Literal / Checklist | 容易漏掉隐含风险 | 容易把所有风险类别全部执行 | 能先通过 applicability gate 排除不适用项 |
| Contextual Contract | 高度依赖模型经验 | 有明确四元素和 boundary 规则 | 同样准确,但搜索成本更低 |
| Coverage Maximizer | 仍可能用样本数换 coverage | 能识别等价类,但可能机械覆盖六类风险 | 只覆盖实际适用的 distinct branch |
| Scope Guardian | 原则明确,测试 cleanup 细节不足 | scope 与 cleanup 指令冲突 | touched behavior、无关发现和全仓清理边界明确 |
| Cleanup / Refactor | 行为方差较大 | 容易扩大为 cleanup PR | 会记录 out-of-scope finding 而不直接修改 |
| CI Stabilizer | 有性能建议,失败分类较弱 | 能正确分类失败原因 | 同等能力,且表格更容易执行 |
| Evidence Reviewer | 缺少统一 evidence schema | checklist 完整但角色混合 | 作者证据与 reviewer 核验分离 |
六、Score Matrix
评分范围为 1–5;5 表示文档更可能稳定地产生正确、适度、可审查的 Agent 行为。总分按权重换算为 100 分。分数是结构化模拟结果,不是实测准确率。
| 评分项 | 权重 | c7543bb |
95ab492 |
2984f21 |
|---|---|---|---|---|
| 测试意图与 regression 清晰度 | 12% | 2.8 | 4.7 | 4.7 |
| 测试边界选择 | 10% | 2.7 | 4.5 | 4.8 |
| 等价类与案例选择 | 12% | 3.0 | 4.6 | 4.8 |
| Failure / async / concurrency 决策 | 8% | 3.1 | 4.5 | 4.6 |
| 低价值测试识别 | 10% | 3.8 | 4.7 | 4.8 |
| 测试清理安全性 | 10% | 3.2 | 4.2 | 4.8 |
| Scope 稳定性与优先级 | 12% | 3.8 | 2.7 | 4.9 |
| 抵抗机械合规与过度测试 | 10% | 4.4 | 2.6 | 4.2 |
| Review evidence 质量 | 8% | 2.6 | 4.0 | 4.8 |
| 可扫描性与信息密度 | 5% | 4.4 | 2.8 | 4.0 |
| Enforcement mechanism 合理性 | 3% | 3.0 | 4.0 | 4.0 |
| 加权总分 | 100% | 66.6 | 79.6 | 93.2 |
分数变化解释
95ab492 相比基线的主要增益:
- contract 和 regression 定义;
- boundary selection;
- equivalence class;
- failure classification;
- evidence-based review。
主要扣分:
- scope precedence 不明确;
- 文档中的多个层级都容易被 Literal Agent 解释成强制 checklist;
- 信息从运行指南扩展为完整测试治理规范,但缺少入口过滤。
2984f21 的主要增益:
- applicability gate;
- 规则改为决策表;
- scope & cleanup boundary;
- gray-area 判断;
- author/reviewer 职责分离。
七、PR #1628 做得好的地方
7.1 将抽象理念转化为 Agent 可执行的决策模型
“写有意义的测试”本身对 Agent 约束很弱。PR 将它拆成 contract、trigger、outcome、regression、boundary 和 equivalence class,使测试选择可以被解释和 review,而不只依赖模型偏好。
这是 score matrix 中提升最大的部分。
7.2 最终版本正确处理了 Agent 的机械执行倾向
Applicability gate 明确告诉 Agent:
- 不是所有风险类别都适用;
- 不适用时直接跳过;
- 不要制造 N/A ceremony。
这比仅仅写“不要过度测试”更容易被 Literal Agent 正确执行。
7.3 最终版本解决了测试清理与 scope 的冲突
这是 95ab492 最大的问题,也是 2984f21 最有价值的修复。最终规则把 cleanup 限制在当前 touched file 或 changed behavior 内,并要求将仓库级问题拆分处理。
7.4 代码变更基本体现了文档所倡导的规则
旧的 Vitest 测试通过读取 tests/vitest.setup.ts 源码并搜索字符串来限制 import;PR 删除该测试,并改用针对目标文件的 no-restricted-imports。机制方向比 source grep 更合适。
Setting 和 Tools 页面测试维护了大量 store、service、filesystem 和 section mock,最终仅检查导航按钮数量。删除它们能够减少高维护成本、低回归检测能力的测试。
NameAvatar 原测试只比较同一函数对同一输入的两次结果;新测试使用能够产生负 hash 的 seed,明确保护双重取模的负索引修正。生产代码确实包含这一边界。
Git staged snapshot 测试也删除了被首个场景隐含覆盖的重复案例,并把空格和非 ASCII 路径合并成一个同时能够拒绝两类入口守卫退化的 regression case。
7.5 验证状态总体健康
当前 head 对应的 GitHub Actions test workflow 已成功。
八、PR #1628 不足或仍需重点 Review 的地方
8.1 同一个 PR 同时承担规范重构和实际测试清理
PR 同时修改测试治理文档、ESLint 配置,并删除或重写多组测试,共涉及 13 个文件、304 行新增和 248 行删除。
好处是能够用实际代码验证规范;坏处是 reviewer 必须同时回答两个不同问题:
- 测试规范本身是否合理;
- 每个被删除或修改的测试是否真的无价值。
这提高了 review 负担,也容易让“规范正确”替代对每个测试删除决定的独立核验。
8.2 最终文档仍然较重
表格和 applicability gate 大幅提高了可扫描性,但最终版本仍包含:
- 决策入口;
- 四元素;
- boundary table;
- behavior-space table;
- no-value 类型;
- gray-area calls;
- cleanup boundary;
- failure classification;
- author/reviewer checklist;
- 运行与性能规范。
强模型会正确按需读取;弱 Literal Agent 仍可能把 author checklist 当成每个极小变更都必须填写的完整表单。
8.3 ESLint 替代机制自身缺少回归保护
文档明确说明:
tests/vitest.setup.ts的文件级no-restricted-imports会替代该文件的全局同名规则;- 因此该文件同时失去 sonner/radix import 限制;
- 当前 ESLint harness 并没有覆盖这个 file-scoped rule。
这意味着 PR 把错误 enforcement mechanism 替换成了更合适的机制,但新的机制本身没有机械验证。
此外,该规则是已知重型入口的 denylist,而不是对“global setup 必须保持轻量”的完整证明。新的重型入口或不同 alias 可能绕过规则。
8.4 部分“更有意义”的测试仍可能与实现细节耦合
EmptyState 新测试不再只验证标题和说明存在,而是断言 gap-3、size-10、font-medium 等 utility class。
这些断言确实覆盖 compact/non-compact 分支,但它们保护的是具体视觉实现,而不是更稳定的语义接口。未来合法的设计调整可能要求同步修改测试,即使用户层 contract 没有发生重要变化。
这不是明确错误,但应由 reviewer 判断这些 class mapping 是否被项目视为稳定设计 contract。
8.5 Pass-through wrapper 的判断仍需逐项确认
被删除的 AgentEmptyState 测试主要验证下层 StateScreen 的 role 和传入文本,确实没有测试 wrapper 本身固定设置的 tone="primary"、variant="card"、compact 等映射。
因此删除原测试是合理的,但不能简单推导为“所有 wrapper test 都无价值”。若这些固定映射属于稳定 UI contract,应改为保护 mapping;若不是,则完全删除更合适。
最终文档中的 gray-area table 已经降低了这种误删风险,但实际 review 仍不可省略。
8.6 PR 描述尚未完整反映第二个 commit 的治理改进
PR 描述仍重点介绍第一版的测试设计和清理内容,没有充分突出最终 head 新增的:
- applicability gate;
- scope & cleanup precedence;
- gray-area decisions;
- author/reviewer checklist split。
因此 reviewer 仅阅读 PR 描述时,可能无法快速理解 2984f21 为什么显著优于 95ab492。
8.7 当前尚未完成人工审查
截至当前状态,PR 仍为 open draft,描述中也明确标记尚未经过人工 review。
CI 成功只能证明代码和测试通过,不能替代对删除测试价值、文档优先级和长期维护成本的人工判断。
九、改善方向
以下仅给出方向,不给出实际修改。
9.1 建立两层文档结构
将测试规范分成:
- Agent 每次任务都需要看到的最小决策入口;
- 只有命中某类风险时才读取的详细 reference。
最终版本已有 applicability gate,但仍可进一步明确“最低必读规则”和“按需深入规则”。
9.2 按风险等级调整 evidence 成本
简单同步 mapping、已确认的单一 regression、跨进程/浏览器行为,不应承担完全相同的 author evidence 负担。
方向上可以区分 low、medium、high-risk change,避免 checklist 再次演变为 ceremony。
9.3 为文件级 ESLint 规则提供独立回归保护
重点不是恢复 source grep,而是确保:
- 目标文件确实命中 scoped rule;
- 禁止的路径确实报错;
- 合法轻量 import 不被误伤;
- 同名规则的覆盖或替代行为不会静默丢失其他约束。
9.4 降低同一 PR 的双重 review 负担
规范变化与测试清理可以保持逻辑关联,但 review 应能够分别判断:
- 文档模型是否正确;
- 每个删除或修改测试的 regression signal 是否真的冗余。
可通过更清晰的 commit/PR 分层或独立 review section 降低耦合。
9.5 用固定任务集持续校准 Agent 行为
本次使用的场景可以固化为文档治理 benchmark,包括:
- threshold;
- async stale work;
- browser boundary;
- source-text enforcement;
- pass-through wrapper;
- out-of-scope cleanup;
- timeout/flaky;
- review evidence。
以后修改 Agent 文档时,使用同一场景比较行为偏差,避免规范在逐步增加规则后重新出现机械执行或 scope 扩张。
9.6 明确规则优先级链
最终版本已经解决 scope discipline 与 test cleanup 的冲突。后续可继续明确:
AGENTS.md的工程原则;- testing guide 的具体决策;
- verification guide 的非永久验证方式;
- PR guide 的 evidence/reporting 要求。
这样可以减少不同 Agent 在跨文档读取时自行推断 precedence。
9.7 更新 PR 描述以对应最终 head
PR 描述应反映第二个 commit 已经解决的问题,并把本次 score matrix 或简化后的结论作为 review context,避免 reviewer 仍按 95ab492 的风险模型审查最终版本。
十、最终评价
对 c7543bb
适合作为简洁的工程基线,但不足以稳定约束不同 Agent 的测试设计行为。强模型可以自行补全,弱模型容易只覆盖 happy path 或依赖 coverage 数量。
对 95ab492
测试决策模型本身优秀,但不适合原样合并。它提高了测试质量上限,同时明显增加机械 checklist、过度分析和 scope 扩张风险。
对 2984f21
这是三个版本中明显最好的版本。它保留第一版在 contract、regression、boundary 和 equivalence class 上的能力,同时通过 applicability gate 和 scope boundary 大幅降低误解。
对 PR #1628
总体评价:方向正确,最终文档设计良好,建议继续 review,而不是退回基线或否定核心方案。
合并前最值得关注的不是再增加更多测试规则,而是:
- scoped ESLint rule 的回归保护;
- 被删除测试是否逐项失去的确只是冗余信号;
- checklist 对小变更的成本;
- PR 描述与最终 head 的一致性;
- 人工 review 是否确认 class-based assertions 和 wrapper cleanup 的边界。
Score matrix 表明,这个 PR 最重要的价值是降低不同 Agent 对“什么是有意义测试”的解释方差;最重要的长期风险则是规范本身逐渐成为新的执行负担。
cyfung1031
left a comment
There was a problem hiding this comment.
@CodFrm
引进 2984f21 后
基于以下测试结果,可以合并了
#1628 (comment)
你有推到这个pr上来么? |
|
原来夹在两个超大评论中间 |
Checklist / 检查清单
未关联 Issue;尚未经过人工审查。
背景
现有测试指南偏重运行机制,对如何选择测试边界、识别低价值用例、设计边界/失败/并发场景以及清理无效测试缺少统一口径。全局 Vitest setup 的轻量化约束也由读取源码的单测维护,不能在违规 import 出现时直接给出 lint 反馈。
本次改动
建议审查重点
验证
pnpm test -- --run scripts/git-staged-snapshot.test.mjs src/pages/components/NameAvatar.test.tsx src/pages/components/ui/empty-state.test.tsx:实际运行完整 Vitest 套件,306 个测试文件、3445 个用例全部通过。pnpm run lint:Prettier、TypeScript、i18n 与 Issue 模板检查通过;最终全仓 ESLint 因本地未跟踪/忽略的e2e/scratch/验证脚本存在 11 个既有错误而退出 1,本 PR 未修改或提交这些 scratch 文件。pnpm exec eslint eslint.config.mjs scripts/git-staged-snapshot.test.mjs src/pages/components/NameAvatar.test.tsx src/pages/components/ui/empty-state.test.tsx tests/vitest.setup.ts:通过。git diff --check与 diff 隐私扫描:通过。Screenshots / 截图
N/A — 非视觉变更。