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

24 KiB
Raw Blame 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 浏览器后退 对话中点浏览器后退 不报错,回到上一页(不是空页面)

五、测试执行记录表

每次测试时填写这张表:

## 测试执行记录

### 测试日期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