# Test Strategy

> 测试策略纪律——按 IO 类型的三 Lane 调度（fast/PR/nightly）、治理顺序 flaky→时长→选择、AI Agent 模型边界测试骨架、验收矩阵对接。为 spec 设计测试与验收策略、把验收矩阵翻译为计划任务、或为项目搭测试分层时使用。

- Skill: `flamemida/test-strategy` (Agent Skill, multi-file: 7 files)
- Install (CLI): `npx skillmds@latest add flamemida/test-strategy`
- Raw SKILL.md: https://api.skillmd.com/api/skills/flamemida/test-strategy/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: flamemida (https://skillmd.com/u/flamemida)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/flamemida/test-strategy

---


> 语言协议：以对话语言输出——用户显式指定优先，其次跟随用户近期消息语言；均无法判定时默认英语。落盘产物以创建时对话语言为准。

> **外部搜索统一入口**：需要联网检索（资料、库/框架文档、时效信息）时一律先用 anysearch skill（插件内嵌），不可用再降级 WebSearch/WebFetch；降级链与派发词要求见 requirement-analysis 的 references/exploration-patterns.md。

# 测试策略纪律

普适纪律在本文；栈特定处方按需加载 references（阅读时机见各文件头）。

## 三 Lane 模型（调度维度是 IO 类型，不是业务模块）

| Lane | 时机/预算 | 内容 | 判据 |
|---|---|---|---|
| **fast** | 保存/提交时 < 1 min | 纯内存：mock IO、mock 模型、组件+mock 网络 | 不碰任何真实 IO（含 LLM） |
| **PR** | 目标 < 10 min | 编译/静态先行 + fast 全量 + 集成（真实容器/库）+ 主干 E2E 3-5 条 | 每套件一容器 + 模板克隆 |
| **nightly** | 夜间/手动 | 全量含慢测试：并发锁、迁移演练、全 E2E、Agent 完整 eval | 概率性/长耗时永不阻塞 PR |

小团队（1-5 人）fast lane 全量跑全部模块——不建按模块的测试选择系统；选择/分片只在触发条件满足时引入（>15-20 人或 PR lane >15min，先榨干单机并行）。

## 外部依赖策略

准入以 ../test-driven-development/references/testing-anti-patterns.md 为单点；本节只定义选择策略，不另列竞争的禁止清单。

| 依赖 | 策略 | 验证边界 |
|---|---|---|
| 外部 API | 在声明边界注入契约完整的客户端替身，按需做真实契约集成 | 替身绿只证明本地消费者 |
| 数据库 | 优先真实测试库；纯内存替身只用于局部确定性行为 | 真实 DB 契约依 references/db-testing.md |
| 时间/随机性 | 注入可控时钟或随机源 | 不 mock 被测业务算法 |
| 文件系统 | 目的允许时用真实临时目录；需隔离时替换声明边界 | 真实文件行为按实际 IO 归 Lane |

依赖注入与操作明确的窄接口用于已有交付需求，不为测试投机新建抽象。优先操作明确的客户端方法，避免在替身中解析万能 fetcher 的条件分支。fast 只含纯内存；真实 IO 按 PR/nightly，替身通过不能作为真实集成信心。模型边界下的 fake model 骨架保留。

## 静态快检

计划写出项目配置中已有且适用的 typecheck/静态检查命令及其来源，在编辑批次间提供快速反馈。无适用命令写“不适用”并沿用测试命令，不新增依赖或虚构 tsc。

快检与行为测试分开记账：编译故障不是有效红，静态通过不能替代目标红绿、相关集成、最终全量或原 Lane 的必需检查；零测试和 SKIP 不记 PASS。任务完成和并发后继解锁仍以既有验证要求为准。目标行为须观察有效红；相关/集成回归按原计划验证通过，不要求人为制造红。最终全量保持原计划的收尾时机，不因本节提前成为每票完成或后继解锁条件；原计划明确要求的票内验证仍全部执行。本票目标红绿、相关/集成验证及其他既有完成条件满足后，即可完成本票并解锁依赖；此时尚未到期的收尾全量保持待执行。不要仅因计划也列了最终全量命令，就把它归入本票门槛。

## 集成组的验证归属

组内状态与失败恢复先读 [integration-groups.md](../executing-plans/references/integration-groups.md)：本应通过的检查失败时阻塞归属成员或验证票及整组，失败不推进已验证基线；本节只定义验证时机，不另设状态协议。验证票失败时，验证票与组标 blocked，成员仍 awaiting_verification，validated_commit 不动，组外后继继续等待；完整字段与恢复操作只依上述单点。

普通行为票的有效红绿与原完成条件保持。获批的不可独立验证集成组，在组首记录公共行为保护基线，各票保留可运行检查与真实结果；明确延期的相关验证在组验证票统一运行通过，才能完成全组。组首保护或局部必通过检查失败不能记待验放行；编译/环境失败不作为行为红。组内记录 pending_group 与日志，不能写 tests:pass；组完成记录的 pass 指组合验证，不改写历史失败。最终全量继续在原收尾时机执行。

## 治理顺序铁律：flaky → 时长 → 选择

反序必翻车——一条 flaky 的必需检查会拖垮整条流水线的信任。先清 flaky，再治时长（拓扑>磁盘>并行），最后才考虑选择系统。

## AI Agent 测试骨架（模型边界是唯一不可逆决策）

一根窄接口隔离模型，模型是它之外唯一的依赖；边界以下全确定性：

- L0 静态 + 工具 JSON Schema 校验（schema 漂移是工具类头号故障）
- L1 harness 单测（fast）：fake model 按序弹响应；测循环控制、路由、重试、预算、护栏
- L1.5 prompt 快照（fast）：快照装配后的最终 prompt（确定性），不是模型输出
- L2 工具契约（fast）：工具=普通函数单测
- L3 回放（fast/PR）：录制回放（脱敏），周期性重录
- L4 廉价模型冒烟（PR，仅 agent 相关变更）：小模型 + 严格 schema 断言
- L5 完整 eval（nightly）：真实模型、多 trial、pass^k、按维度隔离 judge

断言纪律：`temperature=0` 不是确定性——断言面向结构与 schema，永不面向精确文本；评结果不评路径（精确工具序列断言脆弱）。

## 与验收矩阵的对接（上游分工链的一环）

- **requirement-analysis 写矩阵时**：每行标注 Lane 归属（fast/PR/nightly）——unit/docs 行默认 fast，integration 行默认 PR，perf/eval 行默认 nightly；性能行必须带阈值数字。
- **writing-plans 翻译时**：任务的失败测试步骤继承该行 Lane 归属并写明运行命令所属 lane；DB/容器类测试步骤引用 references/db-testing.md 处方（模板克隆、两速隔离），不得每测试起容器。
- **acceptance-qa 执行时**：阶段 0 装配按 Lane 选择执行窗口；nightly 行在验收报告中标注"非阻塞"。

## Red Flags

- 每测试/每文件一个容器；每测试重放迁移 → 读 db-testing.md 处方
- 用 mock 测出来的绿当集成信心 → mock 只属 fast lane，集成信心来自 PR lane 真实容器
- eval 分数波动就改断言阈值 → 先查 flaky 治理顺序，eval 属 nightly 不阻塞
- 为测试选择系统引缝 → 缝跟着真实交付边界走，1-5 人先全量

