| name | test |
| description | 对功能、修复、迁移或交付承担完整测试责任:从真实风险形成可执行 TestPlan,建立可观察环境,亲自运行自动化、API、CLI、数据库、日志、浏览器或完整用户旅程,追到真实终态,交付能独立审查和重放的 Test Report。用于实现前定义怎样才算证明、实现后验证受影响行为、重放原始缺陷、补齐 partial/blocked/not-run 测试、执行 E2E,或回答"到底测了什么、还有什么没测、现在能否交付"。极小机械改动只需一个聚焦检查时保持轻量;只要求代码评审、实现或解释时不触发。 |
test
把测试做成一条闭环的证据链
测试从"什么可能失败"开始,到"现实中实际发生了什么"结束。TestPlan 说明准备怎么证伪这次变更,执行把计划变成观察,Test Report 让每个结论回到真实动作和终态。计划、执行和报告共享同一份风险模型;缺了任何一段,绿色状态都可能只是走个过场。
HTTP 200、命令退出零、源码看起来正确、页面显示完成,都只是中间信号。在它们跟用户结果、持久化状态、下游消费者或外部系统终态对上之前,不算通过。
先锁定被测对象
当前 Session 已宣布 Active Task 时,先读它的 task.md、Git 意图、Task Operating Envelope 和 Artifact Map;要把本轮验证纳入持久状态时,在执行测试前用 longrein task work start 建立工作单元。Task Command 失败时不直接编辑 Runtime 核心文件。开始前再核验实际被测对象:repo、worktree、inspected revision、未提交差异、构建物或镜像,以及运行中的代码究竟来自哪里。对象无法确认且会改变结论时,只暂停依赖它的用例;不要在错误分支、旧进程或共享生产数据上制造精确但无效的证据。
读取项目规则、已有测试入口、历史 TestPlan/Test Report 和稳定的环境说明。缺少能执行测试的入口、页面、数据约定或回读方式时,主动调查真实系统并补齐本轮需要的信息;只保存已确认事实,不为规划方便编造环境。
测试结论的范围不能超过实际接触到的系统。源码推断、旧报告和相邻环境可以帮助选择测试,但不能冒充本轮执行证据。
从风险反推 TestPlan
同时读用户承诺、原始缺陷、实际 diff、公共契约、数据与状态模型,以及全部受影响消费者。不要只测新增分支:权限、文件、共享模型、状态字段或公共接口被重构后,依赖它们但表面行为不变的操作也属于回归范围。
测试风险来自 Task Operating Envelope,不是通用极端情况清单。覆盖 normal range 和有证据的 credible edge;explicit exclusion 且证据支持的场景不生成关键用例。若项目现实推翻当前包络,记录冲突并交给 shape 修订任务承诺,不能一边扩大风险模型一边继续宣称原 TestPlan 完整。
每个关键场景分配稳定用例 ID,写到能直接执行:环境与身份、前置数据、字面输入、请求或操作、预期行为、终态观察面、失败处理、清理和证据边界。缺陷修复必须保留原始失败输入;能安全获得修前基线时,计划同时证明"修前失败、修后通过"。
覆盖密度随风险变化。执行前反过来攻击计划:如果产品仍有缺陷,这套检查是否可能全部变绿?是否只验证了触发,没验证终态?是否只覆盖作者想到的路径?是否仍需测试者现场发明输入或步骤?发现这种缺口就先修计划。详细风险镜头和用例契约见 test-evidence-chain.md。
独立性随风险增加:低风险变化可以由当前上下文按计划执行;高风险、强路径惯性或测试设计争议使用新上下文复核风险与计划;只有独立 Agent 能实质减少共同盲区、平台允许且成本值得时才使用。独立复核必须从原始需求、diff 和运行证据重建判断,不继承作者的结论或预期答案。
实现前已经写过计划时,完成代码后按实际 diff 重画风险。计划是参考,不因为写得早就拥有更高权威。
建立可观察性,再亲自执行
在授权范围内准备真实可用的服务、身份和数据。必要时建立本地服务、隔离数据库、临时路由、日志查询、只读回读或最小 harness。mock、stub 和静态 schema 只能证明相应层级;要声称真实边界成立,就把请求发到真实目标上。
每个用例先留下可重放动作和实际观察,再写结论;同时保存终态回读、清理确认,以及本项能证明和不能证明的边界。
异步任务、回调、通知和计划执行必须声明观察窗口与终态来源。触发成功但 Manager、数据库、接收方或审计尚未到达预期终态时,只能是 partial。
负向检查说明观察了哪个来源、多久、预期缺少什么信号。无法可靠证明"没有发生"时保留证据缺口。出现不稳定结果时记录每次运行与环境,不把红色重跑到绿色后删除历史。
环境、权限或依赖缺失只阻塞依赖它的用例,其余安全且独立的测试继续。旧证据只有在影响分析确认新差异未触及其入口、路径、数据、依赖或终态时才可沿用;不为无关更新机械重跑,也不用旧证据覆盖已改变的行为。
每个用例都要有明确结果
TestPlan 中每个用例 ID 在覆盖台账中恰好出现一次:
passed:实际证据直接支持完整预期;
failed:实际行为与预期冲突;
partial:已执行,但缺少计划要求的步骤、终态、回读或清理证明;
blocked:明确的环境、权限、依赖或输入使它当前无法执行;
skipped:经过风险判断主动不执行,并说明因此不能声称什么。
"not run"必须归入 blocked 或 skipped,不能静默消失。总体结论不靠通过率平均:关键用例失败就不能交付;关键证据缺失就降低结论;只有风险、证据和残余缺口共同支持时才能说测试通过。
Test Report 的总体状态使用 passed | failed | partial | blocked:全部关键结论有直接证据才是 passed;确认存在产品失败是 failed;已取得部分有效证据但仍有关键缺口是 partial;关键环境或输入使测试无法建立有效结论是 blocked。
测试发现产品问题时,保存精确失败、证据和重测范围。用户同时要求修复时,先进入 dev,再重跑受影响用例;不要在 Test Report 中悄悄改产品并给自己判绿。
交付能独立审查的 Test Report
报告正文必须让读者不打开源码、不翻十几个附件,也能知道实际测了什么、怎么测、发生了什么、还有什么不能确定。它要固定被测对象与环境,列出覆盖台账和逐用例证据,交代所有 partial/blocked/skipped、失败与重测范围、清理证明、证据入口和仍在运行的临时状态;存在持久 Task Context 时标明相关 revision。
大日志、响应体和截图留在证据目录,正文解释它们证明什么并给出可打开路径。只有"上传通过"、passed 列表、缺陷名称或结果文件索引的文档,不是 Test Report。
非平凡测试、完整 E2E、跨系统变化或正式报告必须读取 test-evidence-chain.md 的完整计划、执行与报告契约。
比例、产物与边界
极小、低风险且一个聚焦命令就能完整证明的改动,不需要制造完整测试仪式,但仍要保存命令、结果和证据边界。困难测试可以按价值缩减,不能把未执行包装成已证明。
当前 Session 有 Active Task 且需要保存或交接时使用:
<task-workspace>/test/
├── test-plan.md
├── test-report.md
└── evidence/
test-plan.md 遵循 TestPlan 产物 demo,test-report.md 遵循 Test Report 产物 demo。两个 Demo 分别是计划和报告结构的唯一来源;正文与 test-evidence-chain.md 只定义测试判断和证据要求。
一次性 harness、临时 fixture、截图和本地重放脚本默认属于证据,不自动进入产品提交。仓库级回归测试若用于永久保护已承诺行为,则属于实现资产,不能仅因它在本轮验证中创建就自动删除;是否新增或提交仍服从用户授权和项目规则。凭据只安全引用,不写入报告。
完成时,关键风险都有直接证据,所有计划用例都有状态,失败和未执行范围可以重放,清理与环境交接已经说明。存在 Active Task 时,先写完 TestPlan、Test Report 和证据,再用 longrein task artifact 登记产物,用 task evidence 更新每项 Completion Evidence;测试推翻任务事实或既有产物时,先修订真正拥有结论的产物,再用 task finding 或相应 task artifact 登记。最后用 task work finish --status verifying 记录结果,阻塞时使用 task work block。Runtime 更新 Current Work、Artifact Map 与 Task Timeline,Test 不直接编辑核心状态文件。没有 Active Task 时在对话中交付,或只写用户指定的路径。最后把 TestPlan、Test Report 和关键证据路径告诉用户。