--- name: test-strategy description: >- 测试策略纪律——按本地执行时点的三 Lane 调度(fast/final/manual)、治理顺序 flaky→时长→选择、AI Agent 模型边界测试骨架、验收矩阵对接。为 spec 设计测试与验收策略、把验收矩阵翻译为计划任务、或为项目搭测试分层时使用。 --- > 语言协议:以对话语言输出——用户显式指定优先,其次跟随用户近期消息语言;均无法判定时默认英语。落盘产物以创建时对话语言为准。 > **外部搜索统一入口**:需要联网检索(资料、库/框架文档、时效信息)时一律先用 anysearch skill(插件内嵌),不可用再降级 WebSearch/WebFetch;降级链与派发词要求见 requirement-analysis 的 references/exploration-patterns.md。 # 测试策略纪律 普适纪律在本文;栈特定处方按需加载 references(阅读时机见各文件头)。 ## 三 Lane 模型(调度维度是执行时点,不是业务模块;全部本地运行,无 CI/PR 槽位) | Lane | 时机/预算 | 内容 | 判据 | |---|---|---|---| | **fast** | 每任务,< 1 min | 本任务目标测试 + 特性自有测试文件;纯内存或本地可控 IO | 不碰网络与 LLM | | **final** | 实施结束后的独立 final 验证票 F,先于审查与验收 | 项目完整测试套件,含真实容器/库集成与主干 E2E | 首次全量;后续改动按影响补验,失败按归属裁决 | | **manual** | 用户当轮显式要求 | 模型评测、性能多轮采样、全量 E2E、迁移演练等长耗时/概率性检查 | 永不由 executing-plans 或 acceptance-qa 自动触发;交付路径上的 manual 行标 `manual-pending` | 小团队(1-5 人)不建按模块的测试选择系统;final 首次全量提供安全网,选择/分片只在 final 超过 15 min 时再议。 ## 外部依赖策略 准入以 ../test-driven-development/references/testing-anti-patterns.md 为单点;本节只定义选择策略,不另列竞争的禁止清单。 | 依赖 | 策略 | 验证边界 | |---|---|---| | 外部 API | 在声明边界注入契约完整的客户端替身,按需做真实契约集成 | 替身绿只证明本地消费者 | | 数据库 | 优先真实测试库;纯内存替身只用于局部确定性行为 | 真实 DB 契约依 references/db-testing.md | | 时间/随机性 | 注入可控时钟或随机源 | 不 mock 被测业务算法 | | 文件系统 | 目的允许时用真实临时目录;需隔离时替换声明边界 | 真实文件行为按实际 IO 归 Lane | 依赖注入与操作明确的窄接口用于已有交付需求,不为测试投机新建抽象。优先操作明确的客户端方法,避免在替身中解析万能 fetcher 的条件分支。fast 只含纯内存或本地可控 IO;真实集成归 final,长耗时归 manual;替身通过不能作为真实集成信心。模型边界下的 fake model 骨架保留。 ## 静态快检 计划写出项目配置中已有且适用的 typecheck/静态检查命令及其来源,在编辑批次间提供快速反馈。无适用命令写“不适用”并沿用测试命令,不新增依赖或虚构 tsc。 快检与行为测试分开记账:编译故障不是有效红,静态通过不能替代目标红绿、相关集成、最终全量或原 Lane 的必需检查;零测试和 SKIP 不记 PASS。任务完成和并发后继解锁仍以既有验证要求为准。目标行为须观察有效红;相关/集成回归按原计划验证通过,不要求人为制造红。final 在实施完成后、审查/验收前独立执行,不因本节成为每张实施票的完成条件;原计划明确要求的票内验证仍全部执行。本票目标红绿、相关/集成验证及其他既有完成条件满足后,即可完成本票并解锁依赖;此时尚未到期的收尾全量保持待执行。不要仅因计划也列了最终全量命令,就把它归入本票门槛。 ## 集成组的验证归属 组内状态与失败恢复先读 [integration-groups.md](../executing-plans/references/integration-groups.md):本应通过的检查失败时阻塞归属成员或验证票及整组,失败不推进已验证基线;本节只定义验证时机,不另设状态协议。验证票失败时,验证票与组标 blocked,成员仍 awaiting_verification,validated_commit 不动,组外后继继续等待;完整字段与恢复操作只依上述单点。 普通行为票的有效红绿与原完成条件保持。获批的不可独立验证集成组,在组首记录公共行为保护基线,各票保留可运行检查与真实结果;明确延期的相关验证在组验证票统一运行通过,才能完成全组。组首保护或局部必通过检查失败不能记待验放行;编译/环境失败不作为行为红。组内记录 pending_group 与日志,不能写 tests:pass;组完成记录的 pass 指组合验证,不改写历史失败。组验证不能代替独立 final;所有实施/组出口完成后先取得 F 回执,再进入审查与验收。 ## 证据适用性与修复后补验 先核对真实 argv/cwd/退出码、原件哈希、检查版本与范围。默认覆盖仓库输入;纯 progress 变化可复用,代码、断言、fixture、配置、适用 spec 或执行条件变化时按影响补验。仅写集合相交、时间戳更新或 hash 字段非空不证明有效。修复后的新候选还须复审受影响维度、更新验收与对账,再交付;原 pass 与失败尝试均保留。受控 review 的 strict snapshot 不因此放宽,新快照建立新 run。 ## 治理顺序铁律:flaky → 时长 → 选择 反序必翻车——一条 flaky 的必需检查会拖垮整条流水线的信任。先清 flaky,再治时长(拓扑>磁盘>并行),最后才考虑选择系统。 ## AI Agent 测试骨架(模型边界是唯一不可逆决策) 一根窄接口隔离模型,模型是它之外唯一的依赖;边界以下全确定性: - L0 静态 + 工具 JSON Schema 校验(schema 漂移是工具类头号故障) - L1 harness 单测(fast):fake model 按序弹响应;测循环控制、路由、重试、预算、护栏 - L1.5 prompt 快照(fast):快照装配后的最终 prompt(确定性),不是模型输出 - L2 工具契约(fast):工具=普通函数单测 - L3 回放(fast):录制回放(脱敏),周期性重录 - L4 廉价模型冒烟(manual,仅 agent 相关变更且用户要求):小模型 + 严格 schema 断言 - L5 完整 eval(manual):真实模型、多 trial、pass^k、按维度隔离 judge 断言纪律:`temperature=0` 不是确定性——断言面向结构与 schema,永不面向精确文本;评结果不评路径(精确工具序列断言脆弱)。 ## 与验收矩阵的对接(上游分工链的一环) - **requirement-analysis 写矩阵时**:每行标注 Lane 归属(fast/final/manual)——unit/docs 行默认 fast,integration/e2e 行默认 final,perf/eval/实际模型任务行默认 manual;性能行必须带阈值数字。 - **writing-plans 翻译时**:任务的失败测试步骤继承该行 Lane 归属并写明运行命令所属 lane;DB/容器类测试步骤引用 references/db-testing.md 处方(模板克隆、两速隔离),不得每测试起容器。 - **acceptance-qa 执行时**:阶段 0 装配按 Lane 选择执行窗口;manual 行在交付路径标 `manual-pending`,仅用户当轮显式要求时执行。 ## Red Flags - 每测试/每文件一个容器;每测试重放迁移 → 读 db-testing.md 处方 - 用 mock 测出来的绿当集成信心 → mock 只属 fast lane,集成信心来自 final lane 真实容器 - eval 分数波动就改断言阈值 → 先查 flaky 治理顺序,eval 属 manual 不阻塞 - 为测试选择系统引缝 → 缝跟着真实交付边界走,1-5 人先全量