测试策略

English | 中文

本文说明本仓库的分层测试方式,以及保持绿色测试套件有意义的规则。命令见根目录 AGENTS.md;相关 Agent Note 承载设计动机。

层级

会话 fixture 保留 header 与 payload,但省略正文序号/时间 envelope。回放会合成这些字段;运行时持久化不变。fixture 使用规范打包行;迁移器会改写旧布局。

spec 如何被执行

fork 出的 worker 会同时运行多个 spec 文件,coverage gate 会拆成并发的 partition,与同一个 job 中的其它 gate 并排运行,而自托管 runner 共用同一台宿主机和同一个卷。被隔离的只有进程:端口、可预测路径、外部命名空间和继承而来的子进程都不隔离。为每个占用的资源负责到它的 teardown,并把「只有单独运行时才通过」的 spec 读作该 spec 的缺陷,而不是 runner 不稳定。dsh-ci-test-reliability 负责资源分配、状态恢复、同步、超时预算、平台差异与 teardown 规则;它的 flake 诊断流程用于归类已经存在的概率性失败。

带密钥策略:推理(inference)在这里很便宜

我们是 DeepSeek,不要吝惜真实 API 测试。无密钥测试只能证明底层通路;只有带密钥运行才能证明 agent(智能体)能对接真实模型正常工作。覆盖文件写入提示词、包含多个轮次的对话、工具使用和流中取消。价值最高的是冒烟测试:启动已交付的 dsh profile、发送一条提示词,并检查外部世界;它们能捕获「单元测试全绿、产品却坏了」这一类 mock 无法发现的问题(事故复盘 0001)。自动跳过让无密钥 CI 和无密钥贡献者不受阻塞;它不是成本信号。Profile 级集成测试位于 apps/cli/tests/profiles/;包专属组合留在对应包的测试目录中。

优先使用真实实现而非 mock

只 mock 开销高或不确定的边界(LLM(大语言模型)适配器、网络、时钟);下游一切保持真实。手写替身只能证明桥接层在搬运字节,不能证明交付的工具行为符合断言。桥接工具调用测试把真实的工具注册表与执行管线保留在脚本化 mock 模型下游:makeBridgeHarness()(packages/acp/acp/tests/harness.ts)挂载 agent loop、会话存储、工具注册表与 JSONL 持久化,唯一 mock 是脚本化 MockAdapter

恢复测试按步骤区分分片前与分片后的失败,并证明失败分片不会派生出消息或工具副作用。覆盖耗尽、取消、策略组合、持久化、状态、协议计数、会关闭传输的空闲超时,以及交付的 Loader 组合。

验证外部世界,而非自我报告

e2e 断言应重新运行命令或从外部重新读取文件;对 agent 自身输出做关键词探测会让作弊的 agent 通过。断言未修改的文件逐字节一致。e2e 测试自行管理资源:在测试中创建 harness,在 afterEach 中 dispose(即使失败/重试/超时也要释放);共享 fixture 放在普通的 tests/harness.ts 中,绝不放在另一个 *.e2e.ts 中(导入一个 spec 会重新注册其 describe,导致真实 API 调用重复执行)。

测试真实入口路径

测试解析:仅限源码

测试子进程启动模式

何时需要快照测试

每项非平凡的模型可见、协议可见或人类可见变更,都在同一 PR 中添加或更新无密钥录制会话场景;包级、e2e、仅 mock 和 PR 理由证据不能取代组装后的 transcript。Headless、SDK、ACP 和 Web 录制分别位于 snapshots/session/snapshots/sdk/snapshots/acp/snapshots/web/;Web 渲染可以显式借用另一个场景的规范会话。不由录制会话驱动的预期输出保留在所属应用、包或脚本的 tests/expected/ 下,并且不使用 *.snapshot.ts 后缀。dsh-session-snapshot 拥有共享存储规则和 profile 适配器。Agent loop、会话生命周期和 SessionEventMap 变更应更新两个 SDK 投影:snapshots/sdk/ 拥有 TypeScript,必需的 Python 运行时 CI 拥有 scripts/snapshots/python-sdk-single-exe/。新增 capability seam、生命周期或 transcript 变体应在计划阶段列出每个必需层级。


版本号 #1
由 一说春秋 创建于 3 九月 2026 17:30:04
由 一说春秋 更新于 3 九月 2026 17:36:27