Files
qihuaiflow/tests/10-issue-round3-test-case-report.md
qyyfw 78ff261b5a 初始提交: Qihu-AIFlow v2.0.1 完整项目
- 前端 React+TypeScript (源码+构建产物)
- 后端 Python FastAPI
- 数据库迁移 001-015
- Docker部署配置
- 微信ClawBot API频道绑定
- 项目文档 README.md
2026-07-02 14:40:46 +08:00

407 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 测试用例 — 10问题修复验证(Round 3)
**测试日期**: 2026-06-01
**测试工程师**: 测试工程师
**测试依据**: PRD v1.0 + 项目负责人给定的10个问题清单 + 前后端代码分析
**测试方针**: 以真实用户操作场景为基础,模拟用户通过浏览器完整走通各功能流程
---
## 1. 需求依据
- PRD 路径: `/data/share/project/docs/PRD.md`
- 本轮10个问题清单(项目负责人指定):
1. 邮件配置保存不生效 + 测试发送失败
2. 聊天对话窗口多功能按钮不显示(置顶/转知识图谱/归档等)
3. AI聊天询问技能后不罗列平台已安装应用
4. 应用市场卸载后无法再安装 + 重复安装未提示
5. 技能选择框显示已卸载应用
6. 频道二维码显示测试地址localhost
7. Token时间不同步 + 导出CSV无响应 + 一键充值无响应
8. 知识图谱节点不可拖拽和点亮
9. AI聊天技能/知识库/Agent需支持多选组合
10. 资产重复显示 + 分类错误 + 在线预览需集成Office
---
## 2. 代码功能模块概览
| 模块 | 代码位置(后端) | 代码位置(前端) | 对应问题 |
|------|--------------|-------------|---------|
| 邮件配置API | `api/admin/settings.py:132-397` | `pages/admin/SiteSettings.tsx:271-437` | Q1 |
| 对话管理API | `api/chat.py:125-682` | `pages/front/ChatPage.tsx:459-708` | Q2 |
| 技能列表API | `api/evolution.py:40-52`, `api/market.py:44-124` | `ChatPage.tsx:372-401` | Q3, Q5 |
| 应用市场安装卸载 | `api/market.py:300-393` | `pages/front/MarketPage.tsx:285-1374` | Q4 |
| 频道二维码 | `api/channels.py:420-498` | `pages/front/ChannelPage.tsx:391-729` | Q6 |
| Token驾驶舱 | `api/token_usage.py:25-242` | `pages/front/TokenDashboardPage.tsx:184-459` | Q7 |
| 知识图谱 | `api/knowledge.py:226-740` | `pages/front/KnowledgePage.tsx:163-415` | Q8 |
| 聊天多选选择器 | `api/chat.py:41-48, 258-293` | `ChatPage.tsx:835-932` | Q9 |
| 资产分类去重 | `api/assets.py:40-373` | `pages/front/AssetsPage.tsx:395-466` | Q10 |
---
## 3. 需求与代码差异说明
### 3.1 PRD中未在代码中体现的内容
| 编号 | PRD功能点 | 现状 |
|------|----------|------|
| D1 | Token驾驶舱余额预警弹窗(PRD 7.2-模块五) | 代码中未实现自动弹窗预警,仅页面展示余额信息 |
| D2 | 应用市场选择是否参与优惠券满减(PRD 7.2-模块四) | 市场发布流程未集成优惠券参与选项 |
| D3 | 知识库问答溯源原文展示(PRD 7.2-模块三) | 知识库QA API存在但前端溯源展示不完整 |
| D4 | 会员自动降级/自动续费规则引擎(PRD 7.2-后台模块五) | 数据库表结构存在但自动降级定时任务未实现 |
### 3.2 PRD中未覆盖但代码中存在的功能模块
| 编号 | 模块名称 | 代码位置 | 建议 |
|------|---------|---------|------|
| N1 | AI自进化驾驶舱 | `api/evolution.py`, `frontend/EvolutionDashboard.tsx` | 产品确认是否纳入正式需求 |
| N2 | 广告位管理与AI绘图 | `api/admin/ads.py`, `frontend/Ads.tsx` | 产品确认商业化优先级 |
| N3 | 工具调用循环(tool-call) | `api/chat.py:307-380` | 已在聊天中使用,产品确认 |
| N4 | 小说阅读预览器 | `frontend/NovelPreviewPage.tsx` | 特定资产类型的在线阅读,产品确认 |
---
## 4. 测试用例
### 4.1 邮件配置保存+测试发送 (Q1)
#### TC-1-01 [P0] 验证邮件配置保存并确认数据持久化
- **前置条件**: 管理员已登录后台
- **步骤**:
[1] 浏览器打开后台 → 点击"网站基础设置"
[2] 在邮件配置区域填写SMTP服务器、端口、用户名、密码、发件地址
[3] 点击"保存设置"按钮
[4] 刷新页面,检查邮件配置是否回显已保存的数据
[5] 通过API再次确认数据库中的配置
- **预期结果**: 保存后页面不报错;刷新后配置数据正确回显;数据库中email_configs表存在对应记录
- **备注**: 核心验证——保存是否真正生效
#### TC-1-02 [P0] 验证发送测试邮件弹窗及AI生成内容
- **前置条件**: 邮件配置已保存,管理员在"网站基础设置"页面
- **步骤**:
[1] 点击"发送测试邮件"按钮
[2] 验证弹窗出现,包含收件邮箱(必填)、邮件主题、邮件内容三个输入框
[3] 点击"AI生成测试内容"按钮
[4] 验证邮件主题和内容被AI自动填入(而非报错)
[5] 填写收件邮箱,点击"发送测试邮件"
[6] 验证页面给出明确反馈(成功或失败消息)
- **预期结果**: 弹窗正常;AI生成内容成功填入主题和正文;发送后页面有toast提示(即使SMTP无效也应给出明确错误提示而非静默失败)
- **备注**: 修复前AI生成和发送可能静默失败
#### TC-1-03 [P1] 验证邮件配置必填字段校验
- **前置条件**: 管理员在邮件配置区域
- **步骤**:
[1] 清空SMTP服务器或发件地址等必填字段
[2] 点击"保存设置"
[3] 观察是否有校验提示
- **预期结果**: 后端返回422或前端提示必填字段缺失
- **备注**: 边界测试
---
### 4.2 聊天对话下拉菜单多功能按钮 (Q2)
#### TC-2-01 [P0] 验证对话列表项下拉菜单展示及5个操作按钮
- **前置条件**: 用户已登录,有至少一条历史对话
- **步骤**:
[1] 进入AI聊天页面,在左侧对话列表中找到任意对话
[2] 点击对话项右侧的三点(More)图标按钮
[3] 检查下拉菜单是否弹出
[4] 逐一验证5个操作按钮是否可见:置顶/取消置顶、转知识图谱、重命名、归档/取消归档、删除
- **预期结果**: 下拉菜单正常弹出,5个按钮全部可见可点击
- **备注**: 核心验证——下拉菜单是否在页面上可见
#### TC-2-02 [P0] 验证置顶功能
- **前置条件**: 对话列表中有多条对话
- **步骤**:
[1] 对某条非置顶对话点击"置顶"
[2] 观察对话是否移动到列表顶部
[3] 刷新页面,确认置顶状态持久化
[4] 再次打开菜单,点击"取消置顶"
[5] 验证对话恢复正常排序
- **预期结果**: 置顶后对话排在最前,刷新后保持;取消置顶恢复
- **备注**: API: PUT /conversations/{id} pinned=true/false
#### TC-2-03 [P1] 验证转知识图谱功能
- **前置条件**: 对话中有实际消息内容
- **步骤**:
[1] 对某条有消息内容的对话点击"转知识图谱"
[2] 等待处理完成
[3] 进入知识库页面,验证是否自动创建了名为"对话图谱-{对话标题}"的知识库
- **预期结果**: 知识库创建成功,包含对话消息文档
- **备注**: API: POST /conversations/{id}/to-knowledge-graph
#### TC-2-04 [P1] 验证归档和删除功能
- **前置条件**: 对话列表中有对话
- **步骤**:
[1] 对某对话点击"归档"
[2] 对话从活跃列表消失
[3] 对另一对话点击"删除"
[4] 对话被移除
- **预期结果**: 归档和删除操作正常执行,状态正确更新
---
### 4.3 技能列表显示已安装应用 (Q3)
#### TC-3-01 [P0] 验证聊天中输入@或询问后列出平台已安装应用
- **前置条件**: 用户已登录,已安装若干应用
- **步骤**:
[1] 进入AI聊天页面
[2] 点击底部"技能"按钮
[3] 检查下拉列表中的技能
[4] 验证列表中只显示用户已安装的技能,不显示未安装或已卸载的应用
[5] 选择一个技能后发送消息,验证技能参数是否传递到后端
- **预期结果**: 技能列表仅包含已安装的技能;选中后可正常发送
- **备注**: 代码中ChatPage.tsx:393-400通过marketAPI获取并过滤installed状态
#### TC-3-02 [P1] 验证卸载应用后技能列表更新
- **前置条件**: 用户已安装技能A,技能列表中可见A
- **步骤**:
[1] 去应用市场卸载技能A
[2] 返回聊天页面,重新打开技能下拉框
[3] 检查技能A是否不再出现在列表中
- **预期结果**: 已卸载的技能不再出现在技能选择框中
---
### 4.4 应用市场安装卸载+重复检测 (Q4)
#### TC-4-01 [P0] 验证安装功能
- **前置条件**: 用户已登录,应用市场中有未安装的应用
- **步骤**:
[1] 进入应用市场,找到未安装的应用(无"卸载"按钮)
[2] 点击该应用卡片进入详情
[3] 点击"安装"按钮
[4] 观察安装结果
[5] 返回列表验证该应用按钮变为"卸载"
- **预期结果**: 安装成功;状态从"未安装"变为"已安装"
- **备注**: 真实用户操作流程
#### TC-4-02 [P0] 验证卸载后重新安装
- **前置条件**: 应用已安装
- **步骤**:
[1] 对已安装应用点击"卸载"
[2] 确认卸载成功(按钮变为价格/"安装")
[3] 再次点击"安装"
[4] 观察是否能重新安装成功
- **预期结果**: 卸载后可重新安装,不会报错或提示已安装
- **备注**: 修复前可能卸载后AppInstallation记录未正确清理
#### TC-4-03 [P1] 验证重复安装检测
- **前置条件**: 应用已安装
- **步骤**:
[1] 对已安装应用再次尝试安装
[2] 观察系统反馈
- **预期结果**: 系统提示"已经安装,无需重复安装"或类似提示
- **备注**: MarketPage.tsx:285-306有installed检测逻辑
---
### 4.5 技能选择框不显示已卸载应用 (Q5)
#### TC-5-01 [P0] 验证技能选择框中不包含已卸载应用
- **前置条件**: 用户安装过技能A和B,并卸载了B
- **步骤**:
[1] 进入聊天页面
[2] 点击"技能"按钮打开选择框
[3] 检查列表中是否包含技能B(已卸载)
- **预期结果**: 列表中不包含已卸载的技能B;仅显示已安装的技能A
- **备注**: 前端ChatPage.tsx:393-400过滤`a.installed !== false`
#### TC-5-02 [P1] 验证技能选择框为空时的提示
- **前置条件**: 用户没有安装任何技能
- **步骤**:
[1] 进入聊天页面,点击"技能"按钮
[2] 观察下拉框内容
- **预期结果**: 显示"暂无可用技能"或空列表
---
### 4.6 频道二维码非localhost (Q6)
#### TC-6-01 [P0] 验证频道二维码中绑定URL使用生产地址
- **前置条件**: 管理员已在后台配置频道(微信平台)
- **步骤**:
[1] 进入频道页面
[2] 点击频道进入详情
[3] 点击"连接频道"或"接入新平台"触发二维码生成
[4] 通过浏览器DevTools检查Network请求中二维码生成API的响应
[5] 验证二维码编码的URL是否以`APP_ACCESS_URL`为前缀
- **预期结果**: 二维码中的绑定URL使用`APP_ACCESS_URL`(即`http://s-3686137677310083075-773.team-coding:8080`),而非`localhost`
- **备注**: channels.py:496-497使用APP_ACCESS_URL环境变量
#### TC-6-02 [P1] 验证二维码扫码绑定流程
- **前置条件**: 频道已创建,微信凭证已配置
- **步骤**:
[1] 创建新的微信频道
[2] 在第二步中生成二维码
[3] 检查二维码图片是否正常显示
[4] 观察二维码下方是否显示平台提示信息
- **预期结果**: 二维码图片正常显示,绑定URL使用生产地址
---
### 4.7 Token驾驶舱时间/导出/充值 (Q7)
#### TC-7-01 [P0] 验证Token消耗明细时间显示正确
- **前置条件**: 用户已有Token消耗记录
- **步骤**:
[1] 进入Token驾驶舱页面
[2] 查看消耗明细表格中的"时间"列
[3] 对比系统当前时间
[4] 验证时间格式为`YYYY-MM-DD HH:mm`
- **预期结果**: 时间显示与系统时间在同一时区,格式正确
- **备注**: 前端formatTime函数(TokenDashboardPage.tsx:444-459)处理
#### TC-7-02 [P0] 验证CSV导出功能
- **前置条件**: 用户有Token消耗记录
- **步骤**:
[1] 点击"导出数据"按钮
[2] 观察浏览器是否触发文件下载
[3] 下载完成后打开CSV文件检查内容
[4] 验证文件名格式为`token-usage-YYYY-MM-DD.csv`
- **预期结果**: 浏览器触发下载,CSV包含正确的Token消耗数据(时间/模型/应用/Prompt/Completion/总Token/费用)
- **备注**: 修复前可能点击无响应
#### TC-7-03 [P0] 验证一键充值按钮跳转
- **前置条件**: 用户在Token驾驶舱页面
- **步骤**:
[1] 点击"一键充值"按钮
[2] 观察页面跳转
- **预期结果**: 跳转到付费中心页面(`#/pricing`或`#/billing`)
- **备注**: 修复前可能点击无响应
#### TC-7-04 [P1] 验证Token余额不足提示
- **前置条件**: 用户Token余额为0
- **步骤**:
[1] 进入Token驾驶舱
[2] 观察是否显示余额不足的提示
- **预期结果**: 页面顶端显示"Token余额不足"警告横幅
---
### 4.8 知识图谱节点拖拽和点亮 (Q8)
#### TC-8-01 [P0] 验证知识图谱节点可拖拽
- **前置条件**: 知识库已构建知识图谱,有节点和边
- **步骤**:
[1] 进入知识库 → 点击有图谱的库
[2] 点击"查看图谱"或"构建知识图谱"
[3] 在Canvas画布上找到一个节点
[4] 鼠标按住节点并拖动
[5] 松开鼠标,验证节点停留在新位置
- **预期结果**: 节点可被拖拽移动,松手后停留在新位置
- **备注**: KnowledgeGraphView组件第176-178行和405-408行实现
#### TC-8-02 [P0] 验证知识图谱节点可点亮/高亮
- **前置条件**: 图谱中有多个节点和边
- **步骤**:
[1] 在Canvas上点击一个节点
[2] 观察该节点是否高亮(金色边框)
[3] 观察与该节点相连的邻居节点是否有彩色光晕
[4] 观察非关联节点是否变暗
[5] 鼠标悬停在节点上,观察hover效果
- **预期结果**: 选中节点金色边框高亮;邻居节点彩色光晕;非关联节点变暗半透明
- **备注**: KnowledgeGraphView第296-353行实现
---
### 4.9 聊天多选组合功能 (Q9)
#### TC-9-01 [P0] 验证知识库多选功能
- **前置条件**: 用户有多个知识库
- **步骤**:
[1] 进入聊天页面
[2] 点击底部"知识库"按钮
[3] 在下拉框中勾选2个以上知识库
[4] 观察已选知识库是否带✓标记
[5] 点击"清除选择"按钮验证全部取消
- **预期结果**: 支持多选;已选项标记✓;清除选择可全取消
#### TC-9-02 [P0] 验证Agent多选功能
- **前置条件**: 用户已安装多个Agent
- **步骤**:
[1] 点击"Agent"按钮
[2] 勾选多个Agent
[3] 验证多选状态保持
- **预期结果**: 支持多选Agent
#### TC-9-03 [P0] 验证技能多选功能
- **前置条件**: 用户已安装多个技能
- **步骤**:
[1] 点击"技能"按钮
[2] 勾选多个技能
[3] 验证多选状态保持
- **预期结果**: 支持多选技能
#### TC-9-04 [P0] 验证三者组合发送
- **前置条件**: 至少选了一个知识库+一个Agent+一个技能
- **步骤**:
[1] 同时选择知识库、Agent、技能
[2] 在输入框输入消息内容
[3] 点击发送(Enter)
[4] 通过Network检查发送请求参数是否包含knowledge_base_ids、agent_ids、skill_ids
- **预期结果**: 发送请求正确携带多选的knowledge_base_ids、agent_ids、skill_ids参数
---
### 4.10 资产去重+分类+预览 (Q10)
#### TC-10-01 [P0] 验证资产不重复显示
- **前置条件**: 知识库中存在文档(已自动同步为资产)
- **步骤**:
[1] 进入资产页面
[2] 检查列表中是否有同名/同内容的重复条目
[3] 通过JS选择器检查资产ID是否有重复
- **预期结果**: 每个资产只出现一次,无重复条目
- **备注**: 前端AssetsPage.tsx:453-459通过Set去重
#### TC-10-02 [P0] 验证资产分类正确性
- **前置条件**: 有不同类型的资产(文件、图片等)
- **步骤**:
[1] 进入资产页面
[2] 使用分类筛选按钮逐个切换(全部/文件/图片/视频/音频/小说/其他)
[3] 每次切换后验证显示的资产类型是否与所选分类匹配
- **预期结果**: 分类筛选正确,各分类下的资产类型匹配
#### TC-10-03 [P1] 验证文件类型自动映射
- **前置条件**: 知识库中有不同类型的文档(.docx, .pptx, .pdf, .txt等)
- **步骤**:
[1] 进入资产页面
[2] 检查各种文件类型的显示标签
[3] 验证.docx显示为"Word"、.pptx显示为"PPT"、.txt显示为"文本"等
- **预期结果**: fileType标签映射正确
#### TC-10-04 [P1] 验证知识库文档归类到文件分类
- **前置条件**: 知识库中上传了文档
- **步骤**:
[1] 进入资产页面 → 点击"文件"分类
[2] 验证知识库文档是否出现在文件分类下
- **预期结果**: 知识库文档显示在"文件"分类中
---
## 5. 测试用例统计
| 问题编号 | 问题简述 | P0用例 | P1用例 | P2用例 | 合计 |
|---------|---------|--------|--------|--------|------|
| Q1 | 邮件配置保存+测试发送 | 2 | 1 | 0 | 3 |
| Q2 | 对话下拉菜单按钮 | 2 | 2 | 0 | 4 |
| Q3 | 技能列表显示已安装 | 1 | 1 | 0 | 2 |
| Q4 | 应用市场安装卸载 | 2 | 1 | 0 | 3 |
| Q5 | 技能选择框过滤 | 1 | 1 | 0 | 2 |
| Q6 | 频道二维码地址 | 1 | 1 | 0 | 2 |
| Q7 | Token时间/导出/充值 | 3 | 1 | 0 | 4 |
| Q8 | 知识图谱拖拽点亮 | 2 | 0 | 0 | 2 |
| Q9 | 聊天多选组合 | 4 | 0 | 0 | 4 |
| Q10 | 资产去重分类 | 2 | 2 | 0 | 4 |
| **合计** | | **20** | **10** | **0** | **30** |
---
> **文档状态**: 已完成
> **创建日期**: 2026-06-01
> **基于**: PRD v1.0 + 前后端代码功能分析