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

447 lines
24 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.

# 测试用例
> 测试不是为了证明代码没问题,而是为了发现问题。
> 一个人没有 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 |