# 功能中心深层交互用例补充 执行计划文档

> **文档版本**: v1.0
> **创建日期**: 2026-07-23
> **关联 PRD**: _PRD_需求文档_功能中心深层交互用例补充.md v1.0
> **负责人**: czj

---

## 一、执行概述

### 1.1 项目背景

当前UI自动化测试平台有202个用例，其中59个是"页面访问验证"用例。深层交互用例仅覆盖会议管理、数据分析、管理看板、运维管理四个模块。本计划为37个页面补充73个深层交互用例，使深层交互覆盖率达到70%以上。

### 1.2 执行目标

| 目标 | 描述 | 验收标准 |
|------|------|---------|
| 新增用例 | 为37个页面补充深层交互用例 | 新增73个用例，总数达到275 |
| 步骤模板化 | 创建可复用的步骤模板函数 | 7个模板函数 |
| 用例执行 | 新增用例批量执行通过率 | >= 75% |
| 功能覆盖 | 深层交互用例覆盖率 | >= 70% |

### 1.3 技术选型

| 项目 | 选择 | 说明 |
|------|------|------|
| 步骤格式 | 现有 StepDefinition JSON | 无需修改 Schema |
| 导航方式 | 功能中心抽屉 / 首页菜单 | 根据页面位置选择 |
| 断言策略 | element_exists / element_count_min | 宽松断言优先 |
| 选择器策略 | selectors 回退链 | 多级回退提高稳定性 |
| 数据更新 | API 批量创建 | 通过 /api/cases POST 接口 |

### 1.4 预计工期

| 阶段 | 内容 | 预计时间 |
|------|------|---------|
| Phase 1 | 编写PRD和执行计划文档 | 0.5 天 |
| Phase 2 | 创建用例创建脚本 | 1 天 |
| Phase 3 | 执行脚本创建用例 | 0.5 小时 |
| Phase 4 | 单用例验证 | 1 小时 |
| Phase 5 | 批量执行验证 | 1 小时 |
| Phase 6 | 问题修复 | 0.5 天 |
| **总计** | | **约2.5天** |

---

## 二、任务分解与实施计划

### 2.1 Phase 1: 文档编写（已完成）

- PRD需求文档: `Docs/PRD/需求文档/用例管理/_PRD_需求文档_功能中心深层交互用例补充.md`
- 执行计划文档: `Docs/PRD/需求文档/用例管理/_执行计划_功能中心深层交互用例补充.md`

### 2.2 Phase 2: 创建用例创建脚本

#### 2.2.1 任务清单

| 任务ID | 任务名称 | 说明 | 优先级 |
|--------|---------|------|--------|
| P2-001 | 新建脚本文件 | create_deep_cases_func_center_v3.py | P0 |
| P2-002 | 实现步骤模板函数 | 7个模板函数 | P0 |
| P2-003 | 实现用例构建函数 | 9个模块用例构建函数 | P0 |
| P2-004 | 实现用例创建逻辑 | 按名称查找更新或创建 | P0 |

#### 2.2.2 步骤模板函数设计

**模板1: 功能中心导航模板**

```python
def build_func_center_navigate_steps(menu_name: str, wait_selector: str = "body",
                                     wait_timeout: int = 20000, order_start: int = 1):
    """
    构建功能中心抽屉导航步骤
    适用于：会议运维、集控控制、资产管理、维护工单、会务管理、信息管理、信息发布、其他分类
    """
    return [
        {"order": order_start, "name": "等待首页加载", "action": "wait", 
         "params": {"selector": ".block", "timeout": 15000}},
        {"order": order_start + 1, "name": "点击功能中心图标", "action": "click", 
         "params": {"selector": ".home_nav_left"}},
        {"order": order_start + 2, "name": "等待抽屉打开", "action": "wait", 
         "params": {"selector": ".el-drawer", "timeout": 15000}},
        {"order": order_start + 3, "name": f"点击{menu_name}", "action": "click", 
         "params": {"selector": f".el-drawer >> text='{menu_name}'"}},
        {"order": order_start + 4, "name": "等待抽屉关闭", "action": "wait", 
         "params": {"selector": "body", "timeout": 3000}},
        {"order": order_start + 5, "name": "等待页面加载", "action": "wait", 
         "params": {"selector": wait_selector, "timeout": wait_timeout}},
    ]
```

**模板2: 首页菜单导航模板**

```python
def build_home_menu_navigate_steps(menu_name: str, wait_selector: str = "body",
                                   wait_timeout: int = 20000, order_start: int = 1):
    """
    构建首页菜单卡片导航步骤
    适用于：数据分析、管理看板、运维管理、会议管理
    """
    return [
        {"order": order_start, "name": f"点击{menu_name}菜单", "action": "click", 
         "params": {"selector": f'.block:has-text("{menu_name}")'}},
        {"order": order_start + 1, "name": "等待页面加载", "action": "wait", 
         "params": {"selector": wait_selector, "timeout": wait_timeout}},
        {"order": order_start + 2, "name": "等待页面渲染", "action": "wait", 
         "params": {"selector": "body", "timeout": 3000}},
    ]
```

**模板3: 表格等待模板**

```python
def build_table_wait_steps(order_start: int):
    """构建表格等待步骤"""
    return [
        {"order": order_start, "name": "等待表格加载", "action": "wait", 
         "params": {"selector": ".el-table", "timeout": 30000}},
        {"order": order_start + 1, "name": "等待表格渲染", "action": "wait", 
         "params": {"selector": "body", "timeout": 3000}},
    ]
```

**模板4: 筛选器操作模板**

```python
def build_filter_select_steps(select_index: int, order_start: int):
    """构建筛选器下拉选择步骤"""
    input_selectors = [
        f".el-select:nth-child({select_index + 1}) .el-input__inner",
        f".el-select:nth-child({select_index + 1}) .el-select__input",
        f".el-select:nth-child({select_index + 1})",
        ".el-select .el-input__inner",
        ".el-select",
    ]
    option_selectors = [
        ".el-select-dropdown:visible .el-select-dropdown__item:first-child",
        ".el-select-dropdown__item:first-child",
    ]
    return [
        {"order": order_start, "name": f"点击第{select_index + 1}个筛选器", "action": "click", 
         "params": {"selectors": input_selectors}},
        {"order": order_start + 1, "name": "选择第一个选项", "action": "click", 
         "params": {"selectors": option_selectors, "timeout": 5000}},
    ]
```

**模板5: Tab切换模板**

```python
def build_tab_switch_steps(tab_index: int, order_start: int, wait_selector: str = "body"):
    """构建Tab切换步骤"""
    return [
        {"order": order_start, "name": f"点击第{tab_index + 1}个Tab", "action": "click", 
         "params": {"selector": f".el-tabs__item:nth-child({tab_index + 1})"}},
        {"order": order_start + 1, "name": "等待内容加载", "action": "wait", 
         "params": {"selector": wait_selector, "timeout": 5000}},
    ]
```

**模板6: 图表等待模板**

```python
def build_canvas_wait_steps(order_start: int):
    """构建图表等待步骤"""
    return [
        {"order": order_start, "name": "等待图表加载", "action": "wait", 
         "params": {"selectors": [".echarts", ".chart-container canvas", "canvas", "[class*='chart']"], "timeout": 30000}},
        {"order": order_start + 1, "name": "等待图表渲染", "action": "wait", 
         "params": {"selector": "body", "timeout": 3000}},
    ]
```

**模板7: 回到首页模板**

```python
def build_navigate_home_step(order: int):
    """构建回到首页步骤（状态重置）"""
    return {
        "order": order,
        "name": "回到首页",
        "action": "navigate",
        "params": {"url": "https://192.168.5.44"},
    }
```

### 2.3 Phase 3: 执行脚本创建用例

运行脚本将73个用例写入数据库：
```bash
cd backend
PYTHONIOENCODING=utf-8 python scripts/create_deep_cases_func_center_v3.py
```

### 2.4 Phase 4: 单用例验证

每个模块挑选1个代表性用例执行验证：
- 会议运维：告警列表-筛选器交互验证
- 集控控制：文件推送-筛选器验证
- 资产管理：资产信息-筛选器交互验证
- 维护工单：工单列表-Tab切换验证
- 会务管理：会务统筹-筛选器验证
- 信息管理：下载列表-筛选器验证
- 其他分类：会议审批-Tab切换验证
- 数据分析：RSE会议统计-图表验证

### 2.5 Phase 5: 批量执行验证

批量执行所有新建用例，统计通过率，目标 >= 75%。

### 2.6 Phase 6: 问题修复

针对失败用例分析原因并修复步骤定义。

---

## 三、代码变更

### 3.1 新建文件

| 文件 | 说明 |
|------|------|
| `backend/scripts/create_deep_cases_func_center_v3.py` | 主脚本：创建73个深层交互用例 |
| `Docs/PRD/需求文档/用例管理/_PRD_需求文档_功能中心深层交互用例补充.md` | PRD需求文档 |
| `Docs/PRD/需求文档/用例管理/_执行计划_功能中心深层交互用例补充.md` | 执行计划文档 |

### 3.2 脚本核心结构

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
模块名称：create_deep_cases_func_center_v3.py
模块描述：补充功能中心各模块深层交互测试用例（v3版本）

覆盖模块：
- 会议运维（12个用例）
- 集控控制（22个用例）
- 资产管理（6个用例）
- 维护工单（8个用例）
- 会务管理（4个用例）
- 信息管理（6个用例）
- 信息发布（1个用例）
- 其他分类（8个用例）
- 数据分析补充（6个用例）

总计：73个深层交互用例
"""

import asyncio
import httpx

BASE_URL = "http://localhost:8001"
TARGET_URL = "https://192.168.5.44"

DEFAULT_CONFIG = {
    "timeout": 120000,
    "screenshot": True,
    "auto_login": True,
    "step_retry_count": 2,
}

# ==================== 步骤模板函数 ====================
# 7个模板函数（见上文）

# ==================== 各模块用例构建函数 ====================
# 9个模块用例构建函数

# ==================== 用例创建逻辑 ====================
async def create_cases():
    """创建所有深层交互用例"""
    # ...
```

---

## 四、验证方案

### 4.1 验证步骤

1. **脚本执行验证**：检查数据库用例数是否增加73个
2. **单用例验证**：每个模块挑选1个代表性用例执行
3. **批量执行验证**：批量执行所有新建用例
4. **问题修复**：针对失败用例分析原因并修复

### 4.2 通过率目标

| 模块 | 用例数 | 目标通过率 |
|------|--------|-----------|
| 会议运维 | 12 | >= 75% |
| 集控控制 | 22 | >= 70% |
| 资产管理 | 6 | >= 80% |
| 维护工单 | 8 | >= 75% |
| 会务管理 | 4 | >= 80% |
| 信息管理 | 6 | >= 75% |
| 信息发布 | 1 | >= 80% |
| 其他分类 | 8 | >= 75% |
| 数据分析 | 6 | >= 70% |
| **总计** | **73** | **>= 75%** |

---

## 五、风险与缓解

| 风险 | 概率 | 影响 | 缓解措施 |
|------|------|------|---------|
| 功能中心抽屉状态残留 | 中 | 中 | 每个用例末尾添加"回到首页"步骤 |
| 表格数据为空 | 高 | 低 | 使用 `element_exists` 断言代替 `element_count_min` |
| 筛选器下拉不弹出 | 中 | 中 | 增加多选器回退链，添加 force 点击 |
| Tab切换不生效 | 低 | 中 | 增加等待时间，验证内容变化 |
| 页面加载超时 | 中 | 中 | 增加超时时间至30s |

---

## 六、预期成果

| 指标 | 当前 | 预期 |
|------|------|------|
| 总用例数 | 202 | 275（+73） |
| 页面访问验证用例 | 59 | 59（不变） |
| 深层交互用例 | 143 | 216（+73） |
| 功能中心覆盖率 | ~50% | ~90% |
| 深层用例通过率 | - | >= 75% |