Skip to content

✅ 完善测试设计规范并清理低价值用例#1628

Merged
CodFrm merged 2 commits into
mainfrom
docs/meaningful-test-guidelines
Jul 21, 2026
Merged

✅ 完善测试设计规范并清理低价值用例#1628
CodFrm merged 2 commits into
mainfrom
docs/meaningful-test-guidelines

Conversation

@CodFrm

@CodFrm CodFrm commented Jul 21, 2026

Copy link
Copy Markdown
Member

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

未关联 Issue;尚未经过人工审查。

背景

现有测试指南偏重运行机制,对如何选择测试边界、识别低价值用例、设计边界/失败/并发场景以及清理无效测试缺少统一口径。全局 Vitest setup 的轻量化约束也由读取源码的单测维护,不能在违规 import 出现时直接给出 lint 反馈。

本次改动

  • 扩充测试指南,明确契约、触发、结果、回归风险、等价类、边界与失败路径、mock/fixture 和清理标准。
  • 允许 BDD 用例标题使用中文或英文,并同步文档索引与维护职责描述。
  • 为 tests/vitest.setup.ts 增加文件级 no-restricted-imports 约束,替代读取源码文本的结构测试。
  • 删除只验证静态数量、透传包装或 mock 自身行为的低价值用例;收紧快照、头像哈希和 EmptyState 的有效行为断言。

建议审查重点

  • 测试指南是否给出了可执行、不过度枚举的用例选择标准。
  • 删除的页面/包装测试是否确实未保护稳定的用户契约。
  • Vitest setup 的 ESLint import 边界是否覆盖当前重型依赖入口且没有误伤合法 mock。

验证

  • 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:通过。
  • 全部已跟踪 Markdown 的相对链接目标检查:通过,无缺失目标。
  • git diff --check 与 diff 隐私扫描:通过。
  • pre-commit:TypeScript、Prettier、Issue 模板检查通过。

Screenshots / 截图

N/A — 非视觉变更。

@CodFrm CodFrm changed the title 完善测试设计规范并清理低价值用例 ✅ 完善测试设计规范并清理低价值用例 Jul 21, 2026
@CodFrm
CodFrm requested a review from cyfung1031 July 21, 2026 03:07
@cyfung1031

Copy link
Copy Markdown
Collaborator

的確很多廢話,維護也不容易

@cyfung1031

Copy link
Copy Markdown
Collaborator

先轉draft 吧
要慢慢看

@cyfung1031

Copy link
Copy Markdown
Collaborator

PR #1628 对 Agent 测试行为影响:两份独立评估的整合报告

一、综合结论

两份独立报告虽然采用了不同的 Agent 角色、评分维度和权重,但对核心事实的判断高度一致:

  1. **PR ✅ 完善测试设计规范并清理低价值用例 #1628 的方向是正确的。**它把“测试应当有意义”从抽象原则,转化为 Agent 可以执行和审查的决策流程:先定义 Contract、Trigger、Outcome、Regression,再选择测试边界、等价类、失败路径、状态与并发风险以及清理策略。
  2. **PR 明显提高了测试决策质量的上限。**它尤其改善了测试案例选择、低价值测试识别、失败分类、安全清理、测试边界选择和证据质量,并降低不同 Agent 依赖个人偏好解释“有意义测试”的程度。
  3. **PR 同时显著增加了执行成本和误解风险。**文档从约 120 行扩展到约 270 行,增幅约 125%;四元素、六类行为空间、清理流程和七项 checklist 被放在同一层,容易诱发机械枚举、过度规划和逐项声明式合规。
  4. 最严重的未解决问题是 scope precedence。AGENTS.md 要求“Bug fix ≠ cleanup PR,只修改任务需要的文件”,而 testing guide 又要求“发现 no-value tests 时清理”。两者缺少明确优先级和边界,导致保守 Agent 与主动清理 Agent 可能得出相反结论。
  5. 两套评分并不矛盾,而是在衡量不同问题:
    • 按“Agent 行为质量”加权评估,PR ✅ 完善测试设计规范并清理低价值用例 #16288.50/10,main 为 5.35/10,PR 领先 3.15
    • 按“文档治理、认知负担、scope 稳定性和人工 review 友好度”等维度评估,PR 与 main 均为 33.0/50;但 persona 平均分仍是 PR 3.8/5、main 3.3/5
    • 前者说明 PR 显著提升测试决策能力;后者说明这些能力收益被文档长度、scope 模糊性和维护成本抵消。
  6. **因此,不宜否定 PR 的核心内容,也不宜原样合并。**最合理的处理方式是保留 contract、regression、equivalence class、failure/cleanup classification、replacement-first 和 evidence-based compliance 等概念,同时重构信息层级、适用条件、决策表和 scope 优先级。

二、评估范围、方法与限制

2.1 评估对象

评估比较了:

2.2 评估方法

两份报告都采用了文档驱动的静态行为模拟,即:

  • 固定任务或风险场景;
  • 固定 Agent persona;
  • 分别只向 Agent 提供 PR branch 或 main branch 的规范;
  • 根据文档指令的完整性、可判定性、PR diff、branch 文档和 review 记录,推演 Agent 的预期决策。

这不是实际运行多个外部模型完成 repository task,也不是实测 multi-agent benchmark。当前环境虽然能够读取 PR、branch 文档与 review 记录,但不能完整 checkout/clone repository、安装依赖、启动多个 LLM runtime 并执行完整测试套件。因此,所有分数都是结构化静态模拟结果,不等同于真实 contributor workflow 或模型运行数据。

2.3 第一套 Persona:任务行为导向

Agent 行为倾向 主要风险
Literal Agent 严格逐字遵循文档 文档未写明时停止,或采用最保守方案
Coverage Agent 优先增加 coverage 与测试数量 容易编写 tautology、pass-through test
Minimal-change Agent 尽量少改文件和代码 可能漏掉重要 regression path
Refactor Agent 偏好抽象、重构与清理 容易超出 PR scope
CI-fix Agent 优先让测试和 lint 通过 容易弱化 assertion、增加 retry 或提高 timeout
Reviewer Agent 评估既有测试是否有价值 容易误删看似简单但具有分支价值的测试

2.4 第二套 Persona:规范治理导向

Agent 模拟行为
Checklist Agent 优先把明文规则逐项转换为 checklist,并倾向全部执行
Contextual Agent 先识别 observable contract、风险与任务范围,再选择测试
Scope Guardian 优先遵守“只改任务需要的文件”,对顺手 cleanup 保守
Cleanup Agent 主动识别低价值测试、重复测试和错误 enforcement mechanism
Evidence Auditor 不接受“已测试”等抽象陈述,要求 reproduction、实际命令和 regression evidence

两组角色存在部分对应关系,但并不完全相同。Literal Agent 与 Checklist Agent 都能暴露机械执行风险;Coverage、Minimal-change 与 Contextual Agent 更关注案例和边界选择;Refactor Agent 与 Scope Guardian 共同检验 scope;CI-fix 与 Cleanup Agent检验失败分类和清理安全性;Reviewer Agent 与 Evidence Auditor检验价值判断和证据质量。

2.5 第一套模拟任务

第一份报告固定了以下十类任务:

  1. 为已确认的 bug 新增 regression test。
  2. 为带 threshold 的函数选择测试案例。
  3. 测试 async cancellation 与 stale-result overwrite。
  4. Review 一个只检查静态 button 数量的 page test。
  5. Review 一个 source-file grep test。
  6. 处理 timeout 或 flaky test。
  7. 判断应使用 unit、service、integration、E2E 还是 manual verification。
  8. 判断 pass-through component test 应保留还是删除。
  9. 为 mock-heavy test 选择 mock boundary。
  10. 编写 BDD test title。

2.6 两套评分口径

评分体系 A:Agent 行为质量

  • 单项 1–10 分;
  • 按指令清晰度、行为一致性、案例选择、低价值测试识别、异步与并发覆盖、测试边界、CI 防弱化以及文档负担加权;
  • 主要回答“规范能否提高 Agent 完成测试任务的质量”。

评分体系 B:规范与治理质量

  • 单项 1–5 分,5 分较佳;
  • “文档长度”衡量有效信息密度和可消化程度,不是简单地越短越好;
  • 重点衡量认知负担、机械 checklist 风险、scope 解读空间、人工 review 友好度、信息分层和决策模型;
  • 主要回答“这套规范是否适合作为长期、可维护、可审查的 always-loaded instruction”。

两套评分不能直接相加或平均。


三、PR #1628 Branch 的模拟结果

3.1 Literal Agent 与 Checklist Agent:遵循更完整,但容易过度展开

PR 要求 Agent 在编写 assertion 前明确表达:

  • Contract
  • Trigger
  • Outcome
  • Regression

如果无法指出一个测试能够阻止哪一种错误实现,文档会提示该测试可能只是在验证 implementation detail 或 tautology。

因此,Literal Agent 大概率会:

  • 在动手前列出四项 test intent;
  • 对 threshold 覆盖 < limit= limit> limit
  • 对 async contract 考虑 cancellation、ordering 和 stale work;
  • 不会仅因 coverage 下降而保留低价值测试。

但从 Checklist Agent 视角看,典型输出可能演变为:

先列出 Contract、Trigger、Outcome、Regression;再检查 normal、boundary、invalid、state transition、ordering、concurrency、compatibility/security;再检查 mocks、fixtures、assertion boundary、cleanup 分类;最后逐项完成七项 review checklist。

文档先要求四元素,又列出六类 behavior space,再加入约六步 cleanup 流程和七项 checklist。对逐字执行型 Agent,这会带来以下行为:

  • 为简单变更建立不成比例的测试分析;
  • 把“consider”理解为“must cover”;
  • 即使某类不适用,也机械标记 N/A;
  • evidence 很完整,但 coding throughput 下降;
  • 规范遵循度高,判断自主性偏低;
  • 小改动也可能出现冗长 ceremony。

容易被过度分析的例子包括:

  • 一个简单 mapping branch;
  • 一个明确的 regression reproduction;
  • 一行 accessibility derivation。

3.2 Contextual、Coverage 与 Minimal-change Agent:案例和边界选择明显改善

PR 为 Agent 提供了一组统一决策词汇:

  • observable contract
  • plausible regression
  • narrowest realistic boundary
  • distinct equivalence classes

这使 Contextual Agent 能先排除不适用的风险维度,而不是机械增加测试。例如,文档明确说明:

  • 十个普通字符串若走同一 execution path,通常只需一个代表案例;
  • empty input 只有在行为发生变化时才值得成为独立测试;
  • 不同 outcome 的 threshold branch 应覆盖;
  • 测试价值不能仅由 coverage 增长证明;
  • 测试必须保护 observable contract、捕获真实 regression,并确保维护成本低于信心收益。

典型决策可以是:

本次变更只修改同步 selection logic,因此不需要 concurrency、timeout 或 E2E。正常值、threshold equality、threshold below/above 构成足够的 distinct equivalence classes。

这类决策比 main 更容易解释和审查。

对 Coverage Agent,PR 能明显抑制“每个函数都加 test”或“保留所有现有 test”的倾向。文档列出的 no-value test 包括:

  • tautology
  • duplicate
  • redundant
  • pure pass-through render
  • testing the mock/framework
  • mislabeled test
  • 应由 lint 执行的 source-content assertion

这能够减少:

  • 测试数量膨胀;
  • 重复 setup;
  • 虚假的 coverage confidence;
  • 长期维护成本;
  • 用大量普通 sample 代替 outcome-changing branch 的行为。

对 Minimal-change Agent,PR 给出了 pure unit、focused component、service/repository、integration/E2E 和 manual verification 的适用条件,推动 Agent 选择“最窄但仍能观察真实 contract”的边界。这可以避免:

  • 把 browser/process 问题硬塞进 heavily mocked unit test;
  • 因担心 integration 太重而只测试内部 helper;
  • 为简单 mapping 问题启动完整 page integration;
  • 用大型 page render 验证一个局部 contract;
  • 因 permanent automation 成本过高而编写低价值替代 test。

3.3 Async、State 与 Concurrency:补足 Agent 最容易漏掉的空间

PR 明确要求在适用时考虑:

  • repeated calls
  • idempotency
  • cleanup
  • unsubscribe/dispose
  • stale async overwrite
  • out-of-order completion
  • overlapping operations
  • deduplication
  • exactly-once effect
  • cancellation
  • ordering
  • stale work

这些正是 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 边界更模糊

AGENTS.md 已要求:

Bug fix 不是 cleanup PR;只修改任务需要的文件,不做不必要的 helper、abstraction 或 compatibility shim,也不处理不相关 cleanup。

PR 对 testing cleanup 又增加了逐项确认程序:

  • 阅读 production path;
  • 搜索附近 unit、caller、integration、E2E、lint 和 harness;
  • 指出该测试能够阻止的 mutation;
  • 确认它是否是唯一的 branch/error/security/lifecycle coverage;
  • 识别重复 coverage;
  • 只移除 redundant signal。

这使 Refactor Agent 更难仅凭“整体看起来重复”批量删除测试,也降低以下不可靠 heuristic 的影响:

  • test 很短,所以没有价值;
  • mock 很多,所以应删除;
  • output 类似,所以属于重复;
  • caller 有 test,所以 callee 一定不需要测试。

但是,testing guide 同时要求“发现 no-value tests 时清理”,由此产生两种都合理但相反的解读:

  1. **狭义解读:**只清理当前修改附近、与本次任务直接相关且明显无价值的测试。
  2. **广义解读:**既然规范说“clean them up when you find them”,Agent 可以顺手扫描并删除 repository 内其他低价值测试。

即使后文要求先读 production path、搜索 coverage、识别 mutation 再删除,也仍未回答“是否允许超出原 task scope”。

PR 自身又同时修改:

  • testing policy;
  • BDD 语言规定;
  • doc ownership/index;
  • ESLint restriction;
  • structural test;
  • 多个 component/page tests。

PR description 也把“清理低价值用例”列为主要改动,但没有关联 issue,且未完成人工 review。这让 reviewer 很难区分:

  • 文档政策是否正确;
  • 实际 cleanup 是否正确;
  • lint replacement 是否正确;
  • 被删测试是否真的无价值。

因此,PR 对 cleanup 判断质量有提升,但对 Scope Guardian 来说,scope 稳定性反而下降;PR 所倡导的 scope discipline 与 PR 自身的广度形成张力。

3.5 Cleanup Agent 与 CI-fix Agent:失败分类和 replacement-first 明显增强

PR 将 failing/slow test 区分为:

  • production regression
  • wrong/obsolete contract
  • flaky test
  • misclassified integration work
  • no-value test
  • valuable constraint in wrong mechanism

这比把所有 failure 都视为同一问题更安全,也比单一的“fix code, not tests”更成熟。预期行为包括:

  • valid contract 失败时修复 production;
  • wrong/obsolete contract 需要修正测试所表达的契约;
  • flake 需要寻找 timing、global state、order 等根因;
  • 不用 retry 或大 timeout 隐藏问题;
  • integration work 放错层级时重新选择 boundary;
  • no-value test 才考虑删除;
  • 有价值但 enforcement mechanism 错误时先替换保护机制。

其中最强的规则之一是:

file-content assertion 或 source grep test 如果保护的是 mechanical convention,应先建立并验证 lint/structural replacement guard,再删除 Vitest test。

典型处理为:

vitest.setup.ts 的 import boundary 属于 mechanical convention。先增加 file-scoped ESLint restriction,验证规则生效,再删除读取 source text 的 Vitest test。

这是一条 evidence-based cleanup 路径,能够避免 migration 期间出现临时失去保护的窗口,而不是仅凭测试形式直接删除。

3.6 Reviewer Agent 与 Evidence Auditor:价值判断和证据质量显著提高

PR 不仅列出应删除的测试,也列出看起来很薄但应保留的测试:

  • conditional branch
  • variant-to-token mapping
  • accessibility derivation
  • custom error guard
  • security blocklist
  • component 的唯一 coverage

因此 Reviewer Agent 不再容易仅凭测试行数、mock 数量或 assertion 数量判断价值。

PR 同时要求:

  • bug 先 reproduce/capture;
  • 指出测试会阻止哪个 plausible regression;
  • 说明会失败的 mutation 或 plausible broken implementation;
  • 运行 focused test;
  • 运行 lint;
  • 运行 relevant full suite;
  • 只记录实际执行过的命令;
  • 删除前搜索 caller、integration、E2E、lint 和 harness coverage;
  • 确认 replacement guard 已存在并生效。

因此,Agent 较少提交:

Tests added and all tests pass.

而更可能提交:

Reproduced X with Y input. The new test fails when equality is accidentally changed to >=. Ran command A and suite B.

这种证据不仅说明“执行过什么”,还说明“为什么这个测试有价值”。它把决策证据和执行证据结合起来。

3.7 BDD Title 语言规则

main 强制 BDD title 使用中文。PR 改为中文或英文均可,但仍要求标题描述真实 trigger 和 observable outcome。

对英文优先的 coding agents,这可以降低:

  • 不自然翻译;
  • 标题与 test body 不一致;
  • 因语言限制而使用模糊名称。

四、Main Branch 的模拟结果

4.1 Main 已有的基础规则

main 并非没有测试纪律。它已经包含:

  • TDD exceptions;
  • no-value test 类型;
  • 不可批量判断测试是否无意义;
  • 删除前逐一对照 source;
  • test performance hygiene;
  • 不应使用 timeout 隐藏性能问题;
  • focused run 后执行 lint 和 relevant suite;
  • performance measurement 应使用相同命令、相同环境比较;
  • BDD title 必须使用中文;
  • 测试应 exercise our own logic,并能在 real regression 下失败。

问题在于,这些规则更多是分类和提醒,而不是集中、完整、可执行的决策程序。

4.2 Literal Agent 与 Checklist Agent:负担较低,但缺少回归推理框架

main 的 testing guide 约 120 行,主要涵盖执行机制、TDD exceptions、低价值测试类型和 performance hygiene。

它没有提供:

  • contract/trigger/outcome/regression 框架;
  • equivalence-class 选择方法;
  • boundary/failure/concurrency 决策流程;
  • cleanup replacement-first 流程;
  • 集中的 author/reviewer checklist。

因此 Literal/Checklist Agent 通常只会做到:

有 happy path、有一个 failure test、测试名称使用中文、执行 focused test 与 lint。

其优点是不会生成庞大 checklist,认知负担和 ceremony 更低;缺点是容易漏掉真正重要的 regression reasoning。同一任务也可能因 Agent 对 observable behavior 的理解不同而产生不同测试。

4.3 Contextual 与 Coverage Agent:强 Agent 尚可,平均方差较大

main 已有 no-value test 清单,因此 Coverage Agent 不会完全失控,也能识别 pure pass-through render 通常价值较低。但 main 没有完整要求:

  • normal case
  • boundary
  • invalid/failure
  • transition
  • concurrency
  • compatibility/security

也缺乏明确的 equivalence-class 规则,所以 Agent 仍可能:

  • 用大量普通 sample 代替 outcome-changing branch;
  • 不知道是否需要 exact-boundary case;
  • 不知道是否应保留 normal case,以防修复缩窄既有行为;
  • 无法一致选择 service、component、integration 或 E2E;
  • 不确定 async state 是否需要 stale-result test。

强 Contextual Agent 仍能凭经验推导出合理测试,但平均 Agent 会因模型偏好、上下文长度和保守程度不同产生更大行为差异。

4.4 Minimal-change Agent:测试边界更依赖个人偏好

main 没有完整解释 test boundary 的选择方法,因此 Minimal-change Agent 更可能:

  • 对 browser boundary 编写 overly mocked unit test;
  • 因担心 integration 太重,只测试内部 helper;
  • 相反地,用大型 page render 验证局部 contract;
  • 在 pure unit、component、service/repository、integration/E2E 和 manual verification 之间缺少稳定选择依据。

4.5 Scope Guardian 与 Refactor Agent:scope 更稳定,cleanup 更保守

main 较少出现新 testing guide 与主规范竞争的问题。Scope Guardian 通常会直接依据 AGENTS.md

Bug fix 不是 cleanup PR,只修改 task 所需文件。

testing guide 虽然也提到遇到低价值测试应清理,但只简短要求删除前逐一对照 source,没有 PR branch 那套大型 cleanup procedure。

因此,main 的行为更保守、一致,scope 稳定性较好;但也可能留下本次修改范围内已经明显无价值的测试。Refactor Agent 和 Reviewer Agent 对“covered elsewhere”也可能采用较弱证据标准。

4.6 Cleanup Agent 与 CI-fix Agent:能识别问题,但安全流程不足

main 能识别:

  • tautology
  • duplicate
  • pass-through
  • testing the mock
  • low-value test
  • timeout/performance hygiene

但失败分类不够集中,Agent 仍需自行判断是:

  • production bug
  • wrong contract
  • flake
  • integration misclassification
  • low-value test

因此,不同 Agent 的处理差异更大。

main 还缺少完整的 replacement-first 证据链,可能产生:

这个 test 读取 source file,因此直接删除。

而 PR branch 会要求:

如果该测试保护真实 convention,先建立 lint/structural guard,再删除测试。

这是两个 branch 最实质的行为差异之一。

4.7 Reviewer Agent 与 Evidence Auditor:执行证据尚可,决策证据偏弱

main 已要求:

  • TDD exceptions 需要 verification evidence;
  • 测试应对 real regression 有效;
  • focused run 后执行 lint 与 relevant suite;
  • performance measurement 使用同命令、同环境比较。

因此,main 并非完全没有 evidence discipline。

但其 evidence 规则分散,没有集中成 author/reviewer checklist,也没有明确要求:

  • 指出 plausible broken implementation;
  • 指出 mutation/regression;
  • 搜索 caller/integration/E2E/lint coverage;
  • 判断是否为唯一 branch coverage;
  • replacement guard first。

所以 main 的执行证据尚可,但决策证据较弱,Reviewer 更可能发生 false positive deletion。


五、评分结果与口径解释

5.1 评分体系 A:Agent 行为质量加权评分

评分范围为 1–10,加权总分以 10 分为满分。

评分项目 权重 Main PR #1628 差异
指令清晰度与可执行性 20% 6 9 +3
不同 Agent 的行为一致性 15% 5 9 +4
测试案例选择质量 15% 4 9 +5
低价值测试识别准确度 15% 4 8 +4
Failure / async / concurrency 覆盖 10% 6 9 +3
测试边界选择 10% 5 8 +3
防止为了通过 CI 而弱化测试 10% 7 8 +1
文档简洁与认知负担 5% 8 6 -2
加权总分 100% 5.35 8.50 +3.15

该体系的结论是:PR 在所有主要测试行为指标上均领先,仅在文档简洁和认知负担上退步。由于认知负担仅占 5%,PR 的能力收益显著高于代价。

5.2 评分体系 A:Persona 一致性矩阵

Agent persona Main PR #1628 说明
Literal Agent 6 9 PR 提供明确决策步骤
Coverage Agent 5 9 PR 强化 contract 与 regression,而不是 coverage 数量
Minimal-change Agent 6 8 PR 能引导选择最窄但真实的 boundary
Refactor Agent 6 8 PR 的逐项删除检查降低过度 cleanup
CI-fix Agent 6 8 PR 将 failure 类型分开处理
Reviewer Agent 4 9 PR 显著降低误删有价值测试的风险

5.3 评分体系 B:Branch 层级治理评分

评分范围为 1–5,5 分较佳。

评估项目 PR #1628 Main 判断
文档长度/信息密度 2.5 4.0 PR 由约 120 行增至 270 行,增加约 125%;新增内容有价值,但压缩不足
认知负担 2.5 4.0 PR 同时要求四元素、六类 behavior space、cleanup 流程和 checklist
避免机械式 checklist 3.0 3.5 PR 明说不要 mechanical enumeration,但文档形状本身容易被 checklist 化
Scope cleanup 与主规范解读空间 2.5 4.0 “发现就 cleanup”和“stay in your lane”存在明显张力
Multi-agent 行为一致性 4.0 2.5 PR 给出共同决策语言,降低 Agent variance
人工 review 友好度 2.5 4.0 PR 可验证性强,但 reviewer 阅读负担大;现有人工反馈认为内容冗长、难维护
信息分层 3.5 3.0 PR 有章节分层,但核心规范、教学、例子与 checklist 仍混在同一长文档
决策表/决策模型 3.5 2.0 PR 有隐含 decision model,但不是快速可扫描的正式决策表
具体正反例 4.5 3.0 PR 的 equivalence class、mock、pass-through、lint replacement 等例子有效
Evidence-based compliance 4.5 3.0 PR 明确要求 reproduction、plausible regression、实际命令与 replacement-first evidence
总分 33.0/50 33.0/50 分数相同,但强弱面完全不同

该体系更重视文档治理与 scope 稳定性,因此 PR 在决策质量上的提升被长度、认知负担、review 成本和 scope 模糊性抵消。

5.4 评分体系 B:各 Agent 表现矩阵

Persona PR #1628 Main 差异
Checklist Agent 3.0 3.5 PR 完整但容易过度执行
Contextual Agent 4.5 3.0 PR 的 contract/regression/equivalence class 很有帮助
Scope Guardian 2.5 4.0 PR cleanup 语句增加 scope ambiguity
Cleanup Agent 4.5 3.0 PR 提供安全分类与 replacement-first 流程
Evidence Auditor 4.5 3.0 PR 明显提升证据质量
平均 3.8 3.3 PR 提升成熟 Agent 的质量,但更依赖 Agent 正确执行 applicability filtering

5.5 两套评分的综合解释

两套结果应同时保留:

  • 8.50 vs 5.35说明,当评价重点是测试任务完成质量时,PR 有明显净收益。
  • 33 vs 33说明,当评价重点扩展到长期维护、阅读成本、人工 review、scope 稳定性和信息架构时,PR 的收益尚未转化为整体治理优势。
  • 3.8 vs 3.3说明,即使在治理型 persona 评分中,PR 对成熟 Agent 仍有提升;主要拖累来自 Checklist Agent 和 Scope Guardian。
  • PR 提高了“决策质量上限”,但也提高了“执行成本和误解风险”。
  • main 的上限较低,但在 scope、长度和 reviewer 可消化性上更稳定。

六、PR #1628 做得好的地方

6.1 从“有测试”转向“测试能阻止哪个回归”

这是两份报告共同认为最有价值的改动。

Contract、Trigger、Outcome、Regression 四元素迫使 Agent 解释测试实际保护的行为,而不是依赖 coverage 或测试数量。每一步都可以在生成代码前审查。

6.2 引入等价类和 outcome-changing branch

PR 明确要求按 distinct equivalence classes 和 branches 选择案例,而不是无限枚举输入:

  • 不同 outcome 的 threshold branch 应覆盖;
  • 相同 execution path 的十个普通字符串通常只需一个代表;
  • empty input 只有改变行为时才值得独立测试;
  • exact boundary、below、above 应依据 contract,而不是形式化凑数。

这对抑制 Coverage Agent 的低价值 edge case 膨胀尤其有效。

6.3 补足 failure、async、state 和 concurrency

PR 将 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 regression
  • wrong/obsolete contract
  • flaky test
  • misclassified integration work
  • no-value test
  • valuable constraint in wrong mechanism

这比“一律修 production”或“看起来低价值就删除”更安全。

6.5 把删除测试变成证据导向的 review

PR 要求:

  • 逐一阅读 production path;
  • 搜索其他 coverage;
  • 指出 mutation;
  • 确认是否为唯一 branch/error/security/lifecycle coverage;
  • 只删除 redundant signal。

这显著降低批量误删和基于外观判断测试价值的风险。

6.6 选择更合适的 enforcement mechanism

对 mechanical source constraint,PR 要求先用 lint 或 structural guard 取代 source-text assertion,再移除 Vitest test。

该顺序具体、可执行,并保证迁移过程中不会出现保护空窗。

6.7 为人工 reviewer 与 Agent 建立共同词汇

Reviewer 可以直接询问:

  • contract 是什么?
  • plausible regression 是什么?
  • 这是不同 equivalence class 吗?
  • replacement guard 在哪里?
  • 是否为唯一 coverage?
  • 哪个 mutation 会被该测试阻止?
  • 为什么选择这一 boundary?

这可以降低 review 对个人经验和隐性判断的依赖。

6.8 中英文 BDD Title 更适合多 Agent 生态

允许中文或英文,但仍要求真实 trigger 和 observable outcome,有助于英文优先 Agent 写出自然、准确、与 test body 一致的标题。


七、PR #1628 的问题与风险

7.1 文档长度和指令密度增长过大

核心 testing guide 从约 120 行增至约 270 行,增加约 125%。

新增内容并非无价值,但以下内容全部放在同一文件和同一加载层:

  • 原则;
  • 操作流程;
  • failure/cleanup 分类;
  • 正反例;
  • review checklist;
  • 执行命令;
  • performance hygiene。

这使一次普通测试修改也可能需要消化整份规范。

对以下 Agent 或工具尤其不利:

  • 小模型;
  • 只读取文档前半部分的 Agent;
  • retrieval-based Agent;
  • prompt budget 受限的工具。

它们可能只读到部分规则,或在上下文截断后丢失关键约束。

7.2 规范意图反对机械枚举,但规范形状鼓励机械枚举

文档说不要机械枚举 inputs,随后却列出:

  • normal
  • boundary
  • invalid/failure
  • state transition
  • ordering/concurrency
  • compatibility/security

再附四元素、cleanup 流程和七项 checklist。

对 Literal/Checklist Agent 来说,最安全的行为仍是全部逐项处理并标记 N/A。规范意图与规范形状不一致。

7.3 缺少 Applicability Gate

文档前部缺少一个非常短的入口,例如:

本次 contract 是否涉及 state、async、security、threshold 或跨进程边界?只有“是”才展开对应检查。

没有这个入口,Agent 容易把所有风险类别当作 mandatory,而不是候选检查维度。

7.4 部分核心术语仍有解释空间

虽然 PR 比 main 清楚得多,但以下概念仍需 Agent 自行判断:

  • plausible regression
  • distinct branch
  • outcome-changing
  • relevant full suite
  • narrowest realistic boundary

不同模型仍可能:

  • 过度枚举;
  • 漏掉 domain-specific boundary;
  • 把 implementation branch 误认为 contract branch;
  • 宣称选择了最窄边界,却没有比较替代方案。

7.5 Scope cleanup 与主规范存在未解决冲突

需要明确回答:

  • cleanup 是否只限 touched file?
  • 是否只限 touched behavior?
  • 能否删除相邻但无关的低价值测试?
  • 本次修改直接触及的 no-value test 是否必须清理?
  • 相邻但无关的 low-value test 是否只记录、不修改?
  • 发现 repository-wide pattern 时是在当前 PR 处理,还是另开 issue/PR?
  • 大量清理应在什么条件下拆成独立 PR?
  • replacement lint rule 是否属于原 task 的必要范围?

这是最需要优先解决的规范问题。

7.6 Decision Model 仍是散文,不是真正的决策表

文档实际上已经包含一棵很有用的 decision tree:

  • behavior-preserving → verify
  • behavior-changing → failing test
  • browser/process boundary → integration/E2E
  • permanent automation 不划算 → throwaway verification
  • mechanical convention → lint
  • no distinct regression → delete

但这些规则散布在多个段落中,Agent 必须依赖长上下文自行拼装,无法快速扫描。

7.7 正反例偏向测试形式,缺少 scope 灰区例子

PR 对 pass-through、mock、threshold 和 empty array 的例子较好,但缺少以下争议场景:

  • 在 bug fix 中看到邻近 no-value test,是否删除?
  • 修改一个 component 时,能否删除同页面其他 static count tests?
  • repository scan 找到十个疑似无价值测试,如何拆分 scope?
  • replacement lint rule 是否算作原任务的必要修改?
  • observable contract 与 implementation detail 如何区分?
  • distinct equivalence class 与 another sample 如何区分?
  • minimum necessary collaborator call 与 internal call assertion 如何区分?
  • valuable thin test 与 pass-through test 如何区分?
  • cleanup in scope 与 unrelated cleanup 如何区分?

7.8 Checklist 容易产生无证据的声明式合规

Agent 可能逐项声称完成,却不提供可核实证据,例如:

  • 声称覆盖 failure paths,但没有 failure matrix;
  • 声称选择 narrowest boundary,但没有比较替代方案;
  • 声称测试可捕获 regression,但没有指出会失败的 mutation;
  • 声称运行 relevant suite,但没有记录实际命令;
  • 声称搜索了 existing coverage,但没有列出范围。

问题不是 checklist 本身,而是模型容易把 checklist 当作文案模板。

7.9 PR 自身范围削弱了规范可信度

PR 同时涉及 policy、文档索引、BDD 语言、ESLint、structural test 和多个 component/page test。其自身范围较广,使 reviewer 难以独立验证每类变更,也容易产生“用 policy 合理化 cleanup”或“用 cleanup 结果反向证明 policy”的循环论证。

7.10 PR 仍是 Draft,且尚未完成人工 Review

PR metadata 显示当前仍是 draft,“Code reviewed by human”未勾选,PR 描述也明确说明尚未人工审查。

现有人工 review 信号与静态模拟的风险判断一致:reviewer 认为内容“很多废话,维护也不容易”,要求先转为 draft,并表示需要慢慢阅读。

因此,静态 simulation 表现较好,不代表所有规则已经经过真实 contributor workflow 验证。


八、改进建议

8.1 建立三层信息架构

将内容分为:

  1. **快速 mandatory rules:**高频、不可违反、always-loaded;
  2. **test-design decision layer:**短决策树、applicability gate 和正式 decision table;
  3. **detailed examples/reference:**低频 rationale、复杂示例、performance guidance,按需加载。

这可以保留内容质量,同时降低上下文和认知负担。

8.2 在最前面增加 Applicability Gate

先判断本次 contract 是否涉及:

  • threshold/boundary;
  • invalid/failure;
  • state transition;
  • async/ordering/concurrency;
  • compatibility/security;
  • browser/process boundary;
  • mechanical convention。

只有适用时才展开对应检查,不要求逐项 N/A。

8.3 将散文转成正式 Decision Table

至少覆盖:

  • task characteristic;
  • pure unit;
  • focused component;
  • service/repository;
  • integration/E2E;
  • manual verification;
  • TDD exception;
  • cleanup classification;
  • lint replacement;
  • throwaway verification;
  • behavior-preserving 与 behavior-changing;
  • no distinct regression 时的处理。

8.4 明确 Scope Cleanup 的优先级和边界

应写明:

  • 当前任务直接触及的低价值测试如何处理;
  • touched file、touched behavior 和 adjacent test 各自的边界;
  • 相邻但无关问题是否只记录;
  • repository-wide pattern 何时另开 issue/PR;
  • 大量清理何时必须拆分;
  • replacement lint rule 何时属于当前任务必要范围;
  • AGENTS.md 与 testing guide 冲突时谁优先。

8.5 分离 Author Checklist 与 Reviewer Checklist

Author 需要执行步骤,例如 reproduction、选 boundary、运行命令、记录结果。

Reviewer 需要证据问题,例如 regression、mutation、existing coverage、replacement guard、scope justification。

强行共用会让 checklist 过长,也容易变成机械文本模板。

8.6 增加概念与 Scope 的正反例

应覆盖:

  • observable contract vs implementation detail;
  • distinct equivalence class vs another sample;
  • minimum necessary collaborator call vs internal call assertion;
  • valuable thin test vs pass-through test;
  • cleanup in scope vs unrelated cleanup;
  • bug fix 中邻近 no-value test;
  • component 修改与同页面 static count tests;
  • repository-wide cleanup pattern;
  • lint replacement 是否属于原任务。

8.7 要求短证据,而不是 Checklist Declaration

每个重要判断可以要求极短、可核验的字段:

  • Regression rejected:
  • Distinct branch:
  • Existing coverage searched:
  • Selected boundary because:
  • Replacement guard:
  • Focused/full suite actually run:
  • Out-of-scope findings recorded:

这比单纯勾选 checklist 更能减少虚假 compliance。

8.8 降低 Always-loaded Instruction 总量

把高频、不可违反的规则放在主层;低频、复杂、教学性内容按需检索,避免小模型、retrieval Agent 和 prompt-budget 工具只加载到半套规则。

8.9 将 Policy Change 与 Repository Cleanup 分开验证

即使仍在同一 PR,也应建立独立 evidence grouping:

  • policy 的正确性和可执行性;
  • lint/structural replacement 的正确性;
  • 每个被删除测试的价值判断;
  • cleanup 的 scope 合法性;
  • BDD 语言和文档索引变化。

避免用 policy 为 cleanup 自动背书,也避免用 cleanup 结果反向证明 policy。

8.10 建立可重复的 Agent Evaluation Fixture

把这次 simulation 固化为固定 prompts 和任务集,定期对不同模型、Agent framework 和 context budget 执行,观察:

  • 选择哪些 test cases;
  • 是否误删 test;
  • 是修改 production 还是 test;
  • 是否使用 timeout/retry;
  • 是否越界 cleanup;
  • 是否选错 test boundary。

8.11 进行真实 Multi-agent Runtime Benchmark

正式 benchmark 应固定:

  • task set;
  • 模型;
  • context budget;
  • 工具权限;
  • 评审 rubric;
  • repository 状态;
  • 执行命令和环境。

应记录:

  • task completion rate;
  • unnecessary test count;
  • missed regression classes;
  • out-of-scope file count;
  • unsupported compliance claims;
  • reviewer correction count;
  • token/time cost。

这能验证静态模拟中的收益是否能在真实 coding throughput、review 成本和错误率上成立。


九、最终判断

PR #1628 对 Agent 行为构成实质改善,方向上应予支持,但当前版本不宜仅以“内容更完整”为理由原样接受。

其最强部分是:

  • 从 coverage 思维转向 contract/regression 思维;
  • 建立等价类和 outcome-changing branch 选择方法;
  • 增加 boundary、failure、state、async 和 concurrency 指引;
  • 建立安全删除测试的证据流程;
  • 区分 production regression、wrong contract、flake、misclassified integration、no-value test 和 wrong mechanism;
  • 将 lint constraint 与 behavioral test 分离;
  • 要求 replacement-first;
  • 提升 reproduction、mutation、命令和 suite evidence;
  • 降低不同 Agent 对“有意义测试”的自由解释空间;
  • 为人工 reviewer 与 Agent 提供共同词汇。

其主要代价是:

  • 文档更长,信息密度和可消化性下降;
  • 认知负担和 ceremony 增加;
  • 普通 Agent 更容易机械套用 checklist;
  • 缺少 applicability filtering 时会过度覆盖不适用维度;
  • scope cleanup 与主规范产生新的解释空间;
  • 人工 reviewer 阅读与维护成本上升;
  • 高质量决策信息被长篇规范稀释;
  • PR 自身范围过广,削弱 scope discipline 的说服力;
  • 尚缺真实 multi-agent runtime benchmark 和完成人工 review 的结果。

综合两份报告,最准确的结论不是“PR 内容错误”,也不是“PR 已经成熟”,而是:

PR 提高了测试决策质量的上限,但其信息架构、适用条件和 scope precedence 尚未成熟。

建议保留其核心思想,并在合并前完成以下关键重构:

  1. 压缩核心 mandatory layer;
  2. 增加 applicability gate;
  3. 将散文转为 decision table;
  4. 明确 cleanup scope 与规则优先级;
  5. 分离 author 和 reviewer checklist;
  6. 补充 scope 灰区正反例;
  7. 用短证据字段替代声明式 checklist;
  8. 分开验证 policy 与 cleanup;
  9. 通过可重复 fixture 和真实 benchmark 验证实际收益。

完成这些调整后,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>
@cyfung1031

Copy link
Copy Markdown
Collaborator

根据评估评论中两份独立静态模拟报告(Agent 行为质量 8.50 vs 5.35;治理/scope 稳定性 33 vs 33)指出的具体问题,在 2984f21 中做了一轮针对性重构,只改了 AGENTS.mddocs/references/develop-testing.md

采纳的建议

  • 8.2 Applicability gate:新增前置小节,先判断契约是否涉及 threshold/failure/state-async/ordering/compatibility/browser-process/mechanical-convention,只展开适用项;明确写出"跳过时不要标 N/A",直接回应报告 7.2/7.3 提到的"文档意图反对机械枚举,但形状鼓励机械枚举"。
  • 8.3 决策表替代散文:test boundary 选择、behavior space、cleanup 分类三处散文列表改成表格,可扫描、信息密度更高(对应 7.6)。
  • 8.4 Scope/cleanup 优先级:新增「Scope & cleanup boundary」小节,明确 touched file/behavior 内的低价值测试才清理,相邻或仓库级问题只记录不在本 PR 处理,并在 AGENTS.md 的 scope discipline 条目加了一句交叉引用,声明该小节是在落实而非豁免这条规则(直接解决报告 7.5 指出的最严重未解决冲突)。
  • 8.5 拆分 author/reviewer checklist(原来是合并的一份)。
  • 8.6 灰区示例:补充 observable contract vs implementation detail、distinct equivalence class vs another sample、minimum necessary collaborator call、valuable thin test vs pass-through 等判断表,覆盖报告列出的大部分灰区问题。
  • 8.7 短证据字段:author checklist 改成 Regression rejected: / Distinct branch: / Selected boundary because: 等需要填值的字段,而不是可以空洞打勾的 checklist。

未采纳 / 留待后续

  • 8.1(三层文件拆分):保留单文件,用小节+表格分层,未物理拆成三个文件——拆分会与现有 doc-map/DOC-MAINTENANCE 的"不要碎片化"取向冲突。
  • 8.9(policy 与 cleanup 分开验证)、8.10/8.11(可重复 fixture、真实 multi-agent benchmark):这些是流程/基础设施建议,不是文档内容问题,本次改动范围内未处理。
  • 7.9/7.10(PR 自身范围偏广、仍是 draft、未经人工 review):文档改动无法解决,如实保留现状,仍需要人工 review。

净效果:核心文件从 268 行增至 317 行(约 +18%,而非此前 +125%),但改为表格后单位信息密度更高;两个被其他文档引用的锚点 #when-tdd-doesnt-apply#writing-meaningful-tests-what-to-clean-up--not-write 保持不变。已跑过仓库内 relative-link 检查脚本(无 broken link)及 git diff --check(无空白问题);*.md 在本仓库 prettier 配置里被忽略,未纳入格式检查范围。

@cyfung1031

Copy link
Copy Markdown
Collaborator

ScriptCat PR #1628:Agent 文档解读差异 Simulation Verification

一、结论摘要

三个版本的总体结果:

Commit 定位 加权总分
c7543bb 基线规范:简洁,但大量判断依赖 Agent 自身经验 66.6 / 100
95ab492 第一版 PR:测试决策能力明显提升,但容易机械执行,并产生 scope 冲突 79.6 / 100
2984f21 最终版:增加 applicability gate、决策表、scope 边界和分角色 checklist 93.2 / 100

核心判断:

  • c7543bb 的优点是短、执行成本低;缺点是没有形成完整的测试决策模型。
  • 95ab492 显著提高了 Agent 判断测试价值和边界的能力,但 Literal/Checklist 型 Agent 容易把所有风险类别机械展开。
  • 2984f21 基本解决了上一版最严重的两个问题:不适用项目的机械枚举测试清理与 PR scope 的优先级冲突
  • PR ✅ 完善测试设计规范并清理低价值用例 #1628 的核心方向是好的。剩余问题主要不是测试理念错误,而是文档治理、规则自身的回归保护和 review surface 偏大。

本报告属于结构化静态模拟:固定 Agent persona、任务场景和评分标准,根据各 commit 的文档及代码差异推演行为。它不是多个外部 LLM 实际执行完整 repository task 的实测 benchmark。


二、Simulation 使用的 Agent 行为

Agent 默认行为 主要失败模式
Literal / Checklist Agent 把文档中的每一项都转换成必须执行的步骤 对简单变更过度分析;把 “consider” 当成 “must cover”
Contextual Contract Agent 先识别 observable contract、风险和任务范围,再选择测试 文档没有明确决策入口时,结果依赖模型自身经验
Coverage Maximizer Agent 倾向增加测试数量和 coverage 写 tautology、pass-through test,枚举同一等价类的多个样本
Scope Guardian Agent 优先少改文件,严格限制 PR 范围 可能保留已经发现但本应随当前行为一起清理的无价值测试
Cleanup / Refactor Agent 主动删除低价值测试、迁移错误 enforcement mechanism 容易顺手扩大清理范围,形成 cleanup PR 膨胀
CI Stabilizer Agent 优先让 lint 和测试恢复通过 可能提高 timeout、加 retry、放宽 assertion 或修改正确测试
Evidence Reviewer Agent 检查测试是否真正拒绝某个 regression,并核验执行证据 缺少明确 evidence schema 时,只能依据 PR 作者的抽象陈述

这些 Agent 不代表具体模型,而是用于放大文档可能产生的不同行为。


三、固定 Simulation 场景

每个 commit 使用相同场景:

  1. 为已确认 bug 设计 regression test。
  2. 为带 threshold 的逻辑选择 <=> 等测试。
  3. 处理 async cancellation、乱序完成和 stale result overwrite。
  4. 判断浏览器 API / extension lifecycle 问题应使用 unit、integration、E2E 或 throwaway verification。
  5. Review 一个读取源文件文本并搜索 import 的测试。
  6. Review 一个使用大量 mock、最终只断言导航按钮数量的 page test。
  7. 判断无分支的 pass-through wrapper test 是否应保留。
  8. 处理 timeout 或 flaky test。
  9. 修改某个 bug 时,在无关文件发现 no-value test。
  10. 审查 PR 是否提供了可核验的 regression、测试边界和实际执行命令。

正确行为并不等于测试越多,而是:

  • 覆盖真实 observable contract;
  • 能拒绝 plausible regression;
  • 使用最窄但仍真实的测试边界;
  • 只覆盖 outcome-changing branch;
  • 不为 coverage 保留无价值测试;
  • 不超出当前任务 scope。

四、逐 Commit Simulation

4.1 c7543bb:基线版本

基线已经包含 TDD 例外、无价值测试类型、不要测试 mock/framework、source-text convention 应由 lint 执行,以及删除测试前逐项核验等重要原则。

同时,AGENTS.md 已明确要求 bug fix 不应变成 cleanup PR,只修改任务需要的文件。

但该版本主要是规则和运行机制,没有完整回答:

  • 测试前如何定义 contract;
  • 如何选择 unit/component/service/integration 边界;
  • 如何判断 distinct equivalence class;
  • 如何系统处理 invalid、state、ordering 和 concurrency;
  • reviewer 应要求什么具体证据。

Persona 行为预测

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 必须同时回答两个不同问题:

  1. 测试规范本身是否合理;
  2. 每个被删除或修改的测试是否真的无价值。

这提高了 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-3size-10font-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 的冲突。后续可继续明确:

  1. AGENTS.md 的工程原则;
  2. testing guide 的具体决策;
  3. verification guide 的非永久验证方式;
  4. 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 cyfung1031 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@CodFrm
引进 2984f21
基于以下测试结果,可以合并了
#1628 (comment)

@cyfung1031
cyfung1031 marked this pull request as ready for review July 21, 2026 14:17
@CodFrm

CodFrm commented Jul 21, 2026

Copy link
Copy Markdown
Member Author

@CodFrm 引进 2984f21 后 基于以下测试结果,可以合并了 #1628 (comment)

你有推到这个pr上来么?

@CodFrm

CodFrm commented Jul 21, 2026

Copy link
Copy Markdown
Member Author

原来夹在两个超大评论中间

@CodFrm
CodFrm merged commit 0d45b0b into main Jul 21, 2026
10 checks passed
@CodFrm
CodFrm deleted the docs/meaningful-test-guidelines branch July 21, 2026 14:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants