baodan/docs/保险智能客服系统_测试用例.md

447 lines
24 KiB
Markdown
Raw Permalink Normal View History

# 测试用例
> 测试不是为了证明代码没问题,而是为了发现问题。
> 一个人没有 QA 团队,更需要系统化的测试来兜底。
---
## 一、测试策略
### 1.1 测试分层
| 层级 | 测试什么 | 工具 | 谁来做 |
|------|---------|------|--------|
| **单元测试** | 单个函数/方法的逻辑 | pytestPython/ VitestVue | 开发时写 |
| **接口测试** | API 接口入参出参 | curl / pytest | 接口写完后 |
| **功能测试** | 完整业务流程 | 手动操作 | 每个阶段结束 |
| **端到端测试** | 用户视角的完整流程 | 手动操作 | 上线前 |
### 1.2 一个人的务实选择
你是一个人、45 天 deadline不可能每个都写自动化测试。建议
| 测试类型 | 投入 | 建议 |
|----------|------|------|
| 单元测试 | 中 | **只测核心业务逻辑**BaoDan 调用封装、消息加解密),不测 CRUD |
| 接口测试 | 低 | 用 curl 或 Postman 手动测,不写自动化 |
| 功能测试 | 必须 | 每个阶段结束时手动走一遍 |
| 端到端测试 | 必须 | 上线前用下面的测试用例表完整走一遍 |
---
## 二、功能测试用例
### 2.1 智能问答M1
#### 2.1.1 对话交互
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M1-01 | 正常提问 | 在对话框输入"重疾险等待期多少天",发送 | AI 从知识库检索并回答,答案准确,有引用来源 | P0 |
| M1-02 | 连续对话 | 连续问 3 个相关问题 | AI 能理解上下文,回答前后连贯 | P0 |
| M1-03 | 新建对话 | 点击"新建对话"按钮 | 开始一个全新对话,之前的上下文不影响 | P1 |
| M1-04 | 历史对话 | 刷新页面,查看对话列表 | 之前的对话记录还在,点击可继续 | P1 |
| M1-05 | 发送空消息 | 不输入任何内容,点发送 | 发送按钮禁用或提示"请输入问题" | P1 |
#### 2.1.2 回复展示
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M1-06 | Markdown 渲染 | AI 回复包含表格、列表、加粗 | 正确渲染 Markdown 格式,表格对齐 | P0 |
| M1-07 | 引用来源展示 | AI 回答一个问题 | 回答下方显示引用的知识库文档名称 | P1 |
| M1-08 | 回复加载状态 | 发送问题后等待 AI 回复 | 显示"正在思考..."或打字动画 | P1 |
| M1-09 | 长文本回复 | 问一个需要长回答的问题 | 回复完整展示,不截断,可以滚动查看 | P1 |
#### 2.1.3 检索范围控制
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M1-10 | 选择知识库 | 在对话界面选择只搜索"寿险"知识库 | 回答只基于寿险相关内容 | P0 |
| M1-11 | 多知识库检索 | 不限定范围,提问通用问题 | 从所有知识库中检索最相关的内容 | P0 |
| M1-12 | 无匹配结果 | 提问一个知识库完全没有的内容 | AI 回答"当前知识库中未找到相关内容" | P0 |
#### 2.1.4 反馈纠错
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M1-13 | 点赞/点踩 | 对 AI 回复点击赞或踩 | 记录反馈BaoDan 后台可见) | P2 |
---
### 2.2 产品推荐方案M2
#### 2.2.1 信息录入
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M2-01 | 正常填写表单 | 填写所有必填项,点击"生成方案" | 表单提交成功,进入生成等待页面 | P0 |
| M2-02 | 缺少必填项 | 不填年龄,点击"生成方案" | 提示"请填写年龄",不提交 | P0 |
| M2-03 | 非法输入 | 年龄填 -1 或 999 | 提示"年龄应在 0-150 之间" | P0 |
| M2-04 | 年龄填文字 | 年龄填"abc" | 提示"请输入有效数字" | P1 |
| M2-05 | 预算为 0 | 年预算填 0 | 提示"请输入有效预算"或允许(说明不限预算) | P1 |
| M2-06 | 最少信息 | 只填必填项,选填项不填 | 能正常提交并生成方案 | P1 |
#### 2.2.2 AI 生成方案
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M2-07 | 正常生成 | 填写典型需求30岁/男/年收入20万/预算5000 | 生成包含 2-3 个推荐方案的对比报告 | P0 |
| M2-08 | 生成过程等待 | 点击生成后等待 | 显示 loading 状态,有进度提示 | P0 |
| M2-09 | 生成超时 | 模拟 BaoDan 响应慢(>60秒 | 提示"生成超时,请重试",不卡死 | P0 |
| M2-10 | 知识库无匹配 | 选择一个知识库中没有的险种组合 | 提示"未找到匹配的保险产品" | P1 |
| M2-11 | 极端需求 | 80岁老人/年收入500万/预算10万 | 能正常生成方案(即使推荐结果有限) | P2 |
#### 2.2.3 方案展示与编辑
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M2-12 | 方案预览 | 生成方案后查看 | Markdown 格式正确渲染,表格对齐 | P0 |
| M2-13 | 打印方案 | 点击"打印"按钮 | 打开浏览器打印预览,排版可读 | P1 |
| M2-14 | 重新生成 | 对结果不满意,点"重新生成" | 重新调用 AI 生成新方案 | P1 |
---
### 2.3 企微机器人M4
#### 2.3.1 单聊
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M4-01 | 正常问答 | 在企微私聊机器人发"车险理赔流程" | 收到 AI 回复,内容准确 | P0 |
| M4-02 | 连续对话 | 连续问 3 个问题 | 每次都收到回复,对话上下文保持 | P0 |
| M4-03 | 回复时间 | 发送问题后计时 | 10 秒内收到回复BaoDan + 企微延迟) | P1 |
| M4-04 | 超长消息 | 发送 2000 字以上的问题 | 正常处理,不报错 | P2 |
#### 2.3.2 群聊
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M4-05 | 群内 @机器人 | 在群里 @机器人 问一个问题 | 机器人在群内回复,其他人可见 | P0 |
| M4-06 | 不 @不回复 | 在群里发消息但不 @机器人 | 机器人不回复 | P0 |
| M4-07 | 多人同时 @ | A 和 B 几乎同时 @机器人 问问题 | 两个人都收到各自的回复,不混淆 | P0 |
| M4-08 | 非文本消息 | 在群里 @机器人 发图片/表情 | 机器人回复"暂不支持该消息类型"或忽略 | P1 |
| M4-09 | 机器人被移出群 | 将机器人移出群聊 | 不报错,不再响应 | P2 |
#### 2.3.3 异常场景
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M4-10 | BaoDan 服务宕机 | 停止 BaoDan 服务,在企微发消息 | 收到友好提示"服务暂时不可用" | P0 |
| M4-11 | 网络超时 | 模拟网络延迟 | 企微不重试(避免重复回复) | P0 |
| M4-12 | 后端重启 | 重启 BaoDan 后端服务 | 重启后企微消息正常处理 | P1 |
---
### 2.4 企微 OAuth 登录M5
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M5-01 | 首次登录 | 访问系统,点击"企微登录" | 跳转企微授权页 → 授权 → 返回系统首页 | P0 |
| M5-02 | 已登录访问 | 登录后直接访问首页 | 直接进入系统,不弹登录 | P0 |
| M5-03 | Token 过期 | 登录后等 Token 过期 | 自动跳转到登录页 | P1 |
| M5-04 | 未授权用户 | 非公司企微用户尝试登录 | 提示"无权访问" | P1 |
| M5-05 | 多设备登录 | 手机和电脑同时登录 | 两处都能正常使用 | P2 |
---
### 2.5 知识库管理M3
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M3-01 | 上传文档 | 在 BaoDan 后台上传一个 MD 文件 | 上传成功,状态显示"处理中"→"已完成" | P0 |
| M3-02 | 批量上传 | 一次上传 10 个 MD 文件 | 全部上传成功,逐个完成向量化 | P0 |
| M3-03 | 处理状态监控 | 上传后查看知识库 | 显示每个文档的处理进度和状态 | P1 |
| M3-04 | 召回测试 | 在 BaoDan 后台测试检索 | 输入问题,返回相关段落 | P0 |
| M3-05 | 删除文档 | 删除知识库中的一个文档 | 删除成功,后续检索不再包含该文档内容 | P1 |
| M3-06 | 上传大文件 | 上传一个 50MB 的 MD 文件 | 正常处理,不超时 | P2 |
---
### 2.6 系统配置M6
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M6-01 | 切换 LLM 模型 | 在 BaoDan 后台切换对话模型 | 新对话使用新模型 | P1 |
| M6-02 | 修改 Prompt | 在 BaoDan 后台修改系统提示词 | 新对话使用新 Prompt | P0 |
| M6-03 | Prompt 版本回退 | 修改 Prompt 后想恢复 | BaoDan 支持版本历史(如果有的话)或手动备份 | P2 |
---
### 2.7 数据统计M7
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| M7-01 | 使用概览 | 进入数据统计页 | 显示今日问答数、活跃用户、命中率等核心指标 | P0 |
| M7-02 | 趋势折线图 | 选择"近7天"查看问答趋势 | 折线图正确显示每日数据点 | P0 |
| M7-03 | 切换指标 | 在趋势图切换"问答量/活跃用户/命中率" | 图表刷新,数据正确 | P1 |
| M7-04 | 知识库健康度 | 查看热门问题 TOP20 | 按频次降序排列,数据正确 | P1 |
| M7-05 | 未命中问题 | 查看未命中问题列表 | 列出知识库无法回答的问题,可标记已处理 | P1 |
| M7-06 | Token 成本 | 查看成本监控页 | 显示总 Token、总费用、按模型分类 | P0 |
| M7-07 | 空数据状态 | 新系统无任何数据时查看统计 | 各图表显示空状态或 0不报错 | P1 |
---
### 2.8 接口鉴权测试
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|--------|
| A-01 | 无 Token 访问受保护接口 | 不带 Authorization 访问 /api/chat/sessions | 返回 401 未授权 | P0 |
| A-02 | 过期 Token | 使用过期的 JWT 访问接口 | 返回 1003 Token 已过期 | P0 |
| A-03 | 伪造 Token | 使用随机字符串作为 Token | 返回 1002 Token 无效 | P0 |
| A-04 | 注销后使用旧 Token | 调用 logout 后再用旧 Token | 返回 1002 Token 已失效 | P0 |
| A-05 | 销售访问管理接口 | 用 sales 角色调用 /admin/users | 返回 1004 权限不足 | P0 |
| A-06 | 管理员访问超管接口 | 用 admin 角色调用 /admin/llm-configs | 返回 1004 权限不足 | P1 |
| A-07 | 客户角色权限 | 用 customer 角色调用 /admin/logs/chat | 返回 1004 权限不足 | P1 |
| A-08 | Token 刷新 | 用旧 Token 调用 refresh-token | 返回新 Token | P0 |
---
### 2.9 API 接口功能测试
#### 认证接口A1
| 用例编号 | 测试场景 | 请求 | 预期响应 | 优先级 |
|---------|---------|------|---------|--------|
| API-01 | 账密登录成功 | POST /auth/password-login, 正确账号密码 | code=0, 返回 token + expires_in | P0 |
| API-02 | 账密登录失败 | POST /auth/password-login, 错误密码 | code=1002, message="用户名或密码错误" | P0 |
| API-03 | 缺少参数 | POST /auth/password-login, 无 username | code=1001 | P1 |
| API-04 | 刷新 Token | POST /auth/refresh-token, 带有效旧 Token | 返回新 token | P0 |
| API-05 | 退出登录 | POST /auth/logout | code=0, 后续旧 Token 失效 | P0 |
#### 对话接口A2
| 用例编号 | 测试场景 | 请求 | 预期响应 | 优先级 |
|---------|---------|------|---------|--------|
| API-06 | 发送消息 SSE | POST /chat/message, message="重疾险等待期" | Content-Type: text/event-stream, 包含 delta/source/done 事件 | P0 |
| API-07 | 空消息 | POST /chat/message, message="" | code=1001, message="请输入问题内容" | P1 |
| API-08 | 获取会话列表 | GET /chat/sessions?page=1 | 返回 total + items 数组 | P0 |
| API-09 | 创建会话 | POST /chat/sessions | 返回 session_id | P0 |
| API-10 | 删除会话 | DELETE /chat/sessions/{id} | code=0, 会话被软删除 | P1 |
| API-11 | 提交反馈 | POST /chat/messages/{id}/feedback, rating="helpful" | code=0 | P1 |
| API-12 | 无效评分 | POST /chat/messages/{id}/feedback, rating="ok" | code=1001, message="评分值无效" | P1 |
#### 推荐接口A3
| 用例编号 | 测试场景 | 请求 | 预期响应 | 优先级 |
|---------|---------|------|---------|--------|
| API-13 | 生成推荐 | POST /recommend/generate, 完整参数 | 返回 task_id + status="processing" | P0 |
| API-14 | 缺少必填参数 | POST /recommend/generate, 无 age | code=1001 | P1 |
| API-15 | 查询状态 | GET /recommend/generate/{task_id} | 返回 status: processing/done/failed | P0 |
| API-16 | 方案导出 | POST /recommend/{id}/export, format="pdf" | 返回 download_url | P1 |
| API-17 | 无效导出格式 | POST /recommend/{id}/export, format="mp4" | code=1001, message="不支持的导出格式" | P1 |
| API-18 | 生成分享链接 | POST /recommend/{id}/share, expire_hours=72 | 返回 share_url | P1 |
#### 知识库接口A4
| 用例编号 | 测试场景 | 请求 | 预期响应 | 优先级 |
|---------|---------|------|---------|--------|
| API-19 | 上传文档 | POST /kb/documents/upload, multipart | 返回 upload_id + documents 数组 | P0 |
| API-20 | 文档列表 | GET /kb/documents?page=1 | 返回 total + items | P0 |
| API-21 | 文档状态 | GET /kb/documents/{id}/status | 返回 pipeline 各阶段状态 | P1 |
| API-22 | 更新元数据 | PATCH /kb/documents/{id}, {tags:[...]} | code=0 | P1 |
| API-23 | 删除文档 | DELETE /kb/documents/{id} | code=0, 文档下线 | P1 |
#### 管理接口A5+A6
| 用例编号 | 测试场景 | 请求 | 预期响应 | 优先级 |
|---------|---------|------|---------|--------|
| API-24 | 用户列表 | GET /admin/users?page=1 | 返回 total + items | P0 |
| API-25 | 新增用户 | POST /admin/users, {username,wecom_userid,role} | 返回 id | P0 |
| API-26 | 角色列表 | GET /admin/roles | 返回 5 个内置角色(含客户) | P0 |
| API-27 | LLM 连通性测试 | POST /admin/llm-configs/{id}/ping | 返回 reachable + latency_ms | P1 |
| API-28 | Prompt 测试 | POST /admin/prompts/test, test_query="..." | 返回 response + token_usage | P1 |
#### 统计接口A7+A8
| 用例编号 | 测试场景 | 请求 | 预期响应 | 优先级 |
|---------|---------|------|---------|--------|
| API-29 | 问答日志查询 | GET /admin/logs/chat?page=1 | 返回分页数据 | P0 |
| API-30 | 导出 CSV | GET /admin/logs/chat/export | Content-Type: text/csv | P1 |
| API-31 | 系统日志 | GET /admin/logs/system | 返回操作日志列表 | P1 |
| API-32 | 使用概览 | GET /stats/overview | 返回 today_chats 等指标 | P0 |
| API-33 | 趋势数据 | GET /stats/trend?metric=chat_count | 返回 date+value 数组 | P1 |
| API-34 | 知识库健康度 | GET /stats/kb-health?days=7 | 返回 hot_questions + missed_questions | P1 |
| API-35 | Token 消耗 | GET /stats/token-cost | 返回 total_tokens + by_model | P1 |
---
## 三、边界测试用例
### 3.1 输入边界
| 用例编号 | 测试场景 | 输入 | 预期结果 |
|---------|---------|------|---------|
| B-01 | 空字符串 | 对话输入 "" | 不发送或提示输入 |
| B-02 | 纯空格 | 对话输入 " " | 不发送或提示输入 |
| B-03 | 超长文本 | 对话输入 10000 字 | 正常处理,不崩溃 |
| B-04 | 特殊字符 | 输入 `<>{}[]` 等特殊字符 | 不报错,正常处理 |
| B-05 | SQL 注入 | 输入 `'; DROP TABLE users;--` | 不影响系统BaoDan/FastAPI 自带防护) |
| B-06 | XSS 注入 | 输入 `<script>alert(1)</script>` | 不执行脚本,正常显示文本 |
| B-07 | Emoji | 输入包含 emoji 的消息 | 正常显示 🎉 |
| B-08 | 中英混合 | "请问 car insurance 的理赔 process" | 正常回答 |
| B-09 | 年龄边界 0 | 年龄填 0 | 提示年龄无效 |
| B-10 | 年龄边界 150 | 年龄填 150 | 提示年龄无效 |
| B-11 | 预算超大 | 年预算填 99999999 | 正常处理(大额预算不是错误) |
| B-12 | 表单全选 | 关注险种全选 | 正常处理 |
### 3.2 并发边界
| 用例编号 | 测试场景 | 操作 | 预期结果 |
|---------|---------|------|---------|
| B-13 | 两人同时提问 | A 和 B 几乎同时发消息 | 各自收到正确回复 |
| B-14 | 快速连续发送 | 1 秒内发 5 条消息 | 每条都有回复,不丢失 |
| B-15 | 生成方案时发对话 | 方案生成中,去发起对话 | 对话正常,方案也在后台继续生成 |
---
## 四、异常场景测试用例
### 4.1 外部服务异常
| 用例编号 | 测试场景 | 模拟方式 | 预期结果 | 恢复方式 |
|---------|---------|---------|---------|---------|
| E-01 | BaoDan API 不可达 | 停止 BaoDan 服务 | 后端返回"服务暂时不可用" | 重启 BaoDan 后自动恢复 |
| E-02 | DeepSeek API Key 过期 | 使用错误的 Key | BaoDan 返回错误,用户看到友好提示 | 更换 Key 后恢复 |
| E-03 | DeepSeek API 限速 | 短时间大量请求 | 返回"请求过于频繁" | 等待限速解除 |
| E-04 | 企微 API 不可达 | 模拟网络断开 | 后端日志记录错误,不崩溃 | 网络恢复后自动恢复 |
| E-05 | 企微 Token 过期 | 等 2 小时 Token 失效 | 自动刷新 Token代码已处理 | 自动恢复 |
| E-06 | PostgreSQL 连接断开 | 重启数据库服务 | 后端报错日志,不崩溃 | 数据库恢复后自动重连 |
| E-07 | Redis 连接断开 | 重启 Redis | Celery 暂停,重启后恢复 | 自动恢复 |
| E-08 | 磁盘空间满 | 模拟磁盘满 | 上传文档失败,其他功能正常 | 清理磁盘后恢复 |
### 4.2 用户操作异常
| 用例编号 | 测试场景 | 操作 | 预期结果 |
|---------|---------|------|---------|
| E-09 | 页面刷新 | 对话中按 F5 刷新 | 刷新后对话记录还在BaoDan 保存) |
| E-10 | 断网重连 | 手机进地铁断网,出来后恢复 | 自动重连,可以继续对话 |
| E-11 | 多标签页打开 | 同时开 3 个标签页访问系统 | 各自独立使用,不冲突 |
| E-12 | 浏览器后退 | 对话中点浏览器后退 | 不报错,回到上一页(不是空页面) |
---
## 五、测试执行记录表
每次测试时填写这张表:
```markdown
## 测试执行记录
### 测试日期2026-XX-XX
### 测试阶段阶段XDay XX - Day XX
### 测试环境:开发环境 / 测试环境 / 生产环境
| 用例编号 | 测试结果 | 备注 |
|---------|---------|------|
| M1-01 | ✅ 通过 | |
| M1-02 | ❌ 失败 | 连续对话第3轮回答重复需要检查 conversation_id |
| M1-03 | ✅ 通过 | |
| ... | ... | ... |
### 通过率XX/XX = XX%
### 阻塞性问题X 个
### 非阻塞性问题X 个
```
---
## 六、上线前 Checklist
上线前必须逐项确认:
### 功能确认
- [ ] 问答功能30 个测试问题,通过率 > 85%
- [ ] 产品推荐10 组测试数据,方案质量可接受
- [ ] 企微单聊:正常问答不出错
- [ ] 企微群聊:多人 @ 不冲突
- [ ] 企微登录:完整流程走通
- [ ] H5 适配:手机端可正常使用
### 安全确认
- [ ] `.env` 文件没有暴露在公网
- [ ] API Key 没有写在前端代码里
- [ ] 企微回调做了签名校验
- [ ] HTTPS 已配置
- [ ] 输入有过滤XSS/SQL 注入防护)
### 稳定性确认
- [ ] BaoDan 服务连续运行 24 小时不崩溃
- [ ] 后端服务连续运行 24 小时不崩溃
- [ ] 10 人同时使用,响应时间 < 30
- [ ] 磁盘空间充足(> 20% 剩余)
- [ ] 日志在正常写入
### 文档确认
- [ ] 部署文档完整,按文档能重新部署
- [ ] 接口文档与实际接口一致
- [ ] CHANGELOG 已更新
- [ ] 企微应用配置步骤有记录
---
## 七、BaoDan 特有测试用例
### 7.1 知识库入库测试
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|:---:|
| D-01 | 单文件 MD 上传 | 上传一个 100 行的 MD 文件 | 状态processing -> completed可被检索 | P0 |
| D-02 | 批量上传 | 一次上传 20 个 MD 文件 | 全部处理完成,无遗漏 | P0 |
| D-03 | 大文件上传 | 上传一个 50MB 的 MD 文件 | 正常处理,不超时 | P1 |
| D-04 | 格式错误文件 | 上传一个非 MD/Word/TXT 文件 | 提示格式不支持,不入库 | P1 |
| D-05 | 空文件上传 | 上传一个 0 字节的 MD 文件 | 提示文件为空,不入库 | P1 |
| D-06 | 分段质量验证 | 上传包含多级标题的 MD检查分段 | 按 `##``###` 切分,每段 500-800 tokens | P0 |
| D-07 | 重复文档上传 | 同一文件上传两次 | 生成两个独立文档记录 | P1 |
| D-08 | 向量化验证 | 上传完成后,用召回测试搜索 | 能搜到刚上传的文档内容 | P0 |
### 7.2 检索质量测试
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|:---:|
| D-09 | 精确匹配 | 搜索"等待期" | 返回包含"等待期"的文档段落score > 0.8 | P0 |
| D-10 | 语义匹配 | 搜索"买了保险多久能赔" | 返回"等待期"相关段落(同义词) | P0 |
| D-11 | 跨库检索 | 不限险种搜索"理赔流程" | 从通用知识库返回结果 | P0 |
| D-12 | 库内检索 | 限定"重疾险"搜索 | 只返回重疾险相关结果 | P0 |
| D-13 | 无结果场景 | 搜索知识库完全没有的内容 | 返回空结果,不报错 | P0 |
| D-14 | TopK 验证 | 搜索热门话题 | 返回 Top-K 条结果,数量正确 | P1 |
### 7.3 BaoDan API 联调测试
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|:---:|
| D-15 | Chat API 正常调用 | 后端调 BaoDan Chat API | 返回 answer + conversation_id | P0 |
| D-16 | Chat API 带上下文 | 传入上次的 conversation_id | AI 能理解上下文 | P0 |
| D-17 | Chat API 超时 | 模拟 BaoDan 响应慢 | 60 秒后抛出超时异常,不阻塞 | P0 |
| D-18 | Chat API Key 无效 | 使用错误的 API Key | 返回 401抛出 BaoDanAPIError | P1 |
| D-19 | Workflow API 正常调用 | 后端调 BaoDan Workflow API | 返回推荐方案 Markdown | P0 |
| D-20 | Workflow API 超时 | 模拟 Workflow 执行慢 | 120 秒后抛出超时异常 | P0 |
| D-21 | Workflow 输入参数错误 | 传入缺少必填项的参数 | Workflow 返回错误,不崩溃 | P1 |
### 7.4 BaoDan 后台管理测试
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|:---:|
| D-22 | 模型切换 | 在 BaoDan 后台切换 LLM 模型 | 新对话使用新模型 | P1 |
| D-23 | Prompt 修改 | 修改系统提示词 | 新对话使用新 Prompt | P0 |
| D-24 | 知识库删除文档 | 删除一个文档 | 后续搜索不再返回该文档内容 | P1 |
| D-25 | 召回测试 | 在 BaoDan 后台使用召回测试功能 | 输入问题,返回相关段落及分数 | P1 |
### 7.5 Workflow 端到端测试
| 用例编号 | 测试场景 | 输入数据 | 预期输出 | 优先级 |
|---------|---------|---------|---------|:---:|
| D-26 | 典型推荐 | 35岁/男/年收入30万/月预算2000/重疾+医疗+意外 | 三套方案总保费不超过24000 | P0 |
| D-27 | 极低预算 | 25岁/月预算500/重疾险 | 提示预算不足以购买推荐产品 | P1 |
| D-28 | 极高年龄 | 70岁/重疾险 | 提示年龄超出可投保范围或推荐有限 | P1 |
| D-29 | 单险种 | 仅选择意外险 | 只推荐意外险产品,不推荐其他 | P1 |
| D-30 | 无匹配 | 选择一个知识库中没有的险种组合 | 提示未找到匹配产品 | P1 |
### 7.6 BaoDan 故障恢复测试
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 | 优先级 |
|---------|---------|---------|---------|:---:|
| D-31 | BaoDan 服务重启 | 重启 BaoDan Docker 容器 | 重启后所有功能恢复正常 | P0 |
| D-32 | 数据库断连恢复 | 临时停止 PostgreSQL | BaoDan 报错,恢复后自动重连 | P1 |
| D-33 | Redis 断连恢复 | 临时停止 Redis | Celery 暂停,恢复后自动恢复 | P1 |
| D-34 | 知识库数据保留 | BaoDan 重启后检查知识库 | 之前上传的文档和向量数据完整保留 | P0 |