6.3 KiB
测试用例重写合同
测试以可独立判定的行为用例为重写单位。 原测试文件只定位来源,不迁移其组织方式、全局状态或整文件“通过”结论。正式权威是测试用例清单,按主题阅读见验证设计目录。
用例及其来源
一个新版用例包含:稳定 case_id、目标位置与用例名、给定条件、触发动作、预期可观察结果、所需环境、合同依据,以及执行后的实际证据。用例可以是独立测试函数或具名参数行;代码文件只承担组织职责。完整 case_id 绑定清单中的 file、symbol,参数行通过 case_id[参数ID] 定位;不按短后缀模糊选择。Junit 输出记录稳定身份及参数身份,未实现条目保持明确状态。
清单记录当前源树中 1,213 条静态可定位的旧测试记录:1,154 个含中文名称在内的测试函数,以及 59 条脚本式检查、隐式成功守卫或入口。179 条记录含循环、subTest 或装饰器参数;这些是参数模板,不是运行实例数或通过数。127 个来源文件中有一个仅含包身份,不算测试用例。任务开始前已经删除的旧测试不恢复,也不计为这次已重写。
source_excerpt、source_observations、source_parameters 和源哈希用于核对原行为;其中可能有旧假设、仅检查源码形状的断言或不安全的测试接线。它们不是可以直接复制到新版的验收标准。目标用例的 given/when/then、合同与 rewrite_notes 定义如何重写;oracle_checks 逐项区分保留可观察行为和改写内部表示。
重写方式
| 处置 | 规则 |
|---|---|
| 保留行为 | 用独立新夹具调用新版公开接口,保留合法结果、拒绝与不变性;不照搬旧导入、表结构和全局前序状态 |
| 拆分复合用例 | 一个旧函数覆盖多个原因与结果时,列出多个新 case_id,各自具有独立给定条件;不能靠前一个测试写出的正文版本 |
| 合并重复用例 | 只有输入边界、动作、断言和环境相同才可合并;记录全部来源 ID,旧参数行不能在合并时丢掉 |
| 修改旧假设 | 明确写出旧断言为何不再适用,以及新合同要求;例如同命令异参数拒绝、种子不覆盖已启用规则、正式内容不依赖 SQLite |
| 退役形状检查 | 无对应稳定行为的文件大小、目录存在或旧脚本布局检查可以逐例退役;保留理由,不计为新测试通过 |
| 新增行为 | 为新版缺口独立增加用例,标为新增,不能冒充旧测试已保护的范围 |
早期仅三条形状检查退役(固定参考文件大小、要求 Skill 带实现 scripts、跨 Skill 重复示例标题检查)。 2026-09-10 功能裁决后扩大:旧测试绝大多数验证的是旧架构的实现形状——技能目录携带的 Python 脚本、 DSH 第二宿主与通用框架端口、旧 runtime probe、回放式评估管线、旧只读工作台渲染与 SQLite 写入路径。 这些形状在新版中已被模块化实现(S02 受控调用/预算/配置版本、原文生命周期、任务事件、能力目录)取代或由后续 工作包按新合同重新设计。据此 1,095 条逐例标记"明确退役",retirement_condition 记录功能去向 (已覆盖的新用例位置,或承接规格与工作包);退役不计通过。仍具备独立功能价值且未被覆盖的仅 "运行时无内嵌凭据"一条,已重写为静态守卫用例。后续工作包验收以各自新合同用例与接受条件为准, 不按旧用例数量对齐。
具体拆分
旧 test_accept_atomic_and_replay_idempotent 分为:首次采纳所有参与者原子提交、完全相同请求重放不重复、相同 command_id 携带不同请求拒绝。第三项纠正旧测试允许修改 expected_revision 的断言。旧 test_full_lifecycle_and_contention 分为:初始身份、旧令牌竞争、严格新轮身份、完整检查生命周期。
旧 CAS 的 PASSED 终态只承接为“该检查轮不能被迟到结果改写”,不冻结作者决策轴。旧 raw 的 rename 与文件 journal 重写为 PG 租约、完整归档事务及恢复;授权、期限与原文不丢的行为分别验证。旧固定作品号、章数、样本数和阈值进入显式夹具或版本策略,不复制到通用生产规则。
验证环境由行为决定
| 行为 | 必须使用的环境 |
|---|---|
| 纯解析、字段校验、patch、预算计算 | 离线纯输入与假时钟;禁止意外网络或数据库 |
| CAS、并发、幂等、事务回滚、约束、身份分流 | 隔离 PostgreSQL;并发使用独立连接和受控同步点,替身不能证明真实数据库语义 |
| 本地文件竞争、权限、软链接与恢复 | 独立临时目录;需要并发时用独立进程,不操作私人原稿 |
| 服务入口、任务与章后流程 | 新版真实业务包及隔离库;模型替身显式标记,不能称真实模型效果通过 |
| 作者点击、中文输入与页面重连 | 对真后端的浏览器旅程;组件测试只证明组件范围 |
| Skill 的实际角色行为 | 固定模型、宿主、资源版本和预算的真实调用;脚本化观察只证明评测管道 |
DB 用例不映射到技能索引或正文格式单测。以旧测试文件名中的 offline/db/e2e 判断环境同样不可靠;应核对它实际需要证明的行为。
逐例退出与证据
每个 case_id 的执行证据至少包含目标代码版本、环境用途、夹具/参数版本、实际收集的用例身份、结果与失败断言。参数展开后需保留稳定行 ID;不允许仅执行第一行、空收集、打印 PASS、缺环境跳过或用模拟结果填成真实通过。
旧文件只有在其全部来源用例都分别完成重写验收或有独立退役理由,并且共享夹具、脚本式检查、参数分支和导入引用均核对后才可退出。现有文件处置清单.json 的测试条目只维护 test_case_refs;目标测试位置的引用由本清单反向生成,不再维护第二份文件级测试迁移。
设计核对只能证明:源记录未漏列、用例身份唯一、字段和引用一致、关键用例的行为与合同相符。它不能证明目标测试已经实现、能够检出新缺陷,或所有迁移行为已经通过。实现阶段须分别记录测试执行和对旧反例的语义核对。