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()
6.8 KiB
6.8 KiB
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 |