DSHIO-TEST · 测试标准
六道关卡,从静态检查到工具调用。每一关都有明确判定,不通过就标不通过,测不了就标「未测」。
为什么测这些。
插件「装得上」不等于「能用」。我们在 122 个头部插件里实测,14% 装不上;
而装上的里面,还有一部分装了但没加载(静默失效)、加载了但工具调不通。
这六关就是从「能装」推到「能用」的阶梯。每往上一关,排除一类失败。
这六关就是从「能装」推到「能用」的阶梯。每往上一关,排除一类失败。
六道关卡
| 级别 | 名称 | 测什么 | 判定 | 网络 |
|---|---|---|---|---|
| T0 | 静态 | manifest 合法性、字段完整、engines.dsh 声明 |
可解析且无封顶 | — |
| T1 | 安装 | dsh plugin add |
命令退出码 0 | 有 |
| T2 | 列装 | dsh plugin list |
出现在依赖列表 | 断网 |
| T3 | 挂载 | dsh --dump-config |
出现在配置树 | 断网 |
| T4 | 启动 | 启动 profile,观察 12 秒 | 进程存活且无致命错误 | 断网 |
| T5 | 工具调用 | 调用插件声明的工具 | 不抛错、不超时 | 断网 |
T2-T5 为什么断网。
安装需要下载依赖,所以 T1 必须有网。但安装完成后,T2-T5 全部在
--network none
的容器里跑 —— 这样即使插件有恶意行为,也无处可发。这是我们的安全边界,也是与只测安装的
方案最重要的区别。T0 · 静态检查
不运行代码,只读文件。这一步能拦掉大部分「根本装不上」的包。
| 检查项 | 不通过的后果 |
|---|---|
package.json 可解析 | 整个测试中止 |
dsh.bundle.patch 存在 | 无法被 DSH 识别 |
patch 指向的文件存在 | 加载时失败 |
private 不为 true | 不可发布 |
engines.dsh 无上界 | 标 VERSION_GATE 风险 |
T1 · 安装
dsh plugin --profile web add <package>
在干净 profile 里执行,超时 180 秒。退出码 0 且依赖树完整即通过。
T2 · 列装
dsh plugin --profile web list
插件出现在依赖列表。这一步区分「下载了」和「注册进 profile 了」。
T3 · 挂载
dsh --profile web --dump-config
插件出现在最终配置树里。这一步能抓出 静默失效 —— 装了、也在依赖列表里, 但因为槽位冲突或 manifest 问题,根本没进配置树。
T4 · 启动
启动 profile,观察 12 秒。进程存活且无 exit、无致命异常即通过。
这一步能抓出:ESM 模块缺陷、依赖注入失败、初始化抛错。
T5 · 工具调用
这是最能区分「加载了」和「能用」的一关。
怎么测
- 从
--dump-config里取出该插件注册的工具名和参数 schema - 按 schema 生成一组最小合法参数(必填字段给默认值,字符串给
"test",数字给0) - 调用一次,超时 10 秒
- 不抛错、不超时即通过
测不了怎么办
拿不到工具列表 → 标「T5 未测」,不标失败。
有些插件只提供 UI 或后台服务,不注册工具;还有些插件的工具 schema 无法从配置树解析。
这两类情况一律标「未测」,不影响质量等级上限(见 DSHIO-GRADE 的 C 级)。
这条规则很重要:把「测不了」当成「不合格」,是很多评级体系的通病。
这条规则很重要:把「测不了」当成「不合格」,是很多评级体系的通病。
失败分类
每个失败的测试都要归入下面九类之一。这是 DSHIO 与其它目录最不一样的地方 —— 别人告诉你「失败」,我们告诉你为什么失败。
| 代码 | 含义 | 通常出现在 | 谁的问题 |
|---|---|---|---|
VERSION_GATE | DSH 版本不匹配,插件被跳过 | T1-T3 | 作者 |
ESM_DEFECT | ESM 模块加载器缺陷,模块被判不可加载 | T4 | 作者/DSH |
SLOT_CONFLICT | Loader Entry ID 与已装插件重复 | T3 | 作者 |
SILENT_FAIL | 装上了但没进配置树,无报错 | T3 | 作者 |
ENV_MISMATCH | Node / pnpm 等基础环境不匹配 | T1 | 作者 |
NPM_404 | 包在 registry 上不存在 | T0-T1 | 作者 |
NO_TOOL | 未声明任何工具(T5 未测) | T5 | — |
T5_ERROR | 工具调用抛错 | T5 | 作者 |
T5_TIMEOUT | 工具调用超时 | T5 | 作者 |
报告格式
每次测试产出一份 JSON,字段固定:
{
"plugin": "dsh-pet",
"version": "1.2.3",
"dsh_version": "0.2.2-rc.1",
"tested_at": "2026-11-06T07:20:00Z",
"stages": {
"T0": { "pass": true, "ms": 120 },
"T1": { "pass": true, "ms": 8600 },
"T2": { "pass": true, "ms": 900 },
"T3": { "pass": true, "ms": 2100 },
"T4": { "pass": true, "ms": 12000 },
"T5": { "pass": true, "ms": 2400, "tool": "pet_feed" }
},
"verdict": "pass",
"failure_code": null,
"evidence": "results/dsh-pet-0.2.2-rc.1.json"
}
自己跑一遍
我们的测试环境是 Docker + 精确版本的 DSH。作者可以本地复现:
docker run --rm --network host -v $PWD:/work dsh-sandbox:5.0 \ bash -lc 'dsh plugin --profile web add <your-package>'
我们承诺与不承诺
| 承诺 | 不承诺 |
|---|---|
| T2-T5 全程断网 | 不做安全认证(那是另一套体系) |
| 每个失败都归类 | 不评测功能是否正确(只测「能调通」) |
| 测不了标「未测」,不标失败 | 不保证覆盖所有使用场景 |
| 报告可复核 | 不对插件的行为后果负责 |
版本历史
| 版本 | 标准号 | 发布日期 | 变更内容 |
|---|---|---|---|
| v1.0 | DSHIO/T 02—2026 | 2026-11-06 | 首次发布 |
条款变更时版本号递增,旧版本保留可查。