Files
wecom_it_smart_desk/docs/03-测试文档/03-功能测试用例/TC-通用-002-快速回复规则后台管理.md
T
Simon 44e77dcb0e chore(docs): docs/ 目录全面重新编号 + 重组
**重构前**(旧编号 02-11):
- docs/02-产品需求/      → 00 产品规划/PRD
- docs/03-技术架构/      → 01-05 子目录散落
- docs/04-原型设计/      → 01-02 产品设计(HTML 原型)
- docs/05-原型设计/      → screens/
- docs/06-测试素材/      → 02-E2E / 03-功能 / 04-版本测试
- docs/07-项目管理/      → 任务说明书/日报/计划
- docs/08-安全审计/      → 审计报告
- docs/09-堡垒运维/      → toolbox / deploy
- docs/10-项目管理/      → 任务说明书(重复)
- docs/11-历史归档/      → deploy-nas-archived

**重构后**(新编号 00-07,语义化):
- docs/00-产品开发流程与文档管理规范.md
- docs/00-版本迭代总览.md
- docs/01-产品文档/      (PRD/原型/认证/会话/AI 服务/坐席/集成)
- docs/02-技术文档/      (技术方案/架构图/重构记录/前端改造/实现配置)
- docs/03-测试文档/      (E2E/功能用例/版本报告/缺陷单)
- docs/04-运维文档/      (部署运维/运维指南)
- docs/05-运营文档/      (品牌推广/用户手册)
- docs/06-安全审计/      (审计报告)
- docs/07-项目管理/      (任务说明书/日报/计划/看板)

**净收益**:
- 目录编号与产品文档管理规范对齐(按文档阶段 01-07 编号)
- 消除 02-产品需求 与 10-项目管理 的编号重叠
- 子目录按文档类型分组(如 01-产品文档/00-产品规划、01-产品文档/01-认证与登录)
- 把运维/安全/项目管理从 0X 散落改为 04/06/07

合计 494 文件 + 78495 行 / - 14076 行
2026-08-03 18:46:55 +08:00

379 lines
17 KiB
Markdown
Raw 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.
# 测试用例 - 快速回复规则后台管理
> **REQ编号**: REQ-通用-002
> **版本**: v1.2
> **日期**: 2026-07-28
> **作者**: 宋献
> **关联文档**:
> - PRD`01-产品文档/00-产品规划/PRD-REQ-通用-002-快速回复规则后台管理-v1.2.md`
> - 技术方案:`02-技术文档/技术方案-REQ-通用-002-快速回复规则后台管理.md`
> - 原型图:`01-产品文档/01-02产品设计/快速回复规则后台管理-原型图.html`
> - 部署文档:`04-运维文档/快速回复规则后台管理-部署文档-v1.0.md`
> (按命名规范存量豁免条款保留历史文件名及根目录位置)
---
## 一、用例汇总
| 类别 | 用例数 | 通过 | 失败 | 阻塞 |
|------|--------|------|------|------|
| 功能测试(规则 CRUD | 6 | 0 | 0 | 0 |
| 功能测试(审计日志) | 4 | 0 | 0 | 0 |
| 功能测试(置信度三档) | 3 | 0 | 0 | 0 |
| 功能测试(降级兜底) | 2 | 0 | 0 | 0 |
| 功能测试(灰度开关) | 2 | 0 | 0 | 0 |
| 功能测试(启动加载) | 2 | 0 | 0 | 0 |
| 功能测试(前端集成) | 3 | 0 | 0 | 0 |
| 功能测试(v1.2 UI 整理) | 3 | 0 | 0 | 0 |
| 接口测试 | 4 | 0 | 0 | 0 |
| **总计** | **29** | **0** | **0** | **0** |
---
## 二、功能测试用例
### 2.1 规则 CRUD
| TC-ID | TC-001 |
|-------|--------|
| 用例名称 | 列表查询 - 按规则类型筛选 |
| 前置条件 | 1) 登录管理后台(账号 X)<br>2) 数据库有 12 条 greeting + 33 条 routing_prefilter + 6 条 routing_target + 2 条已停用 规则 |
| 测试步骤 | 1. 进入"快速回复规则 > 规则列表"<br>2. 类型筛选取 `greeting`<br>3. 检查列表展示数 |
| 预期结果 | 列表展示 12 条 greeting 规则,关键词、优先级、状态、最后修改时间字段完整 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-002 |
|-------|--------|
| 用例名称 | 单条查询 - 通过 ID |
| 前置条件 | 已知数据库存在 id=1 的 greeting 规则 |
| 测试步骤 | 1. 进入"规则详情"<br>2. 输入 id=1<br>3. 检查返回字段 |
| 预期结果 | 返回规则完整字段(rule_type/category/keyword/priority/response_template/extra_data/is_active/created_at/updated_at |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-003 |
|-------|--------|
| 用例名称 | 创建规则 - 合法参数 |
| 前置条件 | 1) 数据库无 `rule_type=greeting, keyword="您好呀"` 记录<br>2) 管理员账号权限完整 |
| 测试步骤 | 1. 进入"新建规则"<br>2. rule_type=greeting, keyword="您好呀", priority=10, response_template="您好,我是智能助手..."<br>3. 提交 |
| 预期结果 | 1. 数据库新增 1 条记录<br>2. 审计日志表新增 1 条 `action=create, operator=当前账号`<br>3. 前端 toast "创建成功"<br>4. 列表自动刷新 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-004 |
|-------|--------|
| 用例名称 | 创建规则 - 关键词重复被唯一约束拒绝 |
| 前置条件 | 数据库已有 `rule_type=greeting, keyword="你好"` 记录 |
| 测试步骤 | 1. 新建规则,rule_type=greeting, keyword="你好"<br>2. 提交 |
| 预期结果 | 1. 后端返回 400 错误 `IntegrityError / quick_rules_type_keyword_unique`<br>2. 前端 toast "该规则类型下已存在相同关键词"<br>3. 不写入数据库 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-005 |
|-------|--------|
| 用例名称 | 更新规则 - 修改 priority 与 response_template |
| 前置条件 | 数据库存在 id=1 的 greeting 规则(priority=10 |
| 测试步骤 | 1. 编辑规则<br>2. 修改 priority=20、response_template="新模板"<br>3. 提交 |
| 预期结果 | 1. 数据库字段更新<br>2. 审计日志表新增 1 条 `action=update, before={"priority":10,...}, after={"priority":20,...}`<br>3. 缓存自动失效(下次查询读 DB 新值) |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-006 |
|-------|--------|
| 用例名称 | 删除规则 - 二次确认 |
| 前置条件 | 数据库存在 id=5 的 routing_prefilter 规则 |
| 测试步骤 | 1. 行操作菜单点"删除"<br>2. 二次确认弹窗点"确定删除" |
| 预期结果 | 1. 数据库删除该行(硬删或软删需在 PRD 中明确,本用例假设硬删)<br>2. 审计日志表新增 1 条 `action=delete, before=完整快照`<br>3. 前端列表自动消失该行 |
| 测试结果 | ⬜ 待测试 |
---
### 2.2 审计日志
| TC-ID | TC-007 |
|-------|--------|
| 用例名称 | 创建规则自动写审计 |
| 前置条件 | 满足 TC-003 前置条件 |
| 测试步骤 | 1. 完成 TC-003 创建<br>2. 切换到"审计日志"页<br>3. 筛选 action=create |
| 预期结果 | 1. 最新一条审计记录 operator=管理员账号、action=create、target_id=新规则 id、after=规则完整快照<br>2. created_at 与规则创建时间一致 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-008 |
|-------|--------|
| 用例名称 | 更新规则自动写审计(保留 before/after |
| 前置条件 | 完成 TC-005 |
| 测试步骤 | 1. 完成 TC-005 更新<br>2. 切换到"审计日志"页<br>3. 筛选 action=update |
| 预期结果 | 审计记录含 before/after 两个 JSON,差异字段 priority 和 response_template |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-009 |
|-------|--------|
| 用例名称 | 删除规则自动写审计(after=null |
| 前置条件 | 完成 TC-006 |
| 测试步骤 | 1. 完成 TC-006 删除<br>2. 切换到"审计日志"页<br>3. 筛选 action=delete |
| 预期结果 | 审计记录含 before=完整快照、after=null |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-010 |
|-------|--------|
| 用例名称 | 审计日志列表分页与筛选 |
| 前置条件 | 审计日志表有 ≥100 条记录 |
| 测试步骤 | 1. 进入"审计日志"页<br>2. 按 operator 筛选、按时间倒序<br>3. 翻页至第二页 |
| 预期结果 | 1. 倒序展示<br>2. 第二页数据正确(无重复、无缺失)<br>3. 筛选生效(仅显示指定 operator 的记录) |
| 测试结果 | ⬜ 待测试 |
---
### 2.3 置信度阈值三档
| TC-ID | TC-011 |
|-------|--------|
| 用例名称 | 置信度 ≥0.85 — 自动应用规则 |
| 前置条件 | 1) AI 引擎对用户消息"重置密码"返回 routing_confidence=0.92<br>2) routing_target 规则已配置"IT支持"分类,kfid 可用 |
| 测试步骤 | 1. 用户发送"重置密码"<br>2. 等待 3 秒<br>3. 检查 WS 双通道推送 |
| 预期结果 | 1. 收到 `action=route_recommend` 消息,含 target 信息<br>2. `messages.reply_source` 字段包含 `"quick_rule"` 标识<br>3. 前端路由卡片自动展示 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-012 |
|-------|--------|
| 用例名称 | 置信度 0.5~0.85 — 进入待审核 |
| 前置条件 | AI 引擎 routing_confidence=0.72(落在待审核区间) |
| 测试步骤 | 1. 用户发送对应消息<br>2. 后端日志确认收到 AI 响应<br>3. 检查是否触发路由卡片 |
| 预期结果 | 1. 后端写 audit log `action=pending_review, confidence=0.72`<br>2. 前端**不**自动展示路由卡片<br>3. 管理员后台"待审核列表"展示该条 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-013 |
|-------|--------|
| 用例名称 | 置信度 <0.5 — 直接拒绝 |
| 前置条件 | AI 引擎 routing_confidence=0.32 |
| 测试步骤 | 1. 用户发送对应消息<br>2. 等待 3 秒 |
| 预期结果 | 1. 走正常 AI 回复流程,**不**触发任何快速规则相关推送<br>2. 后端 debug 日志标记 `quick_rule.skipped: low_confidence=0.32`<br>3. 审计日志表无该记录 |
| 测试结果 | ⬜ 待测试 |
---
### 2.4 降级兜底
| TC-ID | TC-014 |
|-------|--------|
| 用例名称 | quick_rules 表为空 — 业务不中断 |
| 前置条件 | 1) `TRUNCATE quick_rules RESTART IDENTITY`<br>2) 重启后端(load_all 重新加载) |
| 测试步骤 | 1. 用户发送"打印机没墨"<br>2. 观察是否触发路由推荐 |
| 预期结果 | 1. 后端日志 "QuickRuleService 加载完成: greeting=0, routing_keywords=0, routing_targets=0"<br>2. 上层 routing_service 走 `ROUTING_TARGETS` 硬编码兜底<br>3. 用户仍收到 6 类业务路由卡片,业务不中断 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-015 |
|-------|--------|
| 用例名称 | routing_target 字段未配置 — 走硬编码兜底 |
| 前置条件 | quick_rules.routing_target 表为空,但 greeting 和 routing_prefilter 有数据 |
| 测试步骤 | 1. 用户发送"想订机票"<br>2. Dify 命中 routing_prefilter 关键词 → business_category="行政"<br>3. 检查是否返回路由卡片 |
| 预期结果 | 1. 上层 routing_service 检测到 `routing_targets={}` 为空<br>2. 自动降级到 `ROUTING_TARGETS["行政"] = 机票酒店前台`<br>3. 用户收到正确的路由卡片 |
| 测试结果 | ⬜ 待测试 |
---
### 2.5 灰度开关(QUICK_RULE_ENABLEDv1.1 新增)
| TC-ID | TC-016 |
|-------|--------|
| 用例名称 | 开关 = true — check_* 方法生效 |
| 前置条件 | 1) `.env``QUICK_RULE_ENABLED=true`<br>2) 重启后端,确认 settings.quick_rule_enabled=True<br>3) greeting 规则存在关键词"你好呀" |
| 测试步骤 | 1. 用户发送"你好呀"<br>2. 检查后端日志与前端回复 |
| 预期结果 | 1. `check_greeting("你好呀") = True`<br>2. 命中后直接返回规则 response_template<br>3. `messages.reply_source``"quick_rule"` |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-017 |
|-------|--------|
| 用例名称 | 开关 = false — check_* 全员旁路(秒级回退) |
| 前置条件 | 1) `.env``QUICK_RULE_ENABLED=false`<br>2) `docker compose up -d backend` 重启后端容器<br>3) greeting 规则存在关键词"你好呀" |
| 测试步骤 | 1. 用户发送"你好呀"<br>2. 检查后端日志与前端回复 |
| 预期结果 | 1. `check_greeting("你好呀") = False`(旁路)<br>2. `check_routing_keyword(...) = False`(旁路)<br>3. 走正常 AI 回复流程(Dify 主对话)<br>4. 用户收到的回复不再是规则的固定模板<br>5. 业务不中断(仅失去快速规则拦截)<br>6. routing_target 仍由 routing_service 自带的 `ROUTING_TARGETS` 兜底 |
| 测试结果 | ⬜ 待测试 |
---
### 2.6 启动加载
| TC-ID | TC-018 |
|-------|--------|
| 用例名称 | lifespan 阶段 load_all 调通 |
| 前置条件 | 数据库初始化数据完整(53 条) |
| 测试步骤 | 1. 冷启动后端容器<br>2. 等待 health check 通过<br>3. 读取启动日志 |
| 预期结果 | 1. 启动日志含 "QuickRuleService 加载完成: greeting=12, routing_keywords=33, routing_targets=6"<br>2. 数字与初始 SQL 完全一致<br>3. 无异常堆栈 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-019 |
|-------|--------|
| 用例名称 | QuickRuleAuditLog 表已注册到 models/__init__.py |
| 前置条件 | Alembic 已 upgrade 到 055 迁移 |
| 测试步骤 | 1. 启动后端<br>2. 用 psql 检查表结构 |
| 预期结果 | 1. `quick_rule_audit_logs` 表存在<br>2. 含 id/rule_id/action/operator/before/after/created_at 字段<br>3. (回归 BUG-REQ-002-A)若 `models/__init__.py` 未注册,该表将**不创建**,本用例为该 BUG 的回归保险 |
| 测试结果 | ⬜ 待测试 |
---
### 2.7 前端集成
| TC-ID | TC-020 |
|-------|--------|
| 用例名称 | 列表页正确展示规则 |
| 前置条件 | 后端 quick_rules API 返回 12 条 greeting 规则 |
| 测试步骤 | 1. 使用 agent-browser 技能加载管理后台 URL `/quick-rules`<br>2. 输入账号密码登录<br>3. 等待列表渲染 |
| 预期结果 | 1. 表格展示 12 条记录<br>2. **不**复现 BUG-通用-001(深色表格白底白字)<br>3. 类型筛选、关键词搜索均可用 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-021 |
|-------|--------|
| 用例名称 | 表单提交不报 .data undefined |
| 前置条件 | 前端项目已 build 到 disthash 包含 2026-07-28 修复) |
| 测试步骤 | 1. 进入"新建规则"<br>2. 填写表单,提交 |
| 预期结果 | 1. **不**复现 BUG-20260728-01`sr.data` undefined TypeError,拦截器已返回 inner data 时多取一层)<br>2. 提交成功 toast "创建成功" |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-022 |
|-------|--------|
| 用例名称 | 选项点击只发 WS,不再本地立即加消息 |
| 前置条件 | 1) 前端 dist 已部署<br>2) 用户发"重置密码",AI 返回一组路由选项 |
| 测试步骤 | 1. 点击其中一个选项(如"行政-物业"<br>2. 观察消息流 |
| 预期结果 | 1. 前端**不**本地立即添加消息<br>2. WS 收到对端推送后才添加到列表<br>3. `processedMessageIds` Set 去重生效(轮询补集不会重复) |
| 测试结果 | ⬜ 待测试 |
---
### 2.8 v1.2 UI 整理
| TC-ID | TC-027 |
|-------|--------|
| 用例名称 | 页面加载后顶部无 `.stats-row` 卡片 |
| 前置条件 | 管理后台 v1.2 前端页面已部署,管理员已登录 |
| 测试步骤 | 1. 打开 `/itadmin/quick-rules`<br>2. 等待页面和规则列表加载完成<br>3. 检查标签导航上方 DOM |
| 预期结果 | 页面顶部不存在 `.stats-row` 及其 3 张规则统计卡片;筛选区和表格布局正常 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-028 |
|-------|--------|
| 用例名称 | 标签导航徽标数字正确显示 |
| 前置条件 | stats 接口返回 greeting=12、routing_prefilter=35、routing_target=6 |
| 测试步骤 | 1. 打开 `/itadmin/quick-rules`<br>2. 检查打招呼规则、路由关键词、路由目标三个标签的 count 徽标 |
| 预期结果 | 三个标签徽标依次正确显示 12 / 35 / 6,规则计数信息仅由标签导航徽标呈现 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | TC-029 |
|-------|--------|
| 用例名称 | 删除卡片后管理功能完整回归 |
| 前置条件 | 管理后台 v1.2 前端页面已部署,后端 quick-rules API 可用 |
| 测试步骤 | 1. 依次点击三个规则标签并检查表格加载<br>2. 执行筛选、搜索和分页<br>3. 验证批量删除、编辑、启停开关 |
| 预期结果 | 标签切换、表格加载、筛选、搜索、分页、批量删除、编辑和启停开关全部正常,无控制台错误 |
| 测试结果 | ⬜ 待测试 |
---
## 三、接口测试
| TC-ID | IT-001 |
|-------|--------|
| 端点 | `GET /api/admin/quick-rules?type=greeting` |
| 测试步骤 | 1. 用 curl 调用<br>2. 检查响应 |
| 预期结果 | 200 OKitems.length=12,每项含 to_dict 全部字段 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | IT-002 |
|-------|--------|
| 端点 | `POST /api/admin/quick-rules` |
| 测试步骤 | 1. 用 curl 创建重复关键词规则(与 TC-004 同)<br>2. 检查响应 |
| 预期结果 | 400 BadRequestdetail 含 IntegrityError 描述 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | IT-003 |
|-------|--------|
| 端点 | `DELETE /api/admin/quick-rules/{id}` |
| 测试步骤 | 1. 用 curl 删除已删除的 ID<br>2. 检查响应 |
| 预期结果 | 404 NotFounddetail="规则不存在" |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | IT-004 |
|-------|--------|
| 端点 | `GET /api/admin/quick-rules/audit?operator=admin&page=2` |
| 测试步骤 | 1. 查询第二页审计日志(≥100 条假设)<br>2. 检查响应 |
| 预期结果 | 200 OKitems 含完整审计字段,total/page/size 正确 |
| 测试结果 | ⬜ 待测试 |
---
## 四、回归测试
| TC-ID | RT-001 |
|-------|--------|
| 用例名称 | 深色表格可读性回归 |
| 前置条件 | 主题 = dark |
| 测试步骤 | 1. 打开规则列表、审计日志、配置历史等所有 el-table 视图<br>2. 滚动检查偶数行、固定列、hover 状态 |
| 预期结果 | 不复现 BUG-通用-001(白底白字),固定列与普通列底色一致 |
| 测试结果 | ⬜ 待测试 |
---
| TC-ID | RT-002 |
|-------|--------|
| 用例名称 | 拦截器 .data 层数一致性回归 |
| 前置条件 | 全部列表/详情接口 |
| 测试步骤 | 1. 浏览 8 个 quick_rules 相关视图(list/edit/audit/welcome/通用规则)<br>2. 浏览器 console 无 `TypeError: Cannot read properties of undefined (reading 'data')` |
| 预期结果 | 不复现 BUG-20260728-01(已修复 7 处 `.data` 重复取数) |
| 测试结果 | ⬜ 待测试 |
---
## 五、测试完成判定
| 标准 | 要求 |
|------|------|
| 通过率 | 功能测试 25 条 + 接口测试 4 条 = 29 条核心用例,100% 通过 |
| 阻塞 | 0 |
| 回归 | RT-001 / RT-002 必须通过 |
| 验收 | TC-016 / TC-017(灰度开关)必须双跑:true / false 各一次 |
---
## 六、变更记录
| 日期 | 版本 | 变更内容 | 变更人 | 变更原因 | 影响范围 |
|------|------|----------|--------|----------|----------|
| 2026-07-28 | v1.2 | 新增 TC-027TC-029,覆盖顶部统计卡片移除、标签徽标计数及管理功能回归;核心用例由 26 条增至 29 条 | 宋献 | 验证 v1.2 UI 去重不影响既有功能 | 管理后台 `/quick-rules` 页面 |
| 2026-07-28 | v1.1 | 新增 §2.5 灰度开关、§2.7 前端集成及第四章回归测试 9 条用例 | 宋献 | 配合部署文档 v1.1 同步发布 | CRUD、审计、置信度、降级、灰度、启动及前端 |
| 2026-07-27 | v1.0 | 初版基础 22 条用例 | 宋献 | 配合部署文档 v1.0 发布 | 快速回复规则后台管理基础功能 |