深枭 DeepOwl 使用手册
DeepOwl 把「文档索引 → 需求分解 → 用例生成 → 夜间执行 → 报告」串成一条可无人值守的测试流水线。 设计目标与架构说明见根目录 README.md。
1. 环境与安装
| 项 | 要求 |
|---|---|
| 运行时 | Bun ≥ 1.1(首选)或 Node ≥ 22.5 / Deno ≥ 2.2(走 node:sqlite) |
| SQLite | 需带 FTS5 与 trigram 分词器;Bun 与 Node 22+ 内置的 SQLite 均满足 |
| 浏览器 | 本机已安装 Edge 或 Chrome 即可,无需下载 Playwright 浏览器 |
| 依赖 | playwright-core(已随仓库声明,bun install 即可) |
| 图标 | ui/icon.svg 为唯一设计源;bun run scripts/make-icon.ts 用本机 Edge 渲染成多尺寸 src-tauri/icons/icon.ico |
bun install # 依赖走国内镜像(bunfig.toml 已配置 npmmirror)
bun link # 可选:把 `deepowl` 注册到全局 PATH
bun run bin/deepowl.ts doctor # 环境自检:运行时 / FTS5 / 浏览器 / LLM / 配置
下文所有 deepowl <命令> 等价于 bun run bin/deepowl.ts <命令>(未执行 bun link 时用后者)。
配置:deepowl.config.json(deepowl init 可重新生成)。所有键都有默认值,环境变量优先级更高:
| 环境变量 | 作用 |
|---|---|
DEEPOWL_LLM_BASE_URL / DEEPOWL_LLM_API_KEY / DEEPOWL_LLM_MODEL |
规划阶段使用的 OpenAI 兼容端点(DEEPSEEK_API_KEY 亦可) |
DEEPOWL_BASE_URL |
被测系统基址(goto 的相对路径基于它) |
DEEPOWL_BROWSER_CHANNEL / DEEPOWL_HEADLESS |
浏览器通道(auto/msedge/chrome)与无头开关 |
DEEPOWL_DB / DEEPOWL_ARTIFACTS / DEEPOWL_DOC_ROOTS |
索引库、产物目录、文档根(逗号分隔) |
DEEPOWL_CRON / DEEPOWL_PLAN_FILE |
夜间调度 cron 与默认方案文件 |
DEEPOWL_WECOM_WEBHOOK / DEEPOWL_WEBHOOK |
企业微信 / 通用 webhook 推送 |
2. 模块一:文档索引(非 RAG)
历史文档(Markdown / txt / HTML / docx / xlsx / pptx / PDF)统一转成 Markdown,按标题切分成片段,
写入 SQLite 的 FTS5 全文索引(tokenize='trigram',中文按 3 字符子串检索,BM25 排序)。
不涉及向量嵌入、不做语义检索。
deepowl docs index # 增量索引(按内容 sha256 判断,未变更则跳过)
deepowl docs index --rebuild # 全量重建
deepowl docs search "登录 验收标准" --limit 5
deepowl docs read examples/requirements/login.md
deepowl docs read 账号锁定 # 也可用关键词定位文档
- 索引库:
.deepowl/docs.db(含documents/chunks两张表 +chunks_fts外部内容表)。 - 转换缓存:
.deepowl/converted/<sha>.md,便于人工核对转换质量。 .docx/.xlsx/.pptx由内置的零依赖 OOXML 解析器处理;解析失败或遇到 PDF 时回落到markitme/markitdown/pdftotext(需自行安装,缺失时给出明确提示)。
2.1 作为 MCP 服务器接入 DSH
deepowl docs mcp-config --write # 生成 .deepowl/mcp.json
deepowl docs mcp # stdio MCP 服务器(JSON-RPC 2.0)
暴露两个工具:search_docs {query, limit?, pathPrefix?}、read_doc {path, maxChars?}。
把它注册进 DSH / 任意 MCP 客户端后,Agent 在写计划、拆需求时就能自动检索历史文档。
3. 模块二:需求分解与用例生成
deepowl plan --topic "登录" --title "登录功能测试方案" # 按主题从索引里检索语料
deepowl plan --doc examples/requirements/login.md # 指定索引内文档
deepowl plan --doc "D:\需求\支付与退款需求.docx" --title "支付方案" # 直接指定/上传需求文档(无需先建索引)
deepowl plan --doc a.md --doc b.docx --doc c.pdf # 多份文档一起作为语料
deepowl docs list # 列出已索引文档(GUI 的勾选清单同源)
语料来源三种用法(可组合,--doc 给出时只用手动指定的文档):
| 方式 | 说明 |
|---|---|
| 主题词检索 | --topic 从索引中按 FTS5 检索相关片段,未命中回落到库里前 N 篇 |
| 勾选已索引文档 | 桌面客户端「② 测试方案 → 文档来源」里勾选(deepowl docs list 同源) |
| 指定 / 上传文档 | 命令行 --doc <路径>,或桌面端「添加需求文件…」/ 直接粘贴路径;md / txt / html / docx / xlsx / pptx / pdf 都支持,索引里没有的会现场转换,因此临时拿到一份 Word 需求也能直接出方案 |
流程:从索引中取相关文档(plan.topDocs / 片段截断)→ 调用 LLM 产出三级结构
(功能模块 → 测试项 → 验收标准,RequirementItem)→ 分批生成测试用例(PlannedCase)→
计算需求追溯矩阵(covered / partial / missing)→ 落盘:
plans/<slug>.md:人类可读方案(测试范围、追溯矩阵、用例清单)+ 每个用例的deepowl-case围栏 JSON。plans/<slug>.plan.json:机器可执行副本(TestPlan)。
用例步骤使用受控 DSL(goto/click/fill/press/select/expectText/expectVisible/expectUrl/wait/screenshot),
target 写页面上的可见文案(如「登录按钮」),不写 CSS 选择器——执行时由 DOM 快照解析成 locator,页面改版时更耐改。
4. 模块三:浏览器执行
bun run examples/demo-app/serve.ts # 启动演示应用(另一个终端)
deepowl run examples/test-plan.example.md # 无头执行
deepowl run plans/login.plan.json --shards 4 # 分片并行(多个 context 同时跑)
deepowl run examples/test-plan.example.md --case TC-LOGIN-002 --headed
- 驱动:
playwright-core+chromium,通道按msedge → chrome → chromium自动探测,本机有 Edge/Chrome 就零下载。 - 定位:每步先取 ARIA 快照(
ariaSnapshot)解析出带ref的元素表,再按「精确 → 包含 → 关键词+角色」匹配 目标文案,最终用getByRole(role, { name })定位;匹配不到时抛错并列出候选元素,便于修正用例描述。 - 失败即整例重试(
runner.retries),重试仍失败则截图留档到artifacts/runs/<runId>/。 - 显式操作为主(
click/fill/press)保证回归稳定;需要探索性验证时,把「让 Agent 自主操作」交给 DSH 的 子代理(隐式操作),两者可并存。
5. 模块四:夜间调度
deepowl night # 立即跑一轮:执行 + 报告 + 推送
deepowl night --plan plans/x.md --case TC-A,TC-B # 只跑指定用例(回归/调试子集)
deepowl daemon # 常驻进程,按 schedule.cron 到点触发
deepowl task install --start 02:00 # 注册 Windows 任务计划程序(免常驻)
deepowl task install --dry-run # 只生成 XML 并打印注册命令,不动系统
deepowl task query
- cron 为 5 段「分 时 日 月 周」;日与周同时限定时按 cron 语义取 或。
- Windows 任务计划:
deepowl task install生成.deepowl/DeepOwl-Nightly.xml并调用schtasks /Create /F, XML 内已设置StartWhenAvailable、WakeToRun、IgnoreNew。 - 执行机需保持登录但可锁屏:注销状态下浏览器自动化可能受限;这也是任务计划里带「锁屏不注销」说明的原因。
6. 模块五:报告与推送
deepowl report # 合并最近 5 次运行
deepowl report --run 20261002-020000
deepowl report --all --title "十月夜间回归汇总"
报告落 reports/nightly-<时间戳>.md,含:执行摘要(总数/通过/失败/跳过、通过率、分模块统计)、
失败用例详情(用例ID|失败步骤|错误信息|截图路径)、新增缺陷建议(按「失败动作 + 归一化错误签名」聚类)。
推送通道在 report.notify 配置:
"notify": [
{ "type": "wecom", "url": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx", "timeoutMs": 10000 },
{ "type": "generic", "url": "https://your.jira-or-ci/hook", "timeoutMs": 10000 },
{ "type": "file", "dir": "reports/pushed", "timeoutMs": 10000 }
]
单个通道失败不会中断流水线(结果里记录原因)。
7. 产物与目录
artifacts/runs/<runId>/run.json 每次运行的完整结果(含每步状态、ref、耗时、截图)
artifacts/runs/<runId>/*.png 失败截图与显式 screenshot 步骤的产物
plans/<slug>.md|.plan.json 测试方案
reports/nightly-*.md 夜间报告
.deepowl/docs.db 文档索引(FTS5)
.deepowl/converted/*.md 转换后的 Markdown 缓存
8. 常见问题
| 现象 | 处理 |
|---|---|
配置有误:... |
按提示修正 deepowl.config.json;deepowl doctor 会打印解析后的关键项 |
| 检索不到中文 | 查询串 < 3 字符会退化为 LIKE 匹配;先确认已 deepowl docs index |
LLM 调用报 未配置 apiKey |
设置 DEEPOWL_LLM_API_KEY,或 plan.llm.apiKey |
未找到可用浏览器 |
装 Edge/Chrome,或 DEEPOWL_BROWSER_CHANNEL=msedge 指定通道 |
| 元素定位失败 | 报错会给出候选快照元素:把用例 target 改成快照里的可见文案 |
| 夜间任务没跑 | deepowl task query 看状态;确认执行机未注销、StartWhenAvailable 生效 |
9. 离线部署(制品包)
目标机没有 Bun、没有 npm、没有外网时,用 deepowl pack 打一个自包含离线包:
deepowl pack --zip # 产出 dist/deepowl-<版本>-win32-x64/ 与同名 .zip
deepowl pack --zip --with-browser # 额外把本机 Edge/Chrome 目录打进包(无浏览器环境用)
deepowl pack --zip --with-gui # 额外打进桌面客户端 DeepOwl.exe(需先 cargo build --release)
deepowl pack --out D:\pkg # 指定输出目录
deepowl pack verify dist/deepowl-* # 按 manifest.json 逐个 sha256 校验完整性
包结构:
deepowl-<版本>-<平台>-<架构>/
deepowl.cmd 启动器(自带 runtime\bun.exe,可在任意项目目录里执行)
deepowl.ps1 PowerShell 版启动器
install.cmd 确认后把包目录加入「用户 PATH」,全局可用 deepowl
uninstall.cmd 从 PATH 移除
OFFLINE.md 离线安装与使用说明
manifest.json 版本/平台/文件清单(sha256)
runtime/bun.exe Bun 运行时(目标机无需另装)
app/ 本工具本体(bin/ src/ node_modules/ 配置与示例)
browser/ --with-browser 时的浏览器副本
目标机操作:
:: 免安装:解压后在任意项目目录执行
D:\deepowl\deepowl.cmd doctor
D:\deepowl\deepowl.cmd docs index
D:\deepowl\deepowl.cmd run plans\test-plan.md
:: 或安装到 PATH(需重开终端生效)
D:\deepowl\install.cmd
deepowl doctor
要点:
- 启动器会设置
DEEPOWL_HOME为包根目录:包内app/deepowl.config.json作为默认配置层(优先于内置默认值、 低于目标机当前目录里的deepowl.config.json与环境变量)。索引库、artifacts/、reports/仍生成在执行命令时所在目录。 --with-browser会把包内浏览器路径写入配置(runner.browserExecutablePath,相对包根解析); 也可用DEEPOWL_BROWSER_EXECUTABLE_PATH临时指定。- 完全离线时不能用云端 LLM:把规划阶段指向本机 OpenAI 兼容端点,例如
set DEEPOWL_LLM_BASE_URL=http://127.0.0.1:8098/v1+set DEEPOWL_LLM_MODEL=local(本地 llama.cpp 亦可)。 - 包内
node_modules只含运行时依赖闭包(不含 typescript 等 devDependencies),因此包内不能跑tsc。
10. 桌面客户端(GUI)
除 CLI 外还有一个 Windows 原生窗口程序(Tauri v2 / Rust,位于 src-tauri/,前端为仓库根 ui/ 的静态页面,
不依赖 npm 包)。它是薄壳:所有能力仍由同一个 CLI 提供,GUI 负责把索引、方案、执行、报告串成可视化工作台。
cd src-tauri && cargo build --release # 产物 src-tauri/target/release/DeepOwl.exe(首次编译较久)
cd .. && bun run bin/deepowl.ts pack --with-gui --zip # 把 exe 一并打进离线包
D:/Develop/workspace/gitonline/CoderLife/DeepOwl/src-tauri/target/release/DeepOwl.exe # 直接运行
界面分四个工作区:
| 工作区 | 能力 |
|---|---|
| ① 文档索引 | 建立/重建索引、关键词检索、点结果看文档原文 |
| ② 测试方案 | 文档来源(勾选已索引文档 / 「添加需求文件…」选择或粘贴任意需求文档路径)、按主题生成方案、列出并预览 plans/*.md |
| ③ 执行监控 | 选方案、设分片、按用例 ID 过滤(逗号分隔多个,如 TC-A,TC-B),无头/可视化执行,实时日志 + 用例结果表(可打开失败截图),另有「夜间流水线」按钮(执行 + 报告 + 推送,同样受用例过滤约束) |
| ④ 报告与产物 | 汇总最近运行生成报告、markdown 预览、打开报告目录 |
| ⚙ 设置 | 大模型端点(地址/模型/Key/超时/重试)配置与连通性测试、当前生效值来源、关于(版本/开发者/命名空间) |
- 顶部可切换项目目录:
.deepowl/、artifacts/、reports/、plans/都按该目录读写。 - 形态自动识别:exe 与
runtime/、app/同级(离线包)时用包内 Bun;在开发仓库里运行时用 PATH 中的bun与仓库bin/deepowl.ts。 - 依赖系统 WebView2 运行时(Windows 11 内置;Windows 10 需先装一次 Evergreen Runtime)。
- 快捷键/自动化验证:GUI 的每个动作都等价于一条 CLI 命令,回归验证以 CLI 为准,GUI 只验证交互与呈现。
11. 模型端点配置
规划阶段(需求分解 / 用例生成)依赖 OpenAI 兼容端点。三种配置方式任选,优先级从低到高:
内置默认值 ← 离线包默认配置($DEEPOWL_HOME/deepowl.config.json)← 用户级设置 ← 项目 deepowl.config.json ← 环境变量。
# ① 桌面客户端「⚙ 设置」页:填地址/模型/Key,点「保存到用户设置」或「保存到项目配置」,再点「测试连接」
# ② 命令行
deepowl llm show # 查看当前生效端点、来源与配置文件路径
deepowl llm set --base-url http://127.0.0.1:8098/v1 --model local
deepowl llm set --base-url https://api.deepseek.com/v1 --model deepseek-chat --api-key sk-xxx
deepowl llm set --clear-api-key # 清空 Key(本机端点可留空)
deepowl llm test # 向端点发一次真实请求,打印往返耗时与模型回复
deepowl llm set --base-url ... --project # 改为写进当前项目的 deepowl.config.json
# ③ 环境变量(临时覆盖,不落盘)
set DEEPOWL_LLM_BASE_URL=http://127.0.0.1:8098/v1 & set DEEPOWL_LLM_API_KEY= & set DEEPOWL_LLM_MODEL=local
- 用户级设置文件:
%USERPROFILE%\.deepowl\settings.json(可用DEEPOWL_USER_SETTINGS改路径)。 端点与 Key 属于「这台机器这个人」的信息,放这里就不会随项目仓库提交。 - 本机端点免 Key:
baseUrl指向127.0.0.1/localhost时允许apiKey为空(离线 llama.cpp / Ollama / LM Studio 场景)。 deepowl doctor的「LLM」一行会显示当前端点与 Key 是否已配置;deepowl about显示版本、开发者与命名空间。
12. 自测
bun test # 单元 + 集成测试(含真实 Edge 执行、真实 SQLite、真实 ZIP 解析)
bunx tsc --noEmit # 类型检查