243 lines
13 KiB
Markdown
243 lines
13 KiB
Markdown
# 产品需求文档:ZeekerWatchman (测试用例智能管理平台)
|
||
|
||
| 文档版本 | 修订日期 | 修订人 | 修订说明 |
|
||
| -------- | ---------- | ------ | -------------------------------------- |
|
||
| V0.1 | 2026-05-22 | - | 初稿,整合核心架构与用户流程 |
|
||
| V0.2 | 2026-05-22 | - | 细化 IR 规范与 Skill 接口,补充非功能需求 |
|
||
| V1.0 | 2026-05-22 | - | P2-P4 完成,更新实现状态、架构分层、3 阶段流水线、Chat Panel |
|
||
|
||
---
|
||
|
||
## 1. 产品概述与愿景
|
||
|
||
### 1.1 产品愿景
|
||
将"产品需求文档(PRD)"到"可执行测试用例"的转换过程,从依赖人工经验的黑盒,升级为**可解释、可迭代、可插拔的知识工程系统**。
|
||
|
||
### 1.2 核心价值主张
|
||
- **输入**:非结构化的 PRD 文本(.md, .txt, .docx, .pdf)
|
||
- **处理**:AI 驱动的 3 阶段流水线:语义索引 → 逐单元 IR 提取 → 合并审计
|
||
- **输出**:多格式测试用例(YAML / CSV / JSON),含完整审计报告
|
||
- **差异化**:Agent 人格化、Skill 热插拔、Chat Panel 交互式编辑
|
||
|
||
---
|
||
|
||
## 2. 用户与核心场景
|
||
|
||
### 2.1 目标用户画像
|
||
- **测试架构师/资深 QA**:定义测试策略,设计 Skill 包,审核 IR 与审计报告
|
||
- **测试工程师**:上传 PRD,执行生成,通过 Chat Panel 微调并导出用例
|
||
- **开发工程师**:查看 YAML 格式用例,集成到 CI/CD
|
||
|
||
### 2.2 核心用户故事
|
||
- **作为**测试工程师,**我希望**上传 PRD 后自动生成 IR 并在思维导图中可视化确认
|
||
- **作为**测试架构师,**我希望**将团队方法论打包成 Skill,一键切换
|
||
- **作为**测试工程师,**我希望**通过右侧 Chat Panel 用自然语言修改 IR 内容和用例
|
||
|
||
---
|
||
|
||
## 3. 系统架构总览(实现后)
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────┐
|
||
│ .zeekerwatchmen/ (Agent 灵魂) │
|
||
│ ├── skills/{default,ecommerce}/ (热插拔 Skill) │
|
||
│ ├── memory/ (会话记忆) │
|
||
│ └── soul/ (人格/原则) │
|
||
└──────────────────────────────────────────────────┘
|
||
↓ 动态注入
|
||
┌──────────────────────────────────────────────────┐
|
||
│ Core (底座层 — 仅基础设施) │
|
||
│ ├── llm_provider/ (DeepSeek/Qwen 客户端+路由) │
|
||
│ ├── prompt/templates/ (宽泛框架级 prompt) │
|
||
│ ├── personality/ (动态人格装配) │
|
||
│ ├── reasoning/ (ReAct/LangGraph 编排) │
|
||
│ └── utils/ (Logger, Diff, Export) │
|
||
└──────────────────────────────────────────────────┘
|
||
↓ 能力支撑
|
||
┌──────────────────────────────────────────────────┐
|
||
│ Services (业务层 — 领域逻辑 + 业务 prompt) │
|
||
│ ├── prompts/ (ir_step1/2 业务 prompt) │
|
||
│ ├── prd_manager/ (Word/PDF 解析+图片分析) │
|
||
│ ├── ir_engine/ (3 阶段流水线+验证+Diff) │
|
||
│ ├── testcase_engine/ (用例生成+导出) │
|
||
│ └── skill_manager/ (Skill 扫描+热加载) │
|
||
└──────────────────────────────────────────────────┘
|
||
↓ API 服务
|
||
┌──────────────────────────────────────────────────┐
|
||
│ Web UI (Next.js 左右分栏布局) │
|
||
│ ┌──────────────────────┬────────────────────┐ │
|
||
│ │ 左侧:主工作区 │ 右侧:AI Chat │ │
|
||
│ │ 上传→IR可视化→用例 │ 自然语言交互 │ │
|
||
│ │ 思维导图+审计报告 │ 操作左侧内容 │ │
|
||
│ └──────────────────────┴────────────────────┘ │
|
||
└──────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 3.1 分层原则
|
||
- **core/**(底座层):只有基础设施,不含业务逻辑。更新底座只改 core,不改 services
|
||
- **services/prompts/**(业务 prompt):所有领域相关的 prompt 模板放在此处
|
||
- **services/**(业务层):领域逻辑调用 core 的 LLM 接口,引用自己的 prompt
|
||
|
||
---
|
||
|
||
## 4. 核心功能详述(已实现)
|
||
|
||
### 4.1 Skill 热插拔体系 (`.zeekerwatchmen`)
|
||
- `soul/principles.yaml`:5 条不可违背准则
|
||
- `soul/persona.yaml`:Agent 人格定义("Zeeker")
|
||
- `skills/{name}/`:每个 Skill 独立目录,含 skill.yaml + ir_schema.json + extract/gen_cases_prompt.j2
|
||
- `skills/default/`:通用测试设计
|
||
- `skills/ecommerce/`:电商后台(含 business_rules、data_consistency 等电商特有字段)
|
||
- `GET /api/skills` 自动扫描,`POST /api/skills/reload` 热重载
|
||
|
||
### 4.2 PRD 解析 (`prd_manager`)
|
||
- **WordParser**(`services/prd_manager/word_parser.py`):直接遍历 document.body XML
|
||
- 类型化 blocks:`{type: "para"|"table", index, text/headers/rows}`
|
||
- 表格列结构:`columns[{name, row, col, text}]`
|
||
- 表头检测启发式:首行所有单元格 < 20 字符则视为表头
|
||
- `[[IMAGE:rid]]` 标记嵌入文本
|
||
- image_sources 含精确定位:`{section, table, row, column, name}`
|
||
- **ImageParser**(`services/prd_manager/image_parser.py`):Qwen VL 分析图片(类型+描述)
|
||
- 支持格式:.md / .txt / .docx / .pdf
|
||
- Markdown 解析:`#` 标题 → sections,`|` 表格 → table blocks
|
||
|
||
### 4.3 3 阶段 IR 生成流水线 (核心升级)
|
||
|
||
```
|
||
PRD parsed JSON ──→ Stage 1 ──→ Stage 2 ──→ Stage 3 ──→ ir_final.json
|
||
语义索引 逐单元提取 合并审计 + audit_report.md
|
||
```
|
||
|
||
#### Stage 1:宏观语义索引
|
||
- 输入:完整 parsed PRD JSON(sections + image_analysis)
|
||
- ``format_document_for_prompt()``:渲染为 sections/blocks/tables/images 可读文本
|
||
- Prompt 模板:`services/prompts/ir_step1_semantic_index.txt`
|
||
- 输出:`{feature_name, concepts[], function_units[{unit_id, name, description, sources[]}]}`
|
||
- System prompt: "精确的 JSON 输出引擎" + 健壮 `extract_json_from_response()` + 3 次重试
|
||
- 失败降级:`_fallback_semantic_index()` 从段落/表格自动提取
|
||
|
||
#### Stage 2:逐功能单元 IR 提取
|
||
- 输入:semantic_index + parsed PRD
|
||
- `build_context_package()`:为每个 function_unit 构建精准上下文包(texts + tables + images + conflicts)
|
||
- Prompt 模板:`services/prompts/ir_step2_extraction.txt`
|
||
- IR Schema:``trigger{operator, conditions[{signal,operator,value,unit}]}`` + ``actions[{type,description,content}]`` + ``precondition``
|
||
- `ThreadPoolExecutor(max_workers=3)` 并行调用
|
||
- 输出:`[{unit_id, rules[{description, trigger, actions, sources, priority}]}]`
|
||
|
||
#### Stage 3:确定性合并与审计
|
||
- ``rule_signature(rule)``:SHA256(trigger.conditions + actions) 去重
|
||
- ``merge_rules()``:去重,合并 sources
|
||
- ``assign_rule_ids()``:格式 `{FEATURE}-{TYPE}-FG-{NN}`(SYS/UI/SDK)
|
||
- **_generate_audit()**:章节覆盖、图片引用覆盖、优先级分布
|
||
- **_format_audit_report()**:Markdown 格式审计报告
|
||
|
||
### 4.4 Chat Panel 交互式编辑
|
||
- 布局:左侧 380px 固定宽度 ChatPanel + 右侧 flex-1 主内容
|
||
- 状态桥:Zustand store (`web/src/lib/store.ts`) 在页面和 ChatPanel 间共享 PRD/IR/Testcases
|
||
- 后端 API:`POST /api/chat` — 接收 context + history,返回 reply + actions
|
||
- Action 机制:
|
||
- `{"action": "update_ir", "content": "..."}` — 更新左侧 IR 编辑器
|
||
- `{"action": "generate_cases", "ir_id": "..."}` — 跳转生成用例
|
||
- `{"action": "navigate", "page": "..."}` — 页面跳转
|
||
|
||
### 4.5 思维导图可视化 (`web/src/components/MindMap.tsx`)
|
||
- 双格式兼容:YAML IR(features 树)和 JSON pipeline IR(rules 树)
|
||
- SVG 递归渲染:节点矩形 + 贝塞尔曲线连接 + 优先级颜色标签
|
||
- Hover 提示:鼠标悬停显示完整文本
|
||
|
||
### 4.6 测试用例生成与导出
|
||
- **规则→用例转换**(`_rules_to_cases()`):trigger.conditions → Given 子句,actions → Then 子句
|
||
- 导出格式:YAML / CSV / JSON,`GET /api/testcase/export/{format}`
|
||
|
||
### 4.7 LLM 模型配置
|
||
- 文本模型:DeepSeek (`deepseek-chat` / `deepseek-v4-pro`),base_url: `https://api.deepseek.com`
|
||
- 图片模型:Qwen VL (`qwen3-vl-plus`),base_url: `https://dashscope.aliyuncs.com/compatible-mode/v1`
|
||
- 无 API Key 时自动降级为 Mock 模式
|
||
|
||
---
|
||
|
||
## 5. 技术栈
|
||
|
||
| 层 | 技术 |
|
||
|---|------|
|
||
| 后端框架 | Python FastAPI + Uvicorn |
|
||
| LLM 客户端 | OpenAI SDK(兼容 DeepSeek + Qwen DashScope) |
|
||
| LLM 模型 | DeepSeek (文本) + Qwen VL (图片) |
|
||
| 前端框架 | Next.js 15 + React 19 (Pages Router) |
|
||
| 样式 | Tailwind CSS 3.4 |
|
||
| 编辑器 | Monaco Editor (`@monaco-editor/react`) |
|
||
| 状态管理 | Zustand 5 |
|
||
| 文档解析 | python-docx + PyPDF2 |
|
||
| 提示模板 | Jinja2 |
|
||
| 校验 | jsonschema + PyYAML |
|
||
|
||
---
|
||
|
||
## 6. 里程碑与推进路径
|
||
|
||
| 阶段 | 核心任务 | 状态 |
|
||
| ---- | -------- | ---- |
|
||
| P1 | PRD 定稿与架构评审 | ✅ 完成 |
|
||
| P2 | 代码框架搭建(脚手架、空壳运行、接口占位) | ✅ 完成 |
|
||
| P3 | 核心链条实现(DeepSeek+Qwen,PRD→IR→用例全流程) | ✅ 完成 |
|
||
| P4 | 热插拔改造(Skill 扫描/加载,电商 Skill 验证,左右分栏 Chat Panel) | ✅ 完成 |
|
||
| P5 | 体验打磨(动画、错误处理、性能优化、更多 Skill) | 进行中 |
|
||
|
||
---
|
||
|
||
## 7. 项目结构(实现后)
|
||
|
||
```
|
||
zeekerWatchmen/
|
||
├── .zeekerwatchmen/ # Agent 灵魂:Skill/记忆/人格
|
||
│ ├── soul/ # principles.yaml + persona.yaml
|
||
│ ├── skills/ # default/ + ecommerce/
|
||
│ └── memory/ # 会话记忆
|
||
├── server/ # Python FastAPI 后端
|
||
│ ├── api/routes/ # prd.py, ir.py, testcase.py, skills.py, chat.py
|
||
│ ├── core/ # 底座层(仅基础设施)
|
||
│ │ ├── llm_provider/ # base.py, router.py, mock_client.py
|
||
│ │ ├── prompt/templates/ # 宽泛框架级 prompt
|
||
│ │ ├── personality/ # loader.py (动态人格装配)
|
||
│ │ ├── reasoning/ # graph.py (LangGraph 占位)
|
||
│ │ └── utils/ # logger.py, diff.py, export_utils.py
|
||
│ ├── services/ # 业务层
|
||
│ │ ├── prompts/ # 业务 prompt 模板
|
||
│ │ │ ├── ir_step1_semantic_index.txt
|
||
│ │ │ └── ir_step2_extraction.txt
|
||
│ │ ├── prd_manager/ # WordParser + ImageParser + service
|
||
│ │ ├── ir_engine/ # pipeline.py + generator + validator + diff
|
||
│ │ ├── testcase_engine/ # generator.py + exporter.py
|
||
│ │ └── skill_manager/ # service.py (Skill 扫描/热加载)
|
||
│ ├── main.py # FastAPI 入口
|
||
│ ├── config.py # 配置管理 (pydantic-settings + .env)
|
||
│ └── requirements.txt
|
||
├── web/ # Next.js 前端
|
||
│ ├── src/
|
||
│ │ ├── components/ # Layout, UploadZone, IrWorkspace, MindMap,
|
||
│ │ │ # TestCaseTable, ExportPanel, ChatPanel
|
||
│ │ ├── pages/ # index.tsx, ir-confirm.tsx, cases.tsx
|
||
│ │ ├── hooks/ # usePrd.ts, useIr.ts, useTestcases.ts
|
||
│ │ ├── lib/ # api.ts, types.ts, store.ts
|
||
│ │ └── styles/ # globals.css
|
||
│ ├── package.json, tsconfig.json, next.config.js, tailwind.config.js
|
||
├── docs/ # PRD.md, ARCHITECTURE.md
|
||
├── start.sh # 一键启动脚本
|
||
├── .env # 环境变量 (API Keys, 端口, 模型配置)
|
||
├── .gitignore
|
||
└── README.md
|
||
```
|
||
|
||
---
|
||
|
||
## 8. 一键启动
|
||
|
||
```bash
|
||
# Linux/WSL:
|
||
chmod +x start.sh && ./start.sh
|
||
|
||
# 访问 http://localhost:3000
|
||
```
|
||
|
||
start.sh 自动完成:依赖安装检查 → 后端启动 (8765) → 前端启动 (3000) → 输出访问地址。
|