# 测试用例 — 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 + 前后端代码功能分析