v3.1 + 批次0: 智能回复重构基线 - ApprovalMatcher + 关键词降级 + 文档速修 + v4.0任务书面化
This commit is contained in:
@@ -0,0 +1,504 @@
|
||||
# 测试方法论指南
|
||||
|
||||
> **版本**: v1.0 | **生效日期**: 2026-07-14 | **维护人**: Duckula
|
||||
>
|
||||
> 本规范定义 IT 智能服务台项目的测试策略、方法和流程。
|
||||
|
||||
---
|
||||
|
||||
## 1. 测试类型定义
|
||||
|
||||
### 1.1 测试分层模型
|
||||
|
||||
| 层级 | 测试类型 | 覆盖范围 | 工具/方法 | 产出物 |
|
||||
|------|---------|---------|----------|--------|
|
||||
| **Tier 0** | 基础设施测试 | 数据库、缓存、核心服务、工具类 | pytest 单元测试 | `test_*.py` |
|
||||
| **Tier 1** | API 层测试 | 接口正确性、参数校验、权限控制 | pytest + curl | `test_*.py` |
|
||||
| **Tier 2** | 集成测试 | 多模块交互、状态机、事务一致性 | pytest | `test_*.py` |
|
||||
| **E2E** | 端到端测试 | 完整业务流程、用户体验 | Playwright 浏览器自动化 | 测试报告 + 截图 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 测试类型选择标准
|
||||
|
||||
### 2.1 判断决策树
|
||||
|
||||
```
|
||||
新增功能/代码变更
|
||||
│
|
||||
├── 仅修改工具类 / 工具函数 / 算法逻辑
|
||||
│ └── 选择:Tier 0 单元测试
|
||||
│ └── 判断标准:无外部依赖,纯函数逻辑
|
||||
│
|
||||
├── 新增/修改 API 接口
|
||||
│ └── 选择:Tier 1 API 测试
|
||||
│ └── 判断标准:有 HTTP 端点、需要参数校验
|
||||
│
|
||||
├── 多模块交互 / 状态流转 / 事务一致性
|
||||
│ └── 选择:Tier 2 集成测试
|
||||
│ └── 判断标准:涉及 2+ 服务/模块的数据流转
|
||||
│
|
||||
└── 核心业务流程 / 用户体验验证
|
||||
└── 选择:E2E 测试
|
||||
└── 判断标准:需要浏览器真实操作、多端交互
|
||||
```
|
||||
|
||||
### 2.2 场景速查表
|
||||
|
||||
| 场景 | 推荐测试类型 | 必做级别 |
|
||||
|------|-------------|---------|
|
||||
| 新增工具函数(如 TokenCounter) | Tier 0 | 必须 |
|
||||
| 新增 API 端点 | Tier 1 | 必须 |
|
||||
| 修改数据库模型/迁移脚本 | Tier 0 + Tier 1 | 必须 |
|
||||
| 修改 WebSocket 逻辑 | Tier 2 | 必须 |
|
||||
| 修改前端交互流程 | E2E | 必须 |
|
||||
| 登录/认证流程变更 | E2E + Tier 1 | 必须 |
|
||||
| 消息发送/AI 回复流程 | E2E | 必须 |
|
||||
| 知识库/审批流程 | Tier 1 + Tier 2 | 必须 |
|
||||
| 安全/权限控制变更 | Tier 1 + E2E | 必须 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 产出物标准
|
||||
|
||||
### 3.1 测试用例文档模板
|
||||
|
||||
每个功能测试用例文档应包含:
|
||||
|
||||
```markdown
|
||||
# [功能名称] 测试用例
|
||||
|
||||
> **功能模块**: xxx | **测试工程师**: xxx | **日期**: xxx
|
||||
|
||||
## 1. 测试范围
|
||||
- 测试的 API/模块列表
|
||||
|
||||
## 2. 前置条件
|
||||
- 测试账号、环境要求、依赖服务
|
||||
|
||||
## 3. 测试用例清单
|
||||
|
||||
| TC_ID | 场景 | 前置条件 | 测试步骤 | 预期结果 | 状态 |
|
||||
|-------|------|---------|---------|---------|------|
|
||||
| xxx | | | | | |
|
||||
|
||||
## 4. 测试数据
|
||||
- 测试用账号、测试数据构造方式
|
||||
|
||||
## 5. 执行记录
|
||||
|
||||
| 日期 | 测试人员 | 环境 | 结果 |
|
||||
|------|---------|------|------|
|
||||
| | | | |
|
||||
|
||||
## 6. 缺陷记录
|
||||
|
||||
| 缺陷ID | 对应TC | 描述 | 严重程度 | 状态 |
|
||||
|--------|--------|------|----------|------|
|
||||
| | | | | |
|
||||
```
|
||||
|
||||
### 3.2 测试报告模板
|
||||
|
||||
```markdown
|
||||
# [版本/功能] 测试报告
|
||||
|
||||
> **测试工程师**: xxx | **日期**: xxx | **状态**: 通过/失败
|
||||
|
||||
## 测试概览
|
||||
- 测试总数、通过数、失败数、跳过数
|
||||
|
||||
## 测试明细
|
||||
| 用例类型 | 数量 | 通过 | 失败 |
|
||||
|----------|------|------|------|
|
||||
| | | | |
|
||||
|
||||
## Bug 历程
|
||||
| Bug ID | 描述 | 影响 | 修复状态 |
|
||||
|
||||
## 结论
|
||||
- 是否可发布
|
||||
- 风险项
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 流程规范
|
||||
|
||||
### 4.1 新功能上线流程
|
||||
|
||||
```
|
||||
需求评审通过
|
||||
│
|
||||
├── 1. 编写测试用例文档
|
||||
│ └── 路径: docs/06-测试质量/03-功能测试用例/
|
||||
│ └── 命名: [功能名]-测试用例-YYYYMMDD.md
|
||||
│
|
||||
├── 2. 开发代码
|
||||
│
|
||||
├── 3. 执行测试
|
||||
│ ├── Tier 0/1/2 → pytest
|
||||
│ └── E2E → Playwright
|
||||
│
|
||||
├── 4. 产出测试报告
|
||||
│ └── 路径: docs/06-测试质量/04-版本测试报告/
|
||||
│ └── 命名: [功能名]-测试报告-YYYYMMDD.md
|
||||
│
|
||||
└── 5. 发布
|
||||
```
|
||||
|
||||
**强制要求**:
|
||||
- 测试用例文档必须在代码开发前完成初版
|
||||
- 测试用例文档必须随功能上线同步更新
|
||||
- 测试报告是发布的必要前置条件
|
||||
|
||||
### 4.2 故障修复后流程
|
||||
|
||||
```
|
||||
故障发现 → 根因分析 → 修复代码
|
||||
│
|
||||
├── 1. 定位受影响的测试用例
|
||||
│ └── 在 docs/06-测试质量/ 中搜索相关功能
|
||||
│
|
||||
├── 2. 编写/更新自动化测试
|
||||
│ └── 在 backend/tests/ 中添加/更新 test_*.py
|
||||
│
|
||||
├── 3. 执行自动化测试
|
||||
│ └── pytest -v
|
||||
│
|
||||
├── 4. 如有 E2E 场景,补充 E2E 测试
|
||||
│ └── Playwright 浏览器自动化
|
||||
│
|
||||
└── 5. 更新测试用例文档
|
||||
└── 补充故障场景用例
|
||||
```
|
||||
|
||||
**强制要求**:
|
||||
- 故障修复后必须补充相关自动化测试
|
||||
- 测试通过才能宣布故障关闭
|
||||
|
||||
### 4.3 历史功能检查流程
|
||||
|
||||
```
|
||||
定期检查(建议每季度)
|
||||
│
|
||||
├── 1. 列出所有已上线功能
|
||||
│ └── 参考 CHANGELOG.md / 版本发布记录
|
||||
│
|
||||
├── 2. 检查是否存在测试用例文档
|
||||
│ └── docs/06-测试质量/03-功能测试用例/
|
||||
│
|
||||
├── 3. 如缺失,补充测试用例文档
|
||||
│ └── 逆向分析功能 → 编写测试用例
|
||||
│
|
||||
├── 4. 检查测试用例是否仍有效
|
||||
│ ├── 接口路径是否变更
|
||||
│ ├── 参数是否变化
|
||||
│ └── 功能是否已废弃
|
||||
│
|
||||
├── 5. 处理废弃/替换的功能用例
|
||||
│ ├── 移动到 docs/11-历史归档/
|
||||
│ └── 更新 README.md 中的索引
|
||||
│
|
||||
└── 6. 产出检查报告
|
||||
```
|
||||
|
||||
**强制要求**:
|
||||
- 缺失测试用例的功能必须补齐
|
||||
- 废弃功能必须从测试用例目录移除或标注
|
||||
|
||||
---
|
||||
|
||||
## 5. 目录结构规范
|
||||
|
||||
```
|
||||
docs/06-测试质量/
|
||||
├── 00-测试规范/ # 本文档
|
||||
│ └── 测试方法论指南.md
|
||||
│
|
||||
├── 01-综合报告/ # 合并汇总类报告
|
||||
│ └── QA_COMPREHENSIVE_REPORT.md
|
||||
│
|
||||
├── 02-E2E测试/ # 端到端测试
|
||||
│ ├── E2E-CHECKLIST-*.md # 验收清单
|
||||
│ └── e2e-screenshots/ # 截图证据
|
||||
│
|
||||
├── 03-功能测试用例/ # 功能级测试用例文档
|
||||
│ ├── [功能名]-测试用例-YYYYMMDD.md
|
||||
│ └── ...
|
||||
│
|
||||
├── 04-版本测试报告/ # 按版本/日期的测试报告
|
||||
│ └── [功能名]-测试报告-YYYYMMDD.md
|
||||
│
|
||||
└── README.md # 分类索引
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 命名约定
|
||||
|
||||
| 类型 | 命名格式 | 示例 |
|
||||
|------|---------|------|
|
||||
| 测试用例文档 | `[功能名]-测试用例-YYYYMMDD.md` | `OTP绑定-测试用例-20260708.md` |
|
||||
| 测试报告 | `[功能名]-测试报告-YYYYMMDD.md` | `登录功能-测试报告-20260706.md` |
|
||||
| E2E 报告 | `[功能名]-E2E验证报告-YYYYMMDD.md` | `方案A消息发送延时-E2E验证报告-20260708.md` |
|
||||
| 测试代码文件 | `test_[模块名].py` | `test_otp_bind_flow.py` |
|
||||
|
||||
---
|
||||
|
||||
## 7. 质量门禁
|
||||
|
||||
### 7.1 发布门槛
|
||||
|
||||
| 测试类型 | 通过率要求 | 备注 |
|
||||
|---------|-----------|------|
|
||||
| Tier 0 | 100% | 基础设施不能有失败 |
|
||||
| Tier 1 | 100% | API 必须全部通过 |
|
||||
| Tier 2 | 100% | 集成测试必须通过 |
|
||||
| E2E | 核心流程 100% | 核心用户流程不可失败 |
|
||||
|
||||
### 7.2 阻断规则
|
||||
|
||||
- **P0 级别故障**:必须通过 E2E 验证才能发布
|
||||
- **认证/安全变更**:必须通过 Tier 1 + E2E 双重验证
|
||||
- **数据库变更**:必须通过 Tier 0 迁移测试
|
||||
|
||||
---
|
||||
|
||||
## 8. 测试数据管理规范
|
||||
|
||||
### 8.1 数据分类
|
||||
|
||||
| 数据类型 | 说明 | 管理方式 |
|
||||
|---------|------|---------|
|
||||
| **测试账号** | 坐席员工、管理员测试账号 | 固定账号,维护在配置文件中 |
|
||||
| **Mock 数据** | 模拟的会话、消息、审批数据 | 代码中 fixtures 或独立 seed 文件 |
|
||||
| **生产脱敏数据** | 从生产导出的脱敏数据 | 存储在 `data/test/` 目录,严格访问控制 |
|
||||
| **临时测试数据** | 每次测试生成的临时数据 | 测试用例自行清理,禁用手动清理 |
|
||||
|
||||
### 8.2 测试数据原则
|
||||
|
||||
- **隔离性**:每个测试用例使用独立数据,不依赖其他测试的执行结果
|
||||
- **可重复性**:测试数据可重复使用,测试结果一致
|
||||
- **清理机制**:测试完成后自动清理临时数据,不污染环境
|
||||
- **脱敏要求**:从生产导出的数据必须脱敏(手机号、身份证号等)
|
||||
|
||||
### 8.3 测试数据目录结构
|
||||
|
||||
```
|
||||
data/test/
|
||||
├── README.md # 数据说明
|
||||
├── accounts.json # 测试账号配置
|
||||
├── mock_sessions.json # Mock 会话数据
|
||||
└── seed/ # 数据种子文件
|
||||
├── conversations.json
|
||||
└── knowledge.json
|
||||
```
|
||||
|
||||
### 8.4 测试账号规范
|
||||
|
||||
| 角色 | user_id | 用途 |
|
||||
|------|---------|------|
|
||||
| 管理员 | `sxn` | 管理员功能测试 |
|
||||
| 坐席 | `sxn` | 坐席功能测试 |
|
||||
| 员工 | `test_user` | 员工端功能测试 |
|
||||
| Mock 用户 | `E2E_BROWSER` | E2E 自动化测试 |
|
||||
|
||||
---
|
||||
|
||||
## 9. 测试环境配置标准
|
||||
|
||||
### 9.1 环境分类
|
||||
|
||||
| 环境 | 用途 | 数据库 | 特点 |
|
||||
|------|------|--------|------|
|
||||
| **开发环境** | 本地开发调试 | SQLite 内存 | 快速启动,无持久化 |
|
||||
| **测试环境** | 自动化测试 | PostgreSQL | 与生产结构一致 |
|
||||
| **预发布环境** | 上线前验证 | 生产数据副本 | 接近生产 |
|
||||
| **生产环境** | 正式运行 | PostgreSQL | 真实数据 |
|
||||
|
||||
### 9.2 环境配置要求
|
||||
|
||||
#### 9.2.1 开发环境
|
||||
|
||||
```bash
|
||||
# .env 配置示例
|
||||
DEV_MODE=true
|
||||
DATABASE_URL=sqlite:///./test_dev.db
|
||||
REDIS_URL=redis://localhost:6379
|
||||
# 使用 Mock 服务,无需真实企微/Dify
|
||||
```
|
||||
|
||||
#### 9.2.2 测试环境
|
||||
|
||||
```bash
|
||||
# .env 配置示例
|
||||
DEV_MODE=false
|
||||
DATABASE_URL=postgresql://test:test@localhost:5432/wecom_it_test
|
||||
REDIS_URL=redis://localhost:6379/1
|
||||
# 使用测试用企微应用/测试用 Dify
|
||||
WECOM_APP_ID=xxx
|
||||
DIFY_API_KEY=xxx
|
||||
```
|
||||
|
||||
### 9.3 环境切换规则
|
||||
|
||||
| 场景 | 使用环境 | 理由 |
|
||||
|------|---------|------|
|
||||
| 单元测试 (Tier 0) | 开发环境 (SQLite) | 快速、独立 |
|
||||
| API 测试 (Tier 1) | 测试环境 | 验证真实数据库 |
|
||||
| 集成测试 (Tier 2) | 测试环境 | 多模块交互 |
|
||||
| E2E 测试 | 测试/预发布环境 | 接近生产 |
|
||||
| 上线前验证 | 预发布环境 | 最终确认 |
|
||||
|
||||
### 9.4 环境健康检查
|
||||
|
||||
每次测试执行前必须检查:
|
||||
|
||||
- [ ] 数据库连接正常
|
||||
- [ ] Redis 连接正常
|
||||
- [ ] 后端服务可访问
|
||||
- [ ] 依赖服务(Dify、RAGFlow 等)可用
|
||||
|
||||
---
|
||||
|
||||
## 10. CI/CD 集成测试规范
|
||||
|
||||
### 10.1 流水线阶段
|
||||
|
||||
```
|
||||
代码提交 → 静态检查 → 单元测试 → 构建 → 集成测试 → E2E测试 → 部署
|
||||
↓ ↓ ↓
|
||||
Tier 0 Tier 1/2 需要时
|
||||
```
|
||||
|
||||
### 10.2 各阶段要求
|
||||
|
||||
#### 10.2.1 静态检查阶段
|
||||
|
||||
| 检查项 | 工具 | 失败处理 |
|
||||
|--------|------|---------|
|
||||
| Python 类型检查 | mypy | 阻断 |
|
||||
| 代码格式 | ruff / black | 阻断 |
|
||||
| 安全扫描 | bandit | 阻断 |
|
||||
|
||||
#### 10.2.2 单元测试阶段 (Tier 0)
|
||||
|
||||
```yaml
|
||||
# .github/workflows/test.yml 示意
|
||||
- name: Run Tier 0 tests
|
||||
run: |
|
||||
pytest backend/tests/test_*.py -v --tb=short
|
||||
timeout-minutes: 10
|
||||
```
|
||||
|
||||
**要求**:
|
||||
- 必须通过
|
||||
- 覆盖率不做强制要求,但核心模块应覆盖
|
||||
|
||||
#### 10.2.3 集成测试阶段 (Tier 1/2)
|
||||
|
||||
```yaml
|
||||
- name: Run Tier 1/2 tests
|
||||
run: |
|
||||
pytest backend/tests/test_api_*.py -v --tb=short
|
||||
timeout-minutes: 20
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15
|
||||
env:
|
||||
POSTGRES_DB: wecom_it_test
|
||||
redis:
|
||||
image: redis:7
|
||||
```
|
||||
|
||||
**要求**:
|
||||
- 使用独立的测试数据库
|
||||
- 测试完成后清理数据
|
||||
|
||||
#### 10.2.4 E2E 测试阶段
|
||||
|
||||
```yaml
|
||||
- name: Run E2E tests
|
||||
run: |
|
||||
pytest tests/e2e/ -v --tb=short
|
||||
timeout-minutes: 30
|
||||
conditions: ${{ github.event_name == 'pull_request' }}
|
||||
```
|
||||
|
||||
**要求**:
|
||||
- 仅在 PR 时执行
|
||||
- 生产部署后可通过手动触发
|
||||
|
||||
### 10.3 分支策略
|
||||
|
||||
| 分支 | 执行测试 | 部署目标 |
|
||||
|------|---------|---------|
|
||||
| feature/* | Tier 0 + Tier 1 | 不自动部署 |
|
||||
| bugfix/* | Tier 0 + Tier 1 | 不自动部署 |
|
||||
| main | 全部 Tier | 自动部署到测试环境 |
|
||||
| release/* | 全部 Tier + E2E | 预发布环境 |
|
||||
|
||||
### 10.4 失败处理
|
||||
|
||||
| 失败类型 | 处理方式 |
|
||||
|---------|---------|
|
||||
| Tier 0 失败 | 阻断合并 |
|
||||
| Tier 1/2 失败 | 阻断合并 |
|
||||
| E2E 失败 | 警告,可选择是否阻断 |
|
||||
| 超时 | 重试 1 次,仍失败则阻断 |
|
||||
|
||||
---
|
||||
|
||||
## 11. 附录
|
||||
|
||||
### 11.1 测试工具清单
|
||||
|
||||
| 用途 | 工具 | 配置 |
|
||||
|------|------|------|
|
||||
| Python 单元/集成测试 | pytest + pytest-asyncio | `conftest.py` |
|
||||
| 浏览器自动化 | Playwright | Python binding |
|
||||
| HTTP 测试 | curl / httpx | 直接调用 API |
|
||||
| 数据库测试 | 直接 SQL / SQLAlchemy | 迁移脚本验证 |
|
||||
|
||||
### 11.2 配置文件模板
|
||||
|
||||
#### 11.2.1 测试配置 (pytest.ini)
|
||||
|
||||
```ini
|
||||
[pytest]
|
||||
testpaths = backend/tests
|
||||
python_files = test_*.py
|
||||
python_classes = Test*
|
||||
python_functions = test_*
|
||||
asyncio_mode = auto
|
||||
addopts = -v --tb=short
|
||||
```
|
||||
|
||||
#### 11.2.2 E2E 配置 (playwright.config.py)
|
||||
|
||||
```python
|
||||
import pytest
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def browser_type_launch_args(browser_type_launch_args):
|
||||
return {
|
||||
**browser_type_launch_args,
|
||||
"headless": True,
|
||||
}
|
||||
```
|
||||
|
||||
### 11.3 相关文档
|
||||
|
||||
- 技术架构:`../03-技术架构/`
|
||||
- 产品需求:`../02-产品需求/`
|
||||
- 项目管理:`../10-项目管理/`
|
||||
- 历史归档:`../11-历史归档/`
|
||||
|
||||
---
|
||||
|
||||
> **修订记录**
|
||||
>
|
||||
> | 版本 | 日期 | 变更内容 | 修改人 |
|
||||
> |------|------|----------|--------|
|
||||
> | v1.0 | 2026-07-14 | 初始版本,整合测试方法、数据、环境、CI/CD规范 | Duckula |
|
||||
@@ -0,0 +1,140 @@
|
||||
# 会话存档功能 - 测试用例
|
||||
|
||||
> **版本**: v1.0 | **日期**: 2026-07-15 | **状态**: 已完成
|
||||
|
||||
---
|
||||
|
||||
## 1. 测试范围
|
||||
|
||||
| 模块 | 测试类型 | 优先级 |
|
||||
|------|----------|--------|
|
||||
| 数据模型 | 单元测试 | P0 |
|
||||
| 归档脚本 | 单元测试 | P0 |
|
||||
| 管理后台 API | 接口测试 | P0 |
|
||||
| 坐席端显示 | 集成测试 | P1 |
|
||||
| 管理后台 UI | UI 测试 | P1 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据模型测试
|
||||
|
||||
### 2.1 Conversation 字段测试
|
||||
|
||||
| 用例ID | 测试场景 | 预期结果 | 优先级 |
|
||||
|--------|----------|----------|--------|
|
||||
| MODEL-01 | 创建会话时 is_archived 默认值为 false | 默认为 false | P0 |
|
||||
| MODEL-02 | 创建会话时 archived_at 默认值为 null | 默认为 null | P0 |
|
||||
| MODEL-03 | 归档会话后 is_archived 更新为 true | 值为 true | P0 |
|
||||
| MODEL-04 | 归档会话后 archived_at 记录归档时间 | 值为归档时间 | P0 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 归档脚本测试
|
||||
|
||||
### 3.1 自动归档测试
|
||||
|
||||
| 用例ID | 测试场景 | 预期结果 | 优先级 |
|
||||
|--------|----------|----------|--------|
|
||||
| SCRIPT-01 | 已结单超过90天的会话 | 自动标记为已归档 | P0 |
|
||||
| SCRIPT-02 | 已结单不足90天的会话 | 不标记为已归档 | P0 |
|
||||
| SCRIPT-03 | 未结单的会话 | 不标记为已归档 | P0 |
|
||||
| SCRIPT-04 | 已归档的会话再次执行 | 跳过已归档会话 | P0 |
|
||||
| SCRIPT-05 | 无需归档的会话执行 | 输出"没有需要归档的会话" | P0 |
|
||||
|
||||
### 3.2 归档数据准确性测试
|
||||
|
||||
| 用例ID | 测试场景 | 预期结果 | 优先级 |
|
||||
|--------|----------|----------|--------|
|
||||
| SCRIPT-06 | 归档时记录正确的归档时间 | archived_at 与当前时间误差 < 1秒 | P0 |
|
||||
| SCRIPT-07 | 批量归档多条会话 | 所有会话正确标记 | P0 |
|
||||
|
||||
### 3.3 日志测试
|
||||
|
||||
| 用例ID | 测试场景 | 预期结果 | 优先级 |
|
||||
|--------|----------|----------|--------|
|
||||
| SCRIPT-08 | 归档执行成功 | 输出归档数量统计 | P1 |
|
||||
| SCRIPT-09 | 归档执行失败 | 输出错误信息 | P1 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 管理后台 API 测试
|
||||
|
||||
### 4.1 会话列表接口
|
||||
|
||||
| 用例ID | 测试场景 | 预期结果 | 优先级 |
|
||||
|--------|----------|----------|--------|
|
||||
| API-01 | 不传 is_archived 参数 | 返回全部会话 | P0 |
|
||||
| API-02 | 传 is_archived=true | 仅返回已归档会话 | P0 |
|
||||
| API-03 | 传 is_archived=false | 仅返回未归档会话 | P0 |
|
||||
| API-04 | 组合筛选 status + is_archived | 正确筛选 | P0 |
|
||||
| API-05 | 分页参数测试 | 分页数据正确 | P1 |
|
||||
|
||||
### 4.2 响应数据结构
|
||||
|
||||
| 用例ID | 测试场景 | 预期结果 | 优先级 |
|
||||
|--------|----------|----------|--------|
|
||||
| API-06 | 获取会话列表 | 包含 is_archived 和 archived_at 字段 | P0 |
|
||||
| API-07 | 会话详情 | 归档信息正确 | P0 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 坐席端测试
|
||||
|
||||
### 5.1 历史会话显示测试
|
||||
|
||||
| 用例ID | 测试场景 | 预期结果 | 优先级 |
|
||||
|--------|----------|----------|--------|
|
||||
| AGENT-01 | 90天内的已结单会话 | 显示在历史会话中 | P0 |
|
||||
| AGENT-02 | 超过90天的已结单会话 | 不显示在历史会话中 | P0 |
|
||||
| AGENT-03 | 活跃会话 | 显示在当前会话列表 | P0 |
|
||||
|
||||
### 5.2 筛选功能测试
|
||||
|
||||
| 用例ID | 测试场景 | 预期结果 | 优先级 |
|
||||
|--------|----------|----------|--------|
|
||||
| AGENT-04 | 搜索历史会话 | 按关键词过滤 | P1 |
|
||||
| AGENT-05 | 切换筛选标签 | 正确切换显示内容 | P1 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 管理后台 UI 测试
|
||||
|
||||
### 6.1 归档状态筛选
|
||||
|
||||
| 用例ID | 测试场景 | 预期结果 | 优先级 |
|
||||
|--------|----------|----------|--------|
|
||||
| UI-01 | 选择"全部" | 显示所有会话 | P0 |
|
||||
| UI-02 | 选择"未归档" | 仅显示未归档会话 | P0 |
|
||||
| UI-03 | 选择"已归档" | 仅显示已归档会话 | P0 |
|
||||
|
||||
### 6.2 归档状态显示
|
||||
|
||||
| 用例ID | 测试场景 | 预期结果 | 优先级 |
|
||||
|--------|----------|----------|--------|
|
||||
| UI-04 | 查看未归档会话 | 显示"-"或空 | P0 |
|
||||
| UI-05 | 查看已归档会话 | 显示"已归档"标签 | P0 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 性能测试
|
||||
|
||||
| 用例ID | 测试场景 | 预期结果 | 优先级 |
|
||||
|--------|----------|----------|--------|
|
||||
| PERF-01 | 1000条会话归档 | 执行时间 < 5秒 | P1 |
|
||||
| PERF-02 | 归档期间查询会话 | 不影响在线查询 | P1 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 测试用例执行记录
|
||||
|
||||
| 执行日期 | 测试人员 | 通过数 | 失败数 | 备注 |
|
||||
|----------|----------|--------|--------|------|
|
||||
| 2026-07-15 | Duckula | — | — | 待执行 |
|
||||
|
||||
---
|
||||
|
||||
## 9. 版本历史
|
||||
|
||||
| 版本 | 日期 | 变更 |
|
||||
|------|------|------|
|
||||
| v1.0 | 2026-07-15 | 初始版本 |
|
||||
@@ -0,0 +1,111 @@
|
||||
# 测试质量文档分类索引
|
||||
|
||||
> 本目录包含 IT 智能服务台项目的所有测试相关文档。按类型分类,便于查阅和维护。
|
||||
|
||||
---
|
||||
|
||||
## 📁 文档分类结构
|
||||
|
||||
```
|
||||
docs/06-测试质量/
|
||||
├── 00-测试规范/ # 测试方法论、流程、规范
|
||||
│ └── 测试方法论指南.md
|
||||
│
|
||||
├── 01-综合报告/ # 合并汇总类报告
|
||||
│ └── QA_COMPREHENSIVE_REPORT.md
|
||||
│
|
||||
├── 02-E2E测试/ # 端到端测试
|
||||
│ ├── E2E-CHECKLIST-v0.7.0.md # v0.7.0 验收清单(扫码登录+MFA)
|
||||
│ ├── 方案A-消息发送延时-E2E验证报告-20260708.md
|
||||
│ └── e2e-screenshots/ # 截图证据
|
||||
│ ├── 01-login.png
|
||||
│ ├── 02-chat-after-login.png
|
||||
│ ├── 03-after-send-instant.png
|
||||
│ ├── 04-typewriter-mid.png
|
||||
│ ├── 05-final.png
|
||||
│ ├── 99-error.png
|
||||
│ ├── diag.txt
|
||||
│ └── e2e_result.json
|
||||
│
|
||||
├── 03-功能测试用例/ # 具体功能测试用例
|
||||
│ ├── TESTING_CALL_AGENT.md # 呼叫坐席功能验证
|
||||
│ └── 登录功能测试用例-20260706.md
|
||||
│
|
||||
├── 04-版本测试报告/ # 按日期/版本分类
|
||||
│ ├── OTP绑定-测试报告-20260708.md # OTP 首次绑定测试
|
||||
│ ├── P0串联+P2可视化-测试报告-20260708.md
|
||||
│ ├── RBAC-BugFix-测试报告-20260707.md
|
||||
│ ├── Tier0-测试报告-20260708.md
|
||||
│ ├── Tier1-测试报告-20260708.md
|
||||
│ ├── 看板验真-测试报告-20260707.md
|
||||
│ └── 知识迭代Bug修复报告-20260711.md
|
||||
│
|
||||
└── README.md # 本文件
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 文档清单总览
|
||||
|
||||
| 分类 | 文档名称 | 测试范围 | 状态 |
|
||||
|------|---------|---------|------|
|
||||
| **测试规范** | 测试方法论指南.md | 测试策略、方法、流程、数据管理、环境配置、CI/CD规范 | ✅ 生效中 |
|
||||
| **综合报告** | QA_COMPREHENSIVE_REPORT.md | P2/P3单元测试 + WebSocket + 坐席v5.3 | ✅ 通过 |
|
||||
| **E2E测试** | E2E-CHECKLIST-v0.7.0.md | 扫码登录 + MFA + P0/P1合规验证 | ✅ 通过 |
|
||||
| **E2E测试** | 方案A-消息发送延时-E2E验证报告 | WS打字机 + 发送即时性 | ✅ 通过 |
|
||||
| **功能测试** | TESTING_CALL_AGENT.md | 呼叫坐席功能(3次AI回复后出现按钮) | ✅ 通过 |
|
||||
| **功能测试** | 登录功能测试用例-20260706.md | 企微免密 + 账号密码 + MFA | 📋 待执行 |
|
||||
| **版本报告** | OTP绑定-测试报告-20260708.md | 首次绑定 + 重置流程 | ✅ 通过 |
|
||||
| **版本报告** | Tier0-测试报告-20260708.md | 知识库迭代基础设施 | ✅ 通过 |
|
||||
| **版本报告** | Tier1-测试报告-20260708.md | API层 + 前端组件 | ✅ 通过 |
|
||||
| **版本报告** | P0串联+P2可视化-测试报告 | 会话关闭建议 + 知识图谱 | ✅ 通过 |
|
||||
| **版本报告** | RBAC-BugFix-测试报告 | admin_users装饰器修复 | ✅ 通过 |
|
||||
| **版本报告** | 看板验真-测试报告 | 5项存量功能验证 | ⚠️ 3/5通过 |
|
||||
| **版本报告** | 知识迭代Bug修复报告 | POST /suggestions + Neo4j MERGE | ✅ 通过 |
|
||||
|
||||
---
|
||||
|
||||
## 🏷️ 按标签分类
|
||||
|
||||
### 身份认证 & 安全
|
||||
- `E2E-CHECKLIST-v0.7.0.md` — 扫码登录、MFA绑定与验证
|
||||
- `登录功能测试用例-20260706.md` — 企微免密、账号密码、OTP
|
||||
- `OTP绑定-测试报告-20260708.md` — 首次绑定、管理员重置
|
||||
- `RBAC-BugFix-测试报告-20260707.md` — 权限装饰器修复
|
||||
|
||||
### 消息 & WebSocket
|
||||
- `方案A-消息发送延时-E2E验证报告-20260708.md` — 发送即时返回 + WS流式
|
||||
- `QA_COMPREHENSIVE_REPORT.md` — WebSocket 实时推送功能
|
||||
|
||||
### 知识库 & AI
|
||||
- `Tier0-测试报告-20260708.md` — Neo4j、审批状态机、置信门控
|
||||
- `Tier1-测试报告-20260708.md` — Vision、RAGFlow、审批队列、知识迭代
|
||||
- `知识迭代Bug修复报告-20260711.md` — POST端点、Neo4j MERGE、过期检查
|
||||
|
||||
### 业务功能
|
||||
- `TESTING_CALL_AGENT.md` — 呼叫坐席功能
|
||||
- `P0串联+P2可视化-测试报告-20260708.md` — 会话关闭建议、知识图谱可视化
|
||||
- `看板验真-测试报告-20260707.md` — 排队、AI Wingman、知识库、RBAC、敏感词
|
||||
|
||||
---
|
||||
|
||||
## 📊 测试统计汇总
|
||||
|
||||
| 指标 | 数值 |
|
||||
|------|------|
|
||||
| 测试文档总数 | 12 |
|
||||
| 单元测试用例 | 200+ |
|
||||
| E2E 测试用例 | 50+ |
|
||||
| 总通过率 | ~95% |
|
||||
|
||||
---
|
||||
|
||||
## 🔗 关联文档
|
||||
|
||||
- 技术架构:`../03-技术架构/`
|
||||
- 产品需求:`../02-产品需求/`
|
||||
- 项目管理:`../10-项目管理/05-项目状态看板/`
|
||||
|
||||
---
|
||||
|
||||
> 最后更新:2026-07-14 | 整理人:Duckula
|
||||
@@ -0,0 +1,219 @@
|
||||
# Token多IP异常检测 - 测试用例
|
||||
|
||||
> **任务ID**: 待分配
|
||||
> **关联文档**: 技术设计-Token多IP异常检测.md
|
||||
> **测试环境**: 开发环境 / 测试环境
|
||||
|
||||
---
|
||||
|
||||
## 1. 测试概述
|
||||
|
||||
### 1.1 测试目标
|
||||
|
||||
验证Token多IP异常检测功能的正确性,确保:
|
||||
- 正常多设备使用不触发误报
|
||||
- 异常多IP使用能正确触发告警
|
||||
- 告警内容准确
|
||||
|
||||
### 1.2 测试范围
|
||||
|
||||
| 模块 | 测试内容 |
|
||||
|------|----------|
|
||||
| record_token_ip | IP记录逻辑 |
|
||||
| detect_anomaly | 异常检测逻辑 |
|
||||
| 告警发送 | 企微消息格式 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 测试用例
|
||||
|
||||
### 2.1 单元测试
|
||||
|
||||
#### T001: 单IP使用Token
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 用例ID | T001 |
|
||||
| 场景 | 同一IP多次使用Token |
|
||||
| 预置条件 | Redis中无数据 |
|
||||
| 测试步骤 | 1. 调用 record_token_ip(token="test", ip="10.0.0.1") <br> 2. 获取 token_ips:* key的SCARD值 |
|
||||
| 预期结果 | IP数量=1,不触发告警 |
|
||||
| 实际结果 | |
|
||||
| 状态 | ☐ |
|
||||
|
||||
#### T002: 3个IP使用Token (阈值)
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 用例ID | T002 |
|
||||
| 场景 | 3个不同IP使用同一Token |
|
||||
| 预置条件 | Redis中已有token_ips:test包含2个IP |
|
||||
| 测试步骤 | 1. 调用 record_token_ip(token="test", ip="10.0.0.3") <br> 2. 执行 detect_token_anomaly() <br> 3. 检查告警是否发送 |
|
||||
| 预期结果 | IP数量=3,触发告警 |
|
||||
| 实际结果 | |
|
||||
| 状态 | ☐ |
|
||||
|
||||
#### T003: 5个IP使用Token (严重)
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 用例ID | T003 |
|
||||
| 场景 | 5个不同IP使用同一Token |
|
||||
| 预置条件 | Redis中已有token_ips:test包含4个IP |
|
||||
| 测试步骤 | 1. 调用 record_token_ip(token="test", ip="10.0.0.5") <br> 2. 执行 detect_token_anomaly() |
|
||||
| 预期结果 | IP数量=5,触发告警(严重) |
|
||||
| 实际结果 | |
|
||||
| 状态 | ☐ |
|
||||
|
||||
#### T004: 同一IP多次使用
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 用例ID | T004 |
|
||||
| 场景 | 同一IP多次调用record_token_ip |
|
||||
| 预置条件 | Redis中已有token_ips:test包含1个IP |
|
||||
| 测试步骤 | 1. 调用 record_token_ip(token="test", ip="10.0.0.1") 3次 <br> 2. 获取 token_ips:test 的SCARD值 |
|
||||
| 预期结果 | IP数量仍为1(Set自动去重) |
|
||||
| 实际结果 | |
|
||||
| 状态 | ☐ |
|
||||
|
||||
#### T005: Token过期后IP清空
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 用例ID | T005 |
|
||||
| 场景 | Token过期后IP记录清空 |
|
||||
| 预置条件 | Redis中token_ips:test存在,TTL=60秒 |
|
||||
| 测试步骤 | 1. 等待TTL过期 <br> 2. 检查key是否存在 |
|
||||
| 预期结果 | key不存在(自动过期) |
|
||||
| 实际结果 | |
|
||||
| 状态 | ☐ |
|
||||
|
||||
#### T006: 重复告警抑制
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 用例ID | T006 |
|
||||
| 场景 | 同一异常Token在告警周期内再次触发 |
|
||||
| 预置条件 | 已触发过告警,alerted_key存在 |
|
||||
| 测试步骤 | 1. 执行 detect_token_anomaly() <br> 2. 检查告警发送次数 |
|
||||
| 预期结果 | 不重复发送告警 |
|
||||
| 实际结果 | |
|
||||
| 状态 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
### 2.2 集成测试
|
||||
|
||||
#### I001: 真实API请求IP记录
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 用例ID | I001 |
|
||||
| 场景 | 通过API请求触发IP记录 |
|
||||
| 预置条件 | 后端服务运行中 |
|
||||
| 测试步骤 | 1. 发送HTTP请求(带X-Forwarded-For) <br> 2. 检查Redis中IP是否记录 |
|
||||
| 预期结果 | X-Forwarded-For的IP被记录 |
|
||||
| 实际结果 | |
|
||||
| 状态 | ☐ |
|
||||
|
||||
#### I002: 定时任务完整流程
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 用例ID | I002 |
|
||||
| 场景 | 定时任务触发完整检测流程 |
|
||||
| 预置条件 | 3个异常Token存在 |
|
||||
| 测试步骤 | 1. 等待定时任务执行(60秒) <br> 2. 检查告警记录 |
|
||||
| 预期结果 | 3条告警发送 |
|
||||
| 实际结果 | |
|
||||
| 状态 | ☐ |
|
||||
|
||||
#### I003: 企微消息格式
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 用例ID | I003 |
|
||||
| 场景 | 告警消息格式正确 |
|
||||
| 预置条件 | webhook配置正确 |
|
||||
| 测试步骤 | 1. 触发告警 <br> 2. 检查企微收到的消息 |
|
||||
| 预期结果 | markdown格式,包含employee_id、ip_count、token_hash |
|
||||
| 实际结果 | |
|
||||
| 状态 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## 3. 测试数据
|
||||
|
||||
### 3.1 测试Token
|
||||
|
||||
| Token | employee_id | 说明 |
|
||||
|-------|-------------|------|
|
||||
| test-token-001 | user001 | 单IP测试 |
|
||||
| test-token-002 | user002 | 3IP阈值测试 |
|
||||
| test-token-003 | user003 | 5IP严重测试 |
|
||||
| test-token-004 | user004 | 重复告警测试 |
|
||||
|
||||
### 3.2 测试IP
|
||||
|
||||
| IP | 类型 | 说明 |
|
||||
|----|------|------|
|
||||
| 10.0.0.1 | 内网 | 正常IP |
|
||||
| 10.0.0.2 | 内网 | 正常IP |
|
||||
| 10.0.0.3 | 内网 | 异常IP |
|
||||
| 218.75.34.87 | 公网 | 外部IP |
|
||||
| 117.147.35.138 | 公网 | 外部IP |
|
||||
|
||||
---
|
||||
|
||||
## 4. 测试环境配置
|
||||
|
||||
### 4.1 环境变量
|
||||
|
||||
```bash
|
||||
# 测试环境配置
|
||||
TOKEN_ANOMALY_THRESHOLD=3
|
||||
TOKEN_ANOMALY_WINDOW=3600
|
||||
TOKEN_ANOMALY_AUTO_DISABLE=false
|
||||
CONTENT_AUDIT_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx
|
||||
```
|
||||
|
||||
### 4.2 Redis预置
|
||||
|
||||
```bash
|
||||
# 预置测试数据
|
||||
redis-cli SET "user:token:test-token-001" '{"employee_id":"user001",...}'
|
||||
redis-cli SADD "token_ips:hash001" "10.0.0.1"
|
||||
redis-cli EXPIRE "token_ips:hash001" 3600
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 测试结果
|
||||
|
||||
| 用例ID | 预期 | 实际 | 状态 | 备注 |
|
||||
|--------|------|------|------|------|
|
||||
| T001 | 通过 | | ☐ | |
|
||||
| T002 | 通过 | | ☐ | |
|
||||
| T003 | 通过 | | ☐ | |
|
||||
| T004 | 通过 | | ☐ | |
|
||||
| T005 | 通过 | | ☐ | |
|
||||
| T006 | 通过 | | ☐ | |
|
||||
| I001 | 通过 | | ☐ | |
|
||||
| I002 | 通过 | | ☐ | |
|
||||
| I003 | 通过 | | ☐ | |
|
||||
|
||||
---
|
||||
|
||||
## 6. 测试签收
|
||||
|
||||
| 角色 | 姓名 | 日期 | 签名 |
|
||||
|------|------|------|------|
|
||||
| 开发 | | | |
|
||||
| 测试 | | | |
|
||||
| 审核 | | | |
|
||||
|
||||
---
|
||||
|
||||
> **编制人**: 威胁检测工程师
|
||||
> **日期**: 2026-07-14
|
||||
Reference in New Issue
Block a user