Files
ai-customer-service/test/CASES.md
Your Name cf46b27610 fix: P0-1 RateLimiter并发写安全 + P0-2工单操作错误码区分 + P1 rows.Close修复
P0-1 (limits.go): Allow()方法改为全程使用写锁保护counters map读写,避免RLock写入时的data race
P0-2 (ticket_workflow.go+ticket_handler.go): Assign/Resolve/Close操作先查询ticket存在性和状态,返回明确的CS_TICKET_4001/CS_TKT_4002/CS_TICKET_4092/CS_TICKET_4093错误码,handler根据错误前缀路由HTTP状态码
P1-1 (ticket_store.go): 移除GetStats中3处手动rows.Close(),只保留defer Close()
2026-05-01 20:56:25 +08:00

112 lines
6.8 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.
# AI-Customer-Service 测试用例
> 版本v1.0 | 状态:初稿
---
## AC-01 多渠道消息接入
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-01.1 | Telegram 消息接入 | Webhook 已配置 | 1. 发送消息 "如何创建 API Key" | 系统接收,返回 200 | P0 |
| TC-01.2 | Discord 消息接入 | Webhook 已配置 | 1. 发送消息 | 系统接收,返回 200 | P0 |
| TC-01.3 | 微信消息接入 | Webhook 已配置 | 1. 发送消息 | 系统接收,返回 200 | P0 |
| TC-01.4 | Widget 消息接入 | Widget 已部署 | 1. 发送消息 | 系统接收,返回 200 | P0 |
| TC-01.5 | Webhook 验证 | Webhook 已配置 | 1. 发送签名错误的请求 | 返回 401 或 403 | P1 |
## AC-02 意图识别与知识库回复
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-02.1 | API Key 意图 | 知识库已配置 | 1. 发送 "如何创建 API Key" | 回复包含步骤指引、代码示例 | P0 |
| TC-02.2 | 配额查询意图 | 知识库已配置 | 1. 发送 "我的配额还剩多少" | 系统调用只读 API 查询并返回精确数值 | P0 |
| TC-02.3 | 置信度达标 | 知识库已配置 | 1. 发送标准问题 | 回复置信度 ≥ 0.85 | P1 |
## AC-03 用户数据只读查询
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-03.1 | Token 消耗查询 | 用户已绑定 | 1. 发送 "今天的 Token 消耗是多少" | 3s 内返回精确数值 | P0 |
| TC-03.2 | 跨用户查询阻止 | 登录用户 A | 1. 尝试查询用户 B 的数据 | 请求被拒绝,返回 403 | P0 |
## AC-04 多轮对话与上下文保持
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-04.1 | 上下文关联 | 用户已发送初始问题 | 1. T0 发送 "怎么设置 API Key" 2. T0+30s 追问 "那个 Key 的有效期是多久" | 正确理解 "那个 Key" 指代上文 | P0 |
| TC-04.2 | 上下文窗口 | 已进行 5 轮对话 | 1. 继续第 6 轮 | 第 1 轮消息不在上下文中 | P1 |
## AC-05 身份校验
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-05.1 | 邮箱验证成功 | 用户未绑定 | 1. 输入邮箱 2. 输入正确验证码 | 2s 内会话关联至账户 | P0 |
| TC-05.2 | 验证码错误 | 用户未绑定 | 1. 输入错误验证码 3 次 | 会话锁定,生成转人工工单 | P0 |
## AC-06 大模型故障 Failover
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-06.1 | 主模型故障 | 主模型已配置 | 1. Mock 主模型返回 500 2. 发送消息 | 5s 内切换至备用模型,回复正常 | P0 |
| TC-06.2 | 双模型故障 | 主备模型均已配置 | 1. Mock 双方均返回 500 2. 发送消息 | 返回兑底回复 + 生成工单 | P0 |
## AC-07 兑底回复与工单生成
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-07.1 | 兑底回复 | 双模型均故障 | 1. 发送 "我的账户被封了怎么办" | 10s 内返回兑底文本 | P0 |
| TC-07.2 | 工单生成 | 双模型均故障 | 1. 发送消息 | 自动生成工单,包含 session_id、渠道、问题 | P0 |
## AC-08 明确转人工
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-08.1 | 关键词触发 | 处于自动回复 | 1. 发送 "我要找人工客服" | 2s 内停止自动回复,返回排队提示 | P0 |
| TC-08.2 | 排队显示 | 工单队列有待处理 | 1. 发送转人工关键词 | 显示排队人数 | P1 |
## AC-09 敏感意图自动转人工
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-09.1 | 退款意图 | 用户已绑定 | 1. 发送 "我要申请退款" | 3s 内生成 P1 工单,不返回自助指引 | P0 |
| TC-09.2 | 安全意图 | 用户已绑定 | 1. 发送 "我的数据可能泄露了" | 3s 内生成 P1 工单 | P0 |
## AC-10 工单后台分配与处理
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-10.1 | 工单排序 | 存在多个工单 | 1. 打开工单看板 | 按优先级 P1 > P2 > P3 与时间升序排列 | P0 |
| TC-10.2 | 工单分配 | 存在未处理工单 | 1. 客服点击接收 | 1s 内状态变更为处理中并锁定 | P0 |
## AC-11 知识库条目管理
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-11.1 | 条目发布 | 已创建条目 | 1. 点击发布 2. 等待 30s | 30s 内生效 | P0 |
| TC-11.2 | 条目引用 | 条目已发布 | 1. 用户询问相关问题 | 回复引用该条目 | P1 |
## AC-12 对话埋点与监控
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-12.1 | 埋点上报 | 系统已上线 | 1. 完成一次会话 2. 等待 5s | 埋点事件上报至监控平台 | P1 |
| TC-12.2 | 监控大盘刷新 | 已上报埋点 | 1. 等待 1 分钟 | Grafana 大盘刷新展示 | P1 |
## AC-13 权限边界
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-13.1 | 越权写操作 | 攻击者尝试 | 1. 尝试调用非只读接口 | 100ms 内返回 403 | P0 |
| TC-13.2 | 审计记录 | 越权尝试后 | 1. 查询审计日志 | 记录包含 IP、时间、目标接口 | P0 |
## 边缘场景 / 失败路径
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-E1 | 超长消息 | 会话已开始 | 1. 发送 >2000 字符的消息 | 截断至 2000 字符,提示分段 | P1 |
| TC-E2 | 高频消息 | 会话已开始 | 1. 1 秒内发送 10 条消息 | 启用频率限制,合并为 1 条 | P1 |
| TC-E3 | 知识库未命中 | 知识库已配置 | 1. 发送未知问题 | 置信度 <0.60,转人工 | P1 |
| TC-E4 | 供应商查询超时 | 用户已绑定 | 1. Mock 只读 API 超时 >3s | 回复通用说明,提示稍后重试 | P1 |
| TC-E5 | 数据库连接池耗尽 | 高并发 | 1. 模拟连接池耗尽 | 降级为静态 FAQ健康检查非 200 | P0 |
| TC-E6 | 多渠道并发 | 用户已绑定 | 1. 同时在 Telegram 和 Discord 发消息 | 各渠道独立处理 | P1 |