- 前端 React+TypeScript (源码+构建产物) - 后端 Python FastAPI - 数据库迁移 001-015 - Docker部署配置 - 微信ClawBot API频道绑定 - 项目文档 README.md
23 KiB
23 KiB
测试用例 — 12项问题修复验证
1. 需求依据
- 来源:项目负责人下发的12项问题修复清单
- 重点验证方向:Agent/技能选择、频道二维码(非localhost)、知识库AI图谱、AI进化记录、资产文件分类+预览、邮件配置保存+测试
2. 代码功能模块概览
问题对应代码位置
| # | 问题 | 前端文件 | 后端文件 |
|---|---|---|---|
| 1 | Token驾驶舱时间不一致 | TokenDashboardPage.tsx:376-392 | token_usage.py:167 |
| 2 | 登录密码错误反馈 | LoginPage.tsx:59-103 | auth.py:38-49 |
| 3 | 平台驾驶舱+累计Token | Dashboard.tsx:79,101-127 | dashboard.py:38-42 |
| 4 | 广告图片上传/AI绘图 | Ads.tsx:141-188,353-417 | ads.py:182-311 |
| 5 | 模型类型映射+默认LLM | Models.tsx:156-195,313-353 | models.py:234-294,560-587 |
| 6 | 邮件配置保存+测试弹窗 | SiteSettings.tsx:128-185,358-428 | settings.py:104-374 |
| 7 | Agent/技能无法选择 | ChatPage.tsx:262-263,544-622 | chat.py:38-45,260-285 |
| 8 | 应用市场安装/卸载/搜索 | MarketPage.tsx:245-437,1249-1424 | market.py:44-125,300-393 |
| 9 | 知识库AI图谱LLM提取 | KnowledgePage.tsx:163-367,738-772 | knowledge.py:205-616 |
| 10 | 资产文档显示+在线预览 | AssetsPage.tsx:59-263,377-413 | knowledge.py:1067-1085 |
| 11 | AI进化对话未记录 | ChatPage.tsx:603-613 | chat.py:441-458, evolution_service.py:54-233 |
| 12 | 频道二维码生产地址 | ChannelPage.tsx:391-476 | channels.py:447-658, config.py:37-49 |
3. 需求与代码差异说明
3.1 代码中已实现但可能存在缺陷的功能
- 问题7(Agent/技能选择):选择逻辑存在,但仅为单选模式,且Agent后端无实际执行逻辑
- 问题11(AI进化记录):轨迹记录存在双向重复提交风险(前后端各自提交)
- 问题10(资产预览):知识库文档category="doc"不在VALID_ASSET_CATEGORIES中
3.2 PRD中未覆盖但代码已实现
无。本次为问题修复验证,所有问题均有对应代码实现。
4. 测试用例
4.1 问题1:Token驾驶舱消耗明细时间与系统时间不一致
TC-1-01 [P0] 验证Token消耗明细时间格式与系统时区一致
- 前置条件:用户已登录,存在Token消耗记录
- 涉及API:
GET /app/api/token/logs - 步骤:
- 进入Token驾驶舱页面(#/token)
- 查看消耗明细列表中的时间列
- 记录JS执行
new Date().getHours()获取当前浏览器时间 - 对比列表中最近一条消耗记录的时间小时数
- 预期结果:
- 消耗明细时间的小时数与系统当前时间的小时数一致(允许秒级差异)
- 时间格式为 YYYY-MM-DD HH:mm
TC-1-02 [P1] 验证Token概览页面今日消耗统计的时间边界
- 前置条件:用户已登录
- 涉及API:
GET /app/api/token/overview - 步骤:
- 进入Token驾驶舱页面
- 查看"今日消耗"数值
- 通过API直接查询今日消耗并对比页面显示值
- 预期结果:页面显示的今日消耗与API返回一致
TC-1-03 [P1] 验证API返回时间格式一致性
- 前置条件:用户已登录,有Token记录
- 涉及API:
GET /app/api/token/logs - 步骤:
- 调用API获取token logs
- 检查返回的created_at字段格式
- 预期结果:
- created_at格式为ISO 8601标准格式
- 同一页面的多个记录时间格式一致
4.2 问题2:登录界面修改密码后用旧密码登录反馈
TC-2-01 [P0] 验证旧密码登录返回"密码错误"而非通用错误
- 前置条件:用户已修改密码
- 涉及API:
POST /app/api/auth/login - 步骤:
- 在登录页面输入正确的用户名
- 输入已失效的旧密码
- 点击登录
- 预期结果:
- 页面显示明确的"密码错误"提示
- 不显示"用户名不存在"或通用的"登录失败"
TC-2-02 [P0] 验证用户名不存在时显示正确提示
- 前置条件:无
- 涉及API:
POST /app/api/auth/login - 步骤:
- 输入不存在的用户名
- 输入任意密码
- 点击登录
- 预期结果:
- 页面显示"用户名不存在"提示
- 不与"密码错误"混淆
TC-2-03 [P1] 验证修改密码后新密码立即生效
- 前置条件:用户已登录(如admin/admin123)
- 涉及API:
PUT /app/api/profile/password,POST /app/api/auth/login - 步骤:
- 修改密码为新密码
- 退出登录
- 用旧密码尝试登录
- 用新密码登录
- 预期结果:
- 旧密码登录失败,返回"密码错误"
- 新密码登录成功
TC-2-04 [P1] 验证前端错误提示区域可见且文案清晰
- 前置条件:无
- 涉及API:
POST /app/api/auth/login - 步骤:
- 输入错误凭据登录
- 检查页面错误提示位置和文案
- 预期结果:
- 错误提示在表单区域附近可见
- 文案明确区分"用户名不存在"与"密码错误"
4.3 问题3:平台驾驶舱+累计Token消耗统计
TC-3-01 [P0] 验证页面标题为"平台驾驶舱"
- 前置条件:管理员已登录
- 涉及API:无
- 步骤:
- 进入管理后台首页(#/admin)
- 查看页面标题
- 预期结果:页面标题显示为"平台驾驶舱"
TC-3-02 [P0] 验证累计Token消耗统计卡片存在
- 前置条件:管理员已登录
- 涉及API:
GET /app/api/admin/dashboard/stats - 步骤:
- 进入平台驾驶舱
- 查看统计卡片区域
- 确认包含以下统计项
- 预期结果:
- 包含"累计总消耗"统计卡片
- 数值来源于数据库实时统计
- Token数值格式正确(大数以"万"为单位显示)
TC-3-03 [P1] 验证统计数据随使用更新
- 前置条件:管理员已登录,记录当前累计Token值
- 涉及API:
GET /app/api/admin/dashboard/stats - 步骤:
- 记录当前累计Token消耗值
- 在AI聊天中发送一条消息(产生Token消耗)
- 刷新平台驾驶舱
- 对比累计Token消耗值
- 预期结果:
- 累计Token消耗值增加(或不变,取决于TokenUsageLog是否已写入)
- 如果是今日产生的消耗,今日Token也有相应变化
TC-3-04 [P1] 验证统计卡片包含所有必要维度
- 前置条件:管理员已登录
- 涉及API:
GET /app/api/admin/dashboard/stats - 步骤:
- 进入平台驾驶舱
- 统计所有可见的统计卡片
- 预期结果:至少包含以下统计维度:
- 用户总数
- 活跃模型数
- 今日订单数
- 今日Token消耗
- 累计总消耗
- 日均消耗(近30天)
4.4 问题4:广告位管理图片上传/替换+AI绘图
TC-4-01 [P0] 验证广告编辑中有图片上传按钮
- 前置条件:管理员已登录
- 涉及API:无
- 步骤:
- 进入管理后台 → 广告管理页面(#/admin/ads)
- 点击编辑某个广告
- 查找"背景图片"区域
- 预期结果:
- 存在"上传图片"按钮
- 按钮可点击,触发文件选择
TC-4-02 [P0] 验证AI绘图按钮及功能
- 前置条件:管理员已登录
- 涉及API:
POST /app/api/admin/ads/generate-image?prompt=... - 步骤:
- 编辑广告,找到"AI绘图"按钮
- 输入描述词(如"科技感蓝色广告图")
- 点击AI绘图
- 等待生成结果
- 预期结果:
- 按钮可见且可点击
- 生成过程中显示加载状态
- 生成完成后显示预览图
TC-4-03 [P1] 验证图片上传功能完整流程
- 前置条件:管理员已登录,准备测试图片文件
- 涉及API:
POST /app/api/admin/ads/upload-image - 步骤:
- 编辑广告
- 点击"上传图片"
- 选择一张图片
- 确认图片预览出现
- 保存广告
- 预期结果:
- 选择文件后显示图片预览
- 保存后广告使用新上传的图片
TC-4-04 [P1] 验证"清除图片"按钮
- 前置条件:管理员已登录,广告已有背景图片
- 涉及API:无
- 步骤:
- 编辑已有图片的广告
- 点击"清除图片"按钮
- 预期结果:
- 图片预览消失
- 保存后广告不再显示该图片
4.5 问题5:大模型库管理模型类型映射+全局默认LLM
TC-5-01 [P0] 验证非文本模型显示正确类型标签
- 前置条件:管理员已登录,存在多模态模型(如GPT-4o包含vision)
- 涉及API:
GET /app/api/admin/models/ - 步骤:
- 进入管理后台 → 大模型库(#/admin/models)
- 查看模型列表
- 找到多模态模型(如支持vision、audio的模型)
- 预期结果:
- 多模态模型显示对应的能力标签(如"视觉"、"语音")
- 纯文本模型仅显示"文本"标签
- 每个标签有对应的颜色标识
TC-5-02 [P0] 验证全局默认LLM设置入口
- 前置条件:管理员已登录
- 涉及API:
PUT /app/api/admin/models/{id}/set-default - 步骤:
- 进入大模型库页面
- 找到"设置默认LLM"按钮或入口
- 点击进入选择弹窗
- 预期结果:
- 存在"设置默认LLM"功能入口
- 弹窗列出所有已启用的模型
- 可选择并确认设置默认模型
TC-5-03 [P1] 验证默认LLM设置后正确标记
- 前置条件:管理员已登录
- 涉及API:
PUT /app/api/admin/models/{id}/set-default - 步骤:
- 设置某个模型为默认LLM
- 查看模型列表
- 在AI聊天页面检查默认选中的模型
- 预期结果:
- 模型列表中该模型显示"默认"标记
- AI聊天页面默认选中该模型
TC-5-04 [P1] 验证供应商模型列表获取功能
- 前置条件:管理员已登录,存在模型供应商
- 涉及API:
POST /app/api/admin/models/providers/{id}/fetch-models - 步骤:
- 进入大模型库
- 选择某个供应商
- 点击"获取模型列表"
- 预期结果:
- 能够从供应商获取可用模型列表
- 每个模型显示名称和类型标签
4.6 问题6:邮件配置保存+测试弹窗
TC-6-01 [P0] 验证邮件配置保存功能
- 前置条件:管理员已登录
- 涉及API:
PUT /app/api/admin/settings/email - 步骤:
- 进入网站基础设置(#/admin/settings)
- 填写SMTP服务器、端口、用户名、密码、发件地址
- 点击"保存设置"
- 预期结果:
- 显示保存成功提示
- 刷新页面后配置仍然存在(回显正确)
TC-6-02 [P0] 验证测试邮件弹窗输入收件箱
- 前置条件:管理员已登录
- 涉及API:
POST /app/api/admin/settings/email/test - 步骤:
- 在邮件配置区点击"发送测试邮件"
- 观察弹出的测试邮件弹窗
- 预期结果:
- 弹窗包含"收件邮箱"输入框(必填)
- 弹窗包含"邮件主题"输入框
- 弹窗包含"邮件内容"文本区
TC-6-03 [P0] 验证AI生成测试内容功能
- 前置条件:管理员已登录,已打开测试邮件弹窗
- 涉及API:
POST /app/api/admin/settings/email/generate-content - 步骤:
- 在测试邮件弹窗中点击"AI生成测试内容"
- 等待生成结果
- 预期结果:
- 邮件主题自动填充AI生成的内容
- 邮件正文自动填充AI生成的内容
- 内容为中文,适合测试用途
TC-6-04 [P1] 验证未配置时发送测试邮件的错误提示
- 前置条件:管理员已登录,SMTP配置为空
- 涉及API:
POST /app/api/admin/settings/email/test - 步骤:
- 清空邮件配置并保存
- 打开测试邮件弹窗
- 输入收件地址点击发送
- 预期结果:
- 显示"邮件配置未设置,请先保存邮件配置"错误提示
TC-6-05 [P1] 验证SMTP认证失败的错误提示
- 前置条件:管理员已登录
- 涉及API:
POST /app/api/admin/settings/email/test - 步骤:
- 填写错误的SMTP密码
- 保存配置
- 发送测试邮件
- 预期结果:显示"SMTP认证失败,请检查用户名和密码"
4.7 问题7:AI聊天Agent/技能无法选择
TC-7-01 [P0] 验证点击Agent下拉中的项目可选中
- 前置条件:用户已登录,市场中有已发布Agent
- 涉及API:无(前端交互)
- 步骤:
- 进入AI聊天页面(#/chat)
- 点击输入框上方的"Agent"下拉按钮
- 点击某个Agent
- 观察Agent下拉按钮状态变化
- 预期结果:
- 选中的Agent在列表中高亮/标记
- Agent按钮显示已选中状态(如高亮或显示选中数量)
TC-7-02 [P0] 验证点击技能下拉中的项目可选中
- 前置条件:用户已登录,市场中有已发布技能
- 涉及API:无(前端交互)
- 步骤:
- 在AI聊天页面点击"技能"下拉按钮
- 点击某个技能
- 观察状态变化
- 预期结果:
- 选中的技能在列表中高亮/标记
- 技能按钮显示已选中状态
TC-7-03 [P0] 验证发送消息时Agent/技能参数传递
- 前置条件:用户已登录,已选中Agent和技能
- 涉及API:
POST /app/api/chat/conversations/{id}/messages - 步骤:
- 选中一个Agent和一个技能
- 输入消息并发送
- 检查发送API请求体中的agent_ids和skill_ids参数
- 预期结果:
- 请求体包含选中的agent_ids(数组)
- 请求体包含选中的skill_ids(数组)
TC-7-04 [P1] 验证取消选中Agent/技能
- 前置条件:用户已登录,已选中Agent
- 涉及API:无
- 步骤:
- 点击已选中的Agent(再次点击)
- 观察状态变化
- 预期结果:Agent取消选中,按钮恢复默认状态
TC-7-05 [P1] 验证Agent/技能无数据时的占位提示
- 前置条件:市场中无Agent或技能类型应用
- 涉及API:
GET /app/api/market/apps?type=agent,GET /app/api/market/apps?type=skill - 步骤:
- 在聊天页面点击Agent下拉
- 预期结果:显示"暂无可用 Agent"
4.8 问题8:应用市场安装/卸载状态bug+搜索
TC-8-01 [P0] 验证应用安装功能
- 前置条件:用户已登录,应用市场中存在未安装应用
- 涉及API:
POST /app/api/market/apps/{id}/install - 步骤:
- 进入应用市场(#/market)
- 点击某个未安装的应用
- 点击"安装"按钮
- 预期结果:
- 安装成功后,按钮变为"已安装"或"卸载"
- 应用列表中该应用状态更新
TC-8-02 [P0] 验证重复安装检测
- 前置条件:用户已安装某个应用
- 涉及API:
POST /app/api/market/apps/{id}/install - 步骤:
- 找到已安装的应用
- 尝试再次点击"安装"按钮
- 预期结果:
- 前端阻止重复安装请求
- 或后端返回"应用已安装"错误提示
TC-8-03 [P0] 验证应用卸载功能
- 前置条件:用户已安装某个应用
- 涉及API:
DELETE /app/api/market/apps/{id}/uninstall - 步骤:
- 找到已安装的应用
- 点击"卸载"按钮
- 确认卸载
- 预期结果:
- 卸载成功后,按钮变为"安装"
- 应用列表中该应用状态更新
TC-8-04 [P0] 验证搜索功能
- 前置条件:用户已登录,市场中有多个应用
- 涉及API:
GET /app/api/market/apps?keyword=xxx - 步骤:
- 在应用市场搜索框中输入关键词
- 观察搜索结果
- 预期结果:
- 搜索结果仅显示匹配的应用
- 清除搜索后恢复全部应用
TC-8-05 [P1] 验证安装/卸载后状态持久化
- 前置条件:用户已安装某应用
- 涉及API:无
- 步骤:
- 安装一个应用
- 刷新页面
- 检查该应用状态
- 预期结果:
- 刷新后应用仍显示"已安装"状态
4.9 问题9:知识库构建知识图谱LLM驱动
TC-9-01 [P0] 验证知识图谱构建功能可触发
- 前置条件:用户已登录,创建了知识库并上传了文档
- 涉及API:
POST /app/api/knowledge/bases/{id}/build-graph - 步骤:
- 进入知识库页面(#/knowledge)
- 选择知识库,上传一个文本内容丰富的文档
- 点击"构建知识图谱"按钮
- 预期结果:
- 构建过程开始(可能显示进度/加载状态)
- 构建完成后显示成功提示
TC-9-02 [P0] 验证知识图谱包含实体和关系
- 前置条件:知识图谱已构建完成
- 涉及API:
GET /app/api/knowledge/bases/{id}/graph - 步骤:
- 构建完成后查看知识图谱
- 检查图谱节点和边
- 预期结果:
- 图谱包含多个节点(实体/概念/属性)
- 图谱包含节点间的关系/边
- 节点类型包含entity/concept/attribute等分类
TC-9-03 [P1] 验证LLM提取的实体丰富性
- 前置条件:知识库中有含命名实体的文档
- 涉及API:
GET /app/api/knowledge/bases/{id}/graph - 步骤:
- 上传包含人物、组织、地点的文档
- 构建知识图谱
- 查看提取的节点
- 预期结果:
- 节点包含文档中的人物、组织、地点等实体
- 每个节点有描述信息
- 关系有具体的关系类型(而非全为"关联")
TC-9-04 [P1] 验证图谱可视化渲染
- 前置条件:知识图谱已构建
- 涉及API:无(前端渲染)
- 步骤:
- 在知识库页面查看知识图谱可视化
- 预期结果:
- 图谱以可视化方式展示(非纯文本/表格)
- 节点颜色按类型区分
- 支持交互(如拖拽/缩放/点击)
4.10 问题10:资产知识库文档显示+在线预览
TC-10-01 [P0] 验证知识库文档在资产"文件"分类下可见
- 前置条件:用户已登录,已在知识库中上传文档
- 涉及API:
GET /app/api/knowledge/bases+GET /app/api/knowledge/bases/{id}/documents - 步骤:
- 进入资产页面(#/assets)
- 切换到"文件"分类Tab
- 查看文档列表
- 预期结果:
- 列表中包含知识库上传的文档
- 文档显示正确的文件名和类型标签
TC-10-02 [P0] 验证文档子类型筛选功能
- 前置条件:资产中有不同类型文件
- 涉及API:无(前端筛选)
- 步骤:
- 在文件分类下点击"知识库"子筛选
- 观察列表变化
- 预期结果:仅显示来自知识库的文档,其他来源文件被过滤
TC-10-03 [P0] 验证文档在线预览功能
- 前置条件:资产中有文本类型文档
- 涉及API:无
- 步骤:
- 在资产列表中点击某文档
- 检查是否出现预览弹窗
- 查看预览内容
- 预期结果:
- 弹窗显示文档内容预览
- 文本文件可直接查看内容
- 预览弹窗有关闭按钮
TC-10-04 [P1] 验证不同文件类型的预览表现
- 前置条件:资产中有PDF、Word等类型文档
- 涉及API:无
- 步骤:
- 分别点击PDF、Word、TXT等类型文档
- 观察预览弹窗表现
- 预期结果:
- 每种类型都有合适的预览方式(文本内容或提示)
- 不支持在线预览的类型给出明确提示
TC-10-05 [P1] 验证知识库文档去重显示
- 前置条件:同一文件在多个知识库中
- 涉及API:无
- 步骤:
- 查看资产列表
- 检查是否有重复文档
- 预期结果:同一文档不重复显示
4.11 问题11:AI进化对话未记录
TC-11-01 [P0] 验证对话产生后生成进化轨迹记录
- 前置条件:用户已登录,已通过 #/evolution 页面进入过AI进化
- 涉及API:
POST /app/api/chat/conversations/{id}/messages - 步骤:
- 进入AI聊天页面
- 发送一条消息并等待AI回复
- 进入AI进化页面(#/evolution)
- 查看进化事件/轨迹列表
- 预期结果:
- 有新产生的对话轨迹记录
- 记录包含对话ID和时间信息
TC-11-02 [P0] 验证AI进化页面时间线事件显示
- 前置条件:用户已登录,已有进化轨迹
- 涉及API:
GET /app/api/evolution/events - 步骤���
- 进入AI进化页面
- 查看时间线/事件列表
- 预期结果:
- 显示对话相关的进化事件
- 事件类型包括"对话"或"discovered"
- 每条事件有时间戳
TC-11-03 [P1] 验证Pipeline处理轨迹
- 前置条件:用户已登录,已触发进化管道
- 涉及API:
POST /app/api/evolution/pipeline/trigger - 步骤:
- 在AI进化页面触发管道
- 检查轨迹状态是否从"discovered"进入下一阶段
- 预期结果:
- 管道启动后有状态变化
- 管道结束后技能树更新
TC-11-04 [P1] 验证进化仪表盘统计更新
- 前置条件:用户已登录,管道已处理
- 涉及API:
GET /app/api/evolution/dashboard - 步骤:
- 查看进化仪表盘
- 检查技能数量、轨迹数量等统计
- 预期结果:
- 统计数据与实际使用情况一致
- 技能数量在管道处理后可能增加
4.12 问题12:频道微信二维码显示生产地址
TC-12-01 [P0] 验证二维码URL使用生产地址非localhost
- 前置条件:用户已登录,打开了微信频道
- 涉及API:
POST /app/api/channels/authorize/scan?platform=wechat - 步骤:
- 进入频道管理页面(#/channels)
- 选择微信平台
- 点击生成二维码
- 检查API返回的qr_url或bind_url值
- 预期结果:
- URL以生产地址开头(如https://bot.qihuyun.com)
- URL不包含localhost、127.0.0.1
- URL格式为
{生产地址}/#/channels/bind?token=...&platform=wechat
TC-12-02 [P0] 验证二维码页面正常渲染
- 前置条件:用户已生成二维码
- 涉及API:无(前端渲染)
- 步骤:
- 生成二维码后观察页面
- 预期结果:
- 二维码图片清晰可见
- 页面下方显示操作提示文字
- 不显示localhost相关字样
TC-12-03 [P1] 验证无凭证时二维码的提示信息
- 前置条件:未配置微信AppID/AppSecret
- 涉及API:
POST /app/api/channels/authorize/scan?platform=wechat - 步骤:
- 不填写凭证生成二维码
- 检查提示信息
- 预期结果:
- 返回的is_mock为true但qr_url仍为生产地址
- 提示信息说明这是模拟版本
TC-12-04 [P1] 验证扫描状态轮询正常
- 前置条件:已生成二维码
- 涉及API:
POST /app/api/channels/authorize/scan/status?platform=wechat - 步骤:
- 生成二维码后观察状态轮询
- 预期结果:
- 定时查询扫描状态
- 状态正常更新(waiting/scanned/authorized/expired)
5. 测试用例统计
| 问题 | P0 | P1 | 合计 |
|---|---|---|---|
| 1. Token时间一致性 | 1 | 2 | 3 |
| 2. 登录密码错误反馈 | 2 | 2 | 4 |
| 3. 平台驾驶舱+累计Token | 2 | 2 | 4 |
| 4. 广告图片上传/AI绘图 | 2 | 2 | 4 |
| 5. 模型类型+默认LLM | 2 | 2 | 4 |
| 6. 邮件配置+测试弹窗 | 3 | 2 | 5 |
| 7. Agent/技能选择 | 3 | 2 | 5 |
| 8. 应用市场安装/卸载/搜索 | 4 | 1 | 5 |
| 9. 知识库AI图谱 | 2 | 2 | 4 |
| 10. 资产文档+预览 | 3 | 2 | 5 |
| 11. AI进化对话记录 | 2 | 2 | 4 |
| 12. 频道二维码生产地址 | 2 | 2 | 4 |
| 合计 | 28 | 23 | 51 |
报告生成时间:2026-06-01 生成方式:基于前后端代码深度分析,覆盖全部12个问题涉及的功能模块