--- name: test-collaboration description: "盘点并维护项目测试资产,把需求、业务规则、风险、Bug 和跨端接口契约转成 TEST-ID 与可验证证据,生成或更新 TESTS.md。用于测试资产盘点、测试缺口分析、单元/集成/契约/E2E/冒烟分类、Bug 回归保护、前后端或多服务基于同一契约的消费者/提供者测试、测试必要性判断、测试清单维护与交付前测试证据审查。中文触发:测试盘点、测试清单、测试资产、测试缺口、测试必要性、Bug 转测试、契约测试、前后端接口测试、测试治理。English triggers: test inventory, test catalog, test gap analysis, bug-to-test, contract testing, consumer contract, provider verification, test governance." --- # 测试协作治理(test-collaboration) ## 目标 用项目根目录的 `TESTS.md` 管理两类信息: 1. **现有测试资产地图**:项目已经有哪些测试、从哪里运行、保护什么。 2. **必要测试点清单**:哪些需求、规则、风险和 Bug 必须被测试保护,当前证据是否足够。 清单管理的是“为什么测、测什么、证据在哪”,测试代码仍然是可执行事实。不要把 `TESTS.md` 写成每个测试函数的镜像。 ## 职责边界 | 资产 | 唯一职责 | |---|---| | `TESTS.md` | 测试资产、必要测试点、缺口、状态和证据 | | 测试代码 | 可执行输入、断言、fixture/fake 和边界模拟 | | `REGRESSION.md` | 模块下游、回归命令和改动后的重跑规则;只引用 TEST-ID | | Spec/Issue | 成功标准、问题现象、影响、优先级、任务状态和排期的唯一来源 | | `PROJECT_LOG.md` | 只追加测试状态变化和交付结论,不复制整个清单 | v1 由当前会话直接执行本 skill,不新增专用 agent、slash command 或强制脚本。 ## 开始前读取 按存在性读取,不要求项目拥有全部文件: 1. `TESTS.md` 与 `templates/TESTS.example.md`。 2. 项目规则和地图,如 `CLAUDE.md`、`AGENTS.md`、`CLAUDE_MAP.md`。 3. 测试目录、测试配置、CI 配置、标准测试入口和专用测试任务。 4. Spec、Bug、Issue、审计、事故或回归清单;成功标准只引用,不复制进 `TESTS.md`。 5. `REGRESSION.md`,用于对齐模块回归命令与 TEST-ID。 6. 跨端接口的机器可读契约及生成/校验入口,例如 OpenAPI、JSON Schema、GraphQL schema 或 protobuf。 先识别仓库已有的测试框架和命名习惯,不强迫项目改成统一目录结构。 ## 工作模式 ### 1. 盘点现有测试资产 首次采用时做一次全量盘点,之后按事件增量维护: 1. 找到标准测试入口,例如 `pytest`、`npm test`、`make test` 或项目脚本。 2. 扫描测试目录、配置和 CI;可以使用 collect/list 模式,但不要为了盘点执行高风险外部操作。 3. 按模块、测试套件或关键流程聚合,禁止手抄每个测试函数。 4. 标注层级、用途、为什么存在/保护什么风险、执行组、外部依赖、位置和当前判断。 5. 将资产判断为:必要、疑似重复、缺失或疑似废弃。盘点阶段只报告,不擅自删除或重写测试。 重新盘点由事件触发,不按日历机械执行: - 首次建立 `TESTS.md`:全量扫描。 - 测试目录、测试配置、CI 或标准入口变化:重扫受影响区域。 - 新增或更新 TEST-ID、Bug:增量核对相关模块。 - 重大功能、接口、业务规则或安全边界变化:重扫对应链路。 - 交付前或 `/governance-sync` 收尾:核对本次变更涉及的条目。 - 只有测试体系整体重构或地图明显失真时,才再次全量扫描。 ### 2. 把需求、规则和风险转成 TEST-ID 每个必要测试点使用稳定 ID,例如 `TEST-ORDER-001`。至少记录: - 状态:`待补`、`开发中`、`已覆盖`、`不适用`。 - 来源:需求、规则、风险、Bug 或事故编号。 - 模拟输入与业务预期。 - 层级与用途。 - 执行组和真实/模拟边界。 - 测试文件、测试节点和可执行命令。 纯模板、教程或历史方案中的示例编号不属于项目测试台账。确定性审计需要扫描这些文档时,可在文档顶部加 `` 显式声明“本文件只有示例”;活动 Spec、Issue、Bug、评审或交付证据不得用该标记逃避登记。 来源必须链接回 Spec/Issue 中的原始成功标准。`TESTS.md` 只回答“哪条证据验证它”,不得另写一份可独立漂移的业务标准。成功标准含糊时,回到需求澄清能力或请项目负责人确认,不由测试 Skill 猜测。 受控层级:`单元`、`集成`、`契约`、`E2E`、`冒烟`。 受控用途:`规则保护`、`关键链路`、`回归保护`、`专项保护`。需要多个用途时用逗号分隔,不能临时发明新值。 `不适用` 必须写理由,例如风险由 schema、类型系统或 lint 更合适地机械拦截。不能用“不好测”作为理由。 ### 3. 把 Bug 转成回归保护 修复 Bug 时,必须二选一: 1. 新增或关联一个 TEST-ID;或 2. 明确记录为什么只能人工验收,以及人工验收步骤和证据。 TEST-ID 应复现真实失败形状,而不是换成更容易通过的相似输入。记录修复前失败、修复后通过的证据;如果无法先运行旧代码,至少说明复现依据和未实测项。 没有 TEST-ID 或明确的人工出口,不得宣称 Bug 已完整闭环。 ### 4. 用同一契约驱动跨端测试 前端与后端或多个服务分开开发时,把接口契约作为测试共同输入,不让各端分别手写一份接口事实: 1. 找到仓库已有的机器可读契约,记录路径及可核验的版本、commit 或 hash;不把字段表复制进 `TESTS.md`。 2. 用同一个 TEST-ID 串起四层证据: - 契约自身:schema lint 或格式校验; - 消费方:由契约生成或校验的类型、mock、fixture 与消费者测试; - 提供方:对真实序列化后的响应或消息做契约校验,不能只验证内部 DTO 或类型; - 联调:至少一条真实跨端路径;暂时没有时明确登记缺口。 3. 每层记录实际命令、退出码和证据位置。生成类型或 mock 未重新生成、与契约不一致时,不得标为 `已覆盖`。 4. 接口需要变化时先更新唯一契约源,再重新生成消费方资产并重跑提供方与联调测试。 5. 仓库没有机器可验证契约时,标为 `待补` 或 `不可验证`,说明当前只能依赖什么证据;不能把双方各自测试为绿写成“兼容性已验证”。 契约测试证明双方是否遵守同一接口边界;E2E 继续证明真实业务路径能否工作。两者不能互相替代。 ### 5. 审查测试证据 将状态标为 `已覆盖` 前,逐项确认: 1. 测试文件真实存在。 2. 断言验证业务行为,不只是“函数被调用”或“状态码是 200”。 3. 命令可执行且退出码为 0。 4. 测试进入标准 runner,或登记为命名清楚的专用执行组。 5. 证据能对应 TEST-ID 的输入、预期和边界。 只看到测试文件、测试数量或绿色 CI,不足以证明必要规则已覆盖。 交付闭环还要确认:活跃 Spec/Issue 有明确成功标准;关键标准已关联 TEST-ID 或可复核的人工出口;证据确实验证预期行为;标准变化和本次重要结果已按活文档规则记入 `PROJECT_LOG.md`。 ## 测试设计纪律 - **标准入口优先**:先让贡献者知道“一条命令怎么跑默认测试”;慢测试、联网测试和高成本 E2E 放入命名清楚的专用组。 - **边界写清楚**:E2E 要说明哪些部分真实运行、哪些外部系统被 fake/mock,以及为什么。 - **真实故障形状**:Bug 回归测试使用导致事故的输入、路径和边界条件。 - **行为契约优先**:断言数据之间必须满足的关系和不变量,少写只会在正常更新时报警的快照、固定枚举数量或版本字面量。 - **复用 fixture/fake**:同类输入和外部边界优先复用项目已有设施,避免每个测试自造一套。 - **正反两面**:关键规则至少考虑正常输入和拒绝/边界输入;权限、安全、配置传播和文件/网络路径尤其如此。 - **真实路径优先**:涉及解析链、配置传播、安全边界、远程后端或文件/网络 I/O 时,应有真实导入和临时目录上的集成或 E2E 证据,不能只靠单元 mock。 - **契约单源**:消费者类型/mock、提供方验证和联调测试必须引用同一契约源;禁止维护多份手写字段定义。 - **序列化边界**:提供方契约测试必须检查线上实际返回形状,覆盖字段名、类型、空值、枚举、错误结构和大整数 ID 等易漂移边界。 - **规模适配**:借鉴这些纪律,不复制别的大项目的并行测试基础设施或目录规模。 ## 输出要求 创建或更新 `TESTS.md` 时使用 `templates/TESTS.example.md` 的结构,并在回复中给出: 1. 标准测试入口和测试资产概况。 2. 必要、缺失、疑似重复、疑似废弃的数量。 3. 本轮新增或变更的 TEST-ID。 4. 已实际运行的命令、退出码和未实测项。 5. 下一步只列最重要的补测动作。 盘点任务默认只修改测试治理文档。除非用户另行授权,不修改生产代码、不删除测试,也不替贡献者偷偷补实现。