前言¶
写 DeepSeek Harness(DSH)插件时,很多回归问题不会在本地单元测试里立刻暴露:工具 schema 是否过了真实注册表、事件序列是否完整、异常注入是否会崩溃、并发重入是否稳定、挂载后是否留下非预期足迹。这些问题通常要放进 DSH 管线里才能验证。
dsh-windtunnel 就是为这个场景准备的:它把“模型决策”换成剧本,但保留 DSH 真实管线,让插件作者在零 API key、零网络、确定性的环境里跑契约回归。
这是什么¶
dsh-windtunnel 是 DSH 插件,仓库所有者为 BotonJ,当前版本为 0.1.0,许可证为 MIT。
它的一句话定位是:给 DSH 插件作者的契约回归测试舱。
它主要解决三类问题:
- 插件契约是否稳定:加载、注册、校验、渲染、取消等契约问题。
- 行为是否可断言:工具调用、结果返回、会话事件序列是否符合预期。
- 回归是否可进 CI:不依赖真实模型、不依赖网络、结果确定。
它的核心方式是“剧本适配器驱动真实管线”:插件看到的调用可以来自剧本,但插件所进入的 DSH 管线是真实运行的。这样可以在不消耗真实 API key 的情况下,测试插件在管线中的契约与行为。
它能做什么¶
下面介绍已核实的测试能力。
分层测试¶
dsh-windtunnel 提供四层测试:
L0 加载L1 契约L2 行为L3 注入
具体检查点¶
根据已核实功能,它支持以下检查:
非 ctx 足迹快照差分会话事件序列断言并发重入测试负向用例 expectFail 支持隔离子进程执行与崩溃隔离CLI 与 bundle 两种使用方式
边界声明¶
这里需要明确它的边界:
dsh-windtunnel 是契约回归网,不是效用测试床。
它验证的是“当工具以给定参数被调用时,管线是否产出预期事件流和结果”,不证明真实模型会主动、正确地调用工具。
安装与启用¶
安装到指定 profile:
dsh plugin --profile <name> add github:BotonJ/dsh-windtunnel
安装后有两种使用方式。
CLI 方式¶
CLI 方式更适合 CI。它直接运行用例,并输出报告:
node bin/windtunnel.mjs cases --timeout 90000 --md report.md
退出码含义:
0:全部通过1:存在失败
bundle 方式¶
bundle 方式用于在 DSH 对话内触发。插件装进 profile 后,对 DSH 说:
帮我跑一下插件风洞
模型会调用 windtunnel_run 工具执行测试。
典型用法¶
写一个用例¶
用例文件放在 cases/ 下,例如:
cases/xxx.case.mjs
用例对象需要包含以下字段:
name
profile
disableRows
tools
sutPatch
script
expect
其中:
name:用例名profile:使用的 profiledisableRows:需要禁用的适配器行tools:本次测试关注的工具sutPatch:被测插件补丁配置script:剧本输入expect:预期断言
路径解析上,用例里涉及路径时一律以 import.meta.url 相对解析,不要硬编码绝对路径。
使用负向用例¶
如果某个用例的预期是“违约应该被捕获”,可以加上:
expectFail: true
此时结果语义会反转:
- 红色结果表示正确捕获了契约违约或断言失败,用例通过。
- 绿色结果反而意味着风洞没有检测到预期失败,用例失败。
适合用负向用例检查这类问题:声明了超时却忽略取消信号、对畸形输入处理不完整、渲染结果不完整、事件序列缺失等。
执行模型¶
dsh-windtunnel 的执行模型强调隔离:
- 被测插件在隔离子进程中运行。
- 风洞宿主负责编排与断言。
- 被测插件崩溃时,子进程退出,风洞仍可收集结果并输出报告。
- 子进程内禁用真实网络适配器,配置上通过
overlay disabled: true禁止出网。
这意味着测试环境更接近“物理上无法出网”的隔离状态,适合做确定性回归。
适用场景¶
它适合以下使用者:
- 写 DSH 插件的作者
- 需要维护插件契约的开发者
- 想把插件回归测试放进 CI 的团队
- 想检查事件序列、工具契约、注入失败、并发重入的插件维护者
注意事项¶
使用前需要注意权限和安全边界。
权限¶
被测插件会在子进程中以全权限执行。
因此,在把未审源码放进风洞前,应先完成静态安检,再进入风洞测试。已核实的要求是:先过 sentinel 静态安检,再进风洞。
安装前检查¶
安装前应检查:
- 源码
- 许可证
- 依赖关系
- 插件入口文件
- 用例中引用的被测插件路径
已知局限¶
dsh-windtunnel 有以下已知局限:
- 效用缺口:不证明真实模型会主动、正确地调用工具。
- 双行重挂载是代理测法。
- 足迹快照是
best-effort。 rc期 DSH 违约变更可能先打到风洞自身。
开发与自测¶
本地开发时可以使用以下命令:
node --test test/engine.test.mjs
运行狗食用例:
node bin/windtunnel.mjs cases
运行用例需要本机已经安装 DSH CLI。
结尾¶
dsh-windtunnel 的价值在于把 DSH 插件的契约问题变成可重复、可断言、可进 CI 的检查。它不替代真实模型效用测试,而是给插件作者一张明确的回归网:哪些契约坏了,哪些事件缺了,哪些注入会崩,哪些负向用例本该失败,都能在本地跑出来。
GitHub 仓库:
- https://github.com/BotonJ/dsh-windtunnel