中文EN

dsh-test-framework

workflow已测通过npmMIT

DSH 测试工作框架:把空文件夹初始化为产品、模块、版本、报告与归档目录树,注册 7 个 test_framework_* 工具与 4 个运行时技能,并提供提示词级闸门——开测前报告需求文档拆分、版本、跨文档关联与环境账密中尚未登记的部分。需先配置 playwright MCP(无替代路径)。

下载量 / Downloads
794
依赖体积 / node_modules
0.64 MB
测试时间 / Tested
2026-11-07
DSH 版本 / Version
0.2.2-rc.1

安装

dsh plugin --profile web add dsh-test-framework

沙箱测试结果

阶段结果
1 安装✓
2 列装✓
3 挂载✓
4 启动—

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

dsh-test-framework

面向测试工程师的 DSH 插件:把一个空文件夹变成你自己的「测试工作框架」,并在 AI 会话里
自动带上框架约束、把「需求文档 → 子模块拆分 → 版本 / 跨文档关联 / 测试环境账密」这条链
做成绕不过去的闸门。
- 宿主是 cordis 插件,零第三方依赖(只用 Node 内置模块),无前端构建步骤
- 插件版本:0.2.9 | 适配:DSH(dsh.engines.dsh = "*")| Node ≥ 20

〇、前置条件(装之前先确认)

外部 MCP · 必需? · 没有会怎样

playwright MCP(mcp__playwright__browser_*) · ✅ 必需,且没有替代路径 · 「看着页面操作流程」这类验证做不了。框架铁律 10 要求「必须真实浏览器 + 真实点击/输入」,明确不许用只读 DOM / 只抓报文 / 离线脚本 / 旧截图冒充 —— 所以缺它不是"降级运行",而是"这条要求根本执行不了"。<br>插件会在会话开头的「测试框架状态」段落和 test_framework_status 输出里报「未检测到 playwright MCP(必需)」;看到就先配好再开工

keyword_mcp(接口报文落盘 / toast 历史) · 建议 · 少一条取证通道(与 playwright 互补不替代)

cr69_mcp(Chromium 69) · 可选 · 老内核 / 小视口兼容性验证做不了

配在哪:DSH profile 的 cordis.patch.yml —— 加一个 mcp-playwright 服务(serverName: playwright,

命令用 @playwright/mcp),并且必须有头(窗口可见),否则"看着"是假的。

⚠️ 改完必须重启 DSH(profile 层不热加载)。

自查:

# npm 安装的用户
npx dsh-test-framework doctor

# 在测试框架里(插件源码在 _plugin\ 下)
node _plugin\dsh-test-framework\lib\cli.js doctor

doctor 会把这三项逐个列出来("已检测到" / "未检测到" / "无法判定")。

⚠️ 口径说明:插件是靠读 profile 的 cordis.patch.yml 来判断的,"未检测到"≠"一定不存在"

(你也可能用别的方式起这个 MCP)—— 真查不到时它会说"无法判定",不会硬下结论。


一、它解决什么问题

用 DSH 做需求测试时,反复出问题的是这几件事 —— 它们不是能力问题,是纪律问题:

痛点 · 本插件的处置

新建一个文件夹就要手工搭一遍框架骨架(AGENTS.md / skills / _templates / 产品级规范 / 目录联接) · test_framework_init 一条命令生成,已存在即跳过、不覆盖

在 <产品>\<模块>\ 这种子目录里开会话,框架根 AGENTS.md 静默不加载(DSH 只认 .git 当项目根) · 初始化时建 .git 标记;并且插件另注入一段实时状态,没加载成也会明说

120 页的需求文档含 3 个子模块,AI 自己就拆了或干脆不拆 · 探针给页数/章节/菜单命中 → 命中判据就必须用 ask_user_question 让用户确认,不许自作主张

某个业务逻辑其实写在另一份需求文档里,没人问过 · 闸门 crossDocChecked:必须问过(答"没有"要落 relatedDocs: [],缺 key = 没问过)

需求文档路径不区分版本,测错版本全白干 · 闸门 versionsConfirmed,并在流程里写死"不许用文件时间判版本"

每次都要重新问一遍环境地址、账号密码、数据库地址 · test_framework_record 落产品级规范(人读的 md + 机器读的 json),下次直接命中

密码散落到脚本和报告里 · 明文只落 _框架配置\环境与账密.md,框架登记.json 里只记指针(有测试守着)

报告越堆越多,模块 report\ 里几个月前的报告还混在最新一批里 · test_framework_report_gc:满 24h 的报告移进 _archive\报告归档\<模块>\<日期>\(归档不是删除,台账记着原名与日期);agent 入口默认只预演

报告写成"密密麻麻一大长篇",看不出有几条、最严重的是哪条、差在需求哪一句 · AGENTS.md 铁律 4 + 测试报告模板硬性要求:结论先行 + 缺陷速览表在最前 + 一条缺陷一小节(≤20 行)+ 复现步骤可照做 + 每条写「需求原文依据」与「与需求不符点」

一个模块测了好几版,几版的口径/造数逻辑/坑全揉在一份 SKILL.md 里,用的时候不知道哪句对哪版 · 模块 SKILL.md 降为索引,每版一份 skill\<版本>\SKILL.md,一版一份、多版并存、互不覆盖;test_framework_module_add 传 version 就自动建好并回填索引 §8 版本索引

别的项目 / 别的工具的规矩渗进本框架 —— 它的"落盘必须在自己的工作区内"变成了本框架的规矩,于是模块里被建出一批永远装不进东西的 temps\ 空壳、模块 SKILL.md 里留下"照着做必然失败"的经验 · lib\isolation.js:① 会话开头先说清当前会话的项目根是谁、会加载哪份 AGENTS.md(嵌套仓库截断 / 找不到 .git 退回 cwd / 项目根跑到框架外,三种都认);② 模块里出现外部工具的工作目录就报,并写明正确做法(落它自己的工作区 → 证据拷回模块 data\);③ doctor 一并列出周边所有外部权威来源(别处的 AGENTS.md、.trae 规范库)


二、装插件

路线 A:从 npm 装(别人用这条)

# DSH 插件就是 npm 包 —— `dsh plugin ...` 本身就是转发给 pnpm
dsh plugin --profile desktop add dsh-test-framework

# 重启 DSH(profile 的 bundles 层与 cordis.patch.yml **不支持热加载**,不重启不生效)

装完看会话里有没有 test_framework_status 工具,或跑:

npx dsh-test-framework doctor --profile desktop

路线 B:从源码装(改代码时用这条)

cd <插件目录>
# ① 看计划(不写盘)
node lib\cli.js install --profile desktop

# ② 真装(链接安装:`link:` + 目录联接,不跑 pnpm)
node lib\cli.js install --profile desktop --apply

# ③ 重启 DSH

自检:

node lib\cli.js doctor --profile desktop

doctor 会逐项报:插件清单 / 入口 / cordis.patch.yml / Node 版本 / 找不找得到 dsh 与 pnpm /

这个 profile 里依赖与 bundles 两处是不是都有(只有一处 = 半装 = 不会加载)。

可选配置

# profile 的 cordis.patch.yml —— 把需求文档总根目录固定下来
- id: test-framework
  config:
    reqDocRoot: '<你的需求文档总根目录>'

不配也可以:省略时按「插件配置 → 环境变量 DSH_REQ_DOC_ROOT → <用户主目录>\需求业务文档」解析。

插件里没有写死任何绝对路径(有测试守着这一条)。

默认为什么不跑 dsh plugin add

默认走的是「链接安装」:备份 package.json → 给 dependencies 和 dsh.profile.bundles

各加一条 → 在 node_modules 里建一个目录联接。link: 依赖的本质就是这个联接,

所以这条路和 pnpm 的产出等价,但不碰整棵 node_modules。

dsh plugin add 会在 profile 目录里真跑一次 pnpm install。实测本机 desktop profile 的

node_modules\@deepseek-ai 处于两个 dsh 版本混链的状态(profiles\node_modules 下

0.1.1-rc.2 与 0.1.5-rc.3 混着指),一次 pnpm install 很可能把这棵树"规范化"掉、

连带影响正在运行的 DSH。装一个小插件不值得冒这个险。

要用官方命令(或补跑 pnpm):

# 官方命令:会真跑 pnpm install
node ...\cli.js install --profile desktop --apply --official
# 链接安装 + 之后再补跑一次 pnpm install
node ...\cli.js install --profile desktop --apply --pnpm

关于本机有多个 dsh

本机 npx 缓存里有 4 个 dsh(0.2.0-rc.2 / 0.1.7-rc.1 / 0.1.5-rc.3 / 0.1.1-rc.2),

而 profile 的 node_modules 是混链的。所以 doctor / install 挑 dsh 的顺序是

PATH → 这个 profile 自己链的那个 → npm 全局 → npx 缓存(版本降序),并把候选全列出来;

要指定就 --dsh <dsh.cmd 路径>。

(找 profile 自己链的那个时要查两层:<profile>\node_modules 与

<dshHome>\profiles\node_modules —— 本机 @deepseek-ai\dsh 挂在上一层,只查自己那层会挑错版本。)

怎么确认真装上了:重启后新开一个会话,看 skill 列表里有没有 test-framework-onboard、

工具列表里有没有 test_framework_status;或直接说一句"看下测试框架状态"。

(本次装到 desktop profile 后无需重启就已生效:会话的 skill 目录里已出现 4 个

test-framework* skill,dsh --profile desktop --dump-config 里能看到 - id: test-framework。)

卸载

node lib\cli.js uninstall --profile desktop

只摘掉 profile 的依赖与 dsh.profile.bundles 条目(改前一定先备份成 package.json.bak-testfw-<日期>),

并摘掉手动建的那个目录联接(不然会留下一个指向已卸载插件的死链接)。

不动框架工作区里的任何文件 —— 卸载插件 ≠ 删框架。


三、装完能得到什么

3.1 七个工具

工具 · 干什么

test_framework_status · 开工前先调它。返回框架根、产品与模块、登记到哪一步、还缺哪些项。ready: false 时不许直接开测

test_framework_init · 把(空的)文件夹初始化成框架骨架。dryRun: true 只看计划

test_framework_module_add · 新增一个模块(= 系统里的一个叶子菜单;父菜单不建目录、只作菜单路径):建 requirement/final/report/data/skill + 渲染模块索引 SKILL.md + 传 version 时再建 skill\<版本>\SKILL.md(一版一份,互不覆盖)并回填索引 §8 版本索引,最后同时回填框架根 AGENTS.md §三 与产品级 模块路由.md

test_framework_link · 跨端关联的只读体检(不改任何文件):查 关联边两端模块是否存在 / 单向边(只有 A→B 没有 B→A)/ **

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:13,最后更新 2026-10-19

链接

GitHub · Homepage · npm

同类插件