AI 智能写作 — 手工测试清单
测试环境:后端 http://localhost:8001,前端 http://localhost:5174
每项测试前确认后端已启动(make dev)、前端已启动(pnpm dev)
T1 — 启动写作任务
| # |
步骤 |
预期结果 |
| 1.1 |
打开 Canvas 页面,点击右上角「AI 写作」按钮 |
AIWritingPanel 在右侧展开,显示写作配置表单 |
| 1.2 |
填写:意图「新能源汽车市场趋势分析」,类型「分析报告」,目标读者「行业研究人员」,字数「1200」 |
表单验证通过,提交按钮可点击 |
| 1.3 |
点击「开始写作」 |
按钮变为 loading 状态;时间轴出现第一条「素材收集专家 · 开始检索素材」进度条目 |
| 1.4 |
意图字段留空后点击提交 |
表单校验阻止提交,提示「请填写写作意图」 |
T2 — SSE 进度流(时间轴)
| # |
步骤 |
预期结果 |
| 2.1 |
任务启动后观察时间轴 |
每隔几秒新增进度条目,agent_name 标签分别出现「素材收集专家」「作家」「编辑」 |
| 2.2 |
打开浏览器 DevTools → Network,过滤 stream |
看到一个 text/event-stream 请求长连接,持续收到 data: 帧 |
| 2.3 |
断网 5 秒后恢复 |
面板显示「连接中断」提示(或 error 事件),不崩溃 |
T3 — PAUSE-1 素材确认
| # |
步骤 |
预期结果 |
| 3.1 |
等待素材收集专家完成检索,出现 PAUSE-1 干预卡 |
卡片标题「素材确认」,列出 ≥1 条素材,每条有复选框、标题、来源、相关度分数色条 |
| 3.2 |
全选所有素材,点击「确认素材,继续写作」 |
干预卡禁用,时间轴新增「作家 · 开始规划大纲」 |
| 3.3 |
重新发起任务,PAUSE-1 出现后取消勾选全部素材,点击「重新检索」 |
向后端发送 action: re_search;时间轴回到素材收集专家节点重新检索 |
| 3.4 |
PAUSE-1 出现后填写「追加关键词」输入框(如「锂电池」)并按 Enter,再点「追加搜索」 |
标签出现「锂电池」;后端收到 action: append_search, extraKeywords: ["锂电池"] |
| 3.5 |
验证相关度色条颜色:分数 ≥0.8 绿色 / 0.5–0.8 橙色 / <0.5 红色 |
三种颜色均可在不同素材中观察到 |
T4 — PAUSE-2 大纲确认
| # |
步骤 |
预期结果 |
| 4.1 |
PAUSE-2 出现后检查大纲卡 |
显示文章标题 + ≥2 个章节,每节有节标题与要点列表 |
| 4.2 |
点击文章标题,内联编辑改为「2025 新能源趋势报告」,按 Enter |
标题实时变更,不刷新页面 |
| 4.3 |
展开某章节,点击一条要点,修改文字,按 Blur 失焦 |
要点文字更新 |
| 4.4 |
点击「+ 新增章节」,填写章节标题 |
大纲末尾追加新章节 |
| 4.5 |
点击「确认大纲,开始写作」 |
编辑后的大纲随 action: confirm_outline 提交;时间轴出现「作家 · 开始撰写草稿」 |
| 4.6 |
PAUSE-2 出现后点击「重新规划大纲」 |
显示意见输入框;填写「请增加政策分析章节」后提交;后端收到 action: re_outline, outlineFeedback: ... |
T5 — PAUSE-3 草稿确认
| # |
步骤 |
预期结果 |
| 5.1 |
作家完成草稿,PAUSE-3 出现 |
干预卡显示修改次数(如「第 1 稿」);右侧 Artifact 面板同步显示 Markdown 草稿内容 |
| 5.2 |
点击「定稿,提交编辑审核」 |
进入编辑节点;时间轴出现「编辑 · 开始审核」 |
| 5.3 |
点击「提出修改意见」,填写意见后提交 |
作家节点重新生成草稿;修改次数 +1 |
| 5.4 |
连续打回 3 次,观察第 4 次 PAUSE-3 |
revisionCount 正确递增显示 |
T6 — PAUSE-4 审核结果确认
| # |
步骤 |
预期结果 |
| 6.1 |
编辑审核完成,PAUSE-4 出现 |
ReviewCard 显示:综合得分、事实/逻辑/语言三项分数、及格线(默认 75)、verdict 徽章(通过=绿 / 打回=红) |
| 6.2 |
verdict=pass 时,点击「接受审核,定稿」 |
流程结束;时间轴出现「完成」;右侧面板保留最终草稿 |
| 6.3 |
verdict=reject 时,查看问题列表 |
major 问题排在 minor 前;每条显示类别徽章、位置、问题描述、建议 |
| 6.4 |
verdict=reject 时,点击「强制定稿」 |
向后端发送 action: force_finalize;流程结束 |
| 6.5 |
添加「额外说明」文字后点击「接受审核,定稿」 |
extra_notes 包含在提交的 intervention payload 中(DevTools → Network 验证) |
T7 — 错误与边界场景
| # |
步骤 |
预期结果 |
| 7.1 |
后端未启动时点击「开始写作」 |
面板显示错误提示「无法连接到服务器」,不白屏 |
| 7.2 |
写作进行中点击「停止/重置」 |
时间轴清空,表单恢复可编辑,后端流被中断(Network 连接关闭) |
| 7.3 |
素材列表为空(后端返回 0 条)时 PAUSE-1 |
干预卡显示「暂无素材」提示,「确认」按钮仍可点击 |
| 7.4 |
大纲只有 1 个章节时,点击删除该章节 |
删除按钮禁用或弹出「至少保留一个章节」提示 |
| 7.5 |
弱模型返回格式错误的 JSON(手动 mock 后端) |
前端收到 fallback 结构,不崩溃;时间轴正常继续 |
T8 — 跨阶段状态一致性
| # |
步骤 |
预期结果 |
| 8.1 |
PAUSE-2 时展开大纲卡,刷新页面(F5) |
页面恢复;如写作任务 ID 持久化,状态可恢复(否则回到初始状态,均可接受) |
| 8.2 |
同时打开两个浏览器标签,各自启动独立写作任务 |
两个任务互不干扰,各自有独立 task_id |
| 8.3 |
完整跑通一次全流程(T1→T2→T3→T4→T5→T6 pass) |
右侧 Artifact 面板显示完整定稿文章,时间轴所有节点状态为「完成」 |
后端单元测试(补充确认)
# 在 offline-backend-20260512/backend/ 下运行
PYTHONPATH=. uv run pytest tests/test_ai_writing_json_parse.py -v # 16 tests
PYTHONPATH=. uv run pytest tests/test_ai_writing_graph.py -v # 19 tests
两个测试文件均应全部通过(0 failed)。
npm install @tiptap/core @tiptap/starter-kit @tiptap/extension-underline @tiptap/extension-placeholder