feat: P0/P1/P2全部功能 — 四层泳道/视角切换/KPI看板/预警/差异反打/预算/知识面板/回顾会/情景预测/Excel导入/角色权限

This commit is contained in:
Hermes CI Fix
2026-07-12 17:46:08 +08:00
parent cdf00efd69
commit ee25d5fa1d
8871 changed files with 1778433 additions and 0 deletions
+534
View File
@@ -0,0 +1,534 @@
# 管理会计OS(CMA)测试方案文档
> 项目:cma.sxbh.ltd
> 后端路径:`/root/cma-management/backend/`
> 前端路径:`/root/cma-management/frontend/`
> 编制日期:2026-06-08
---
## 一、现状评估
### 1.1 后端规模
| 维度 | 数量 |
|------|------|
| 全部API路由 | 121个 |
| API模块 | 22个 |
| 已有测试模块 | 3个(auth 8例 / kpis 7例 / maps 7例 = 共22例) |
| 零测试模块 | 19个 |
| 工具层文件 | 6个(全部零测试) |
### 1.2 测试缺口
- **覆盖模块率**: 3/22 = **13.6%**
- **用例数/API数**: 22/121 = **18.2%**
- **前端**: 零测试文件,零测试脚本配置
- **工具层**: 6个文件合计约1297行代码零覆盖
### 1.3 现有测试基础设施(conftest.py
```
- SQLite内存数据库引擎替换(monkey-patch database._engine
- 自动setup_db fixturecreate_all / drop_all
- db session fixture
- TestClient+依赖覆盖的 client fixture
- 3个工厂函数(create_test_user, create_test_kpi, create_test_map
- 1个token获取辅助函数(get_token_for_user
- 1个auth_header辅助函数
```
---
## 二、优先级分批策略
### 第一批(P0)——核心业务流,必须立即覆盖
| 模块 | API数 | 优先级原因 |
|------|-------|-----------|
| alerts(预警) | 6 | 核心告警流程,依赖链上游 |
| ai_analysisAI分析) | 6 | CEO简报/分析主功能,涉及DeepSeek外部API |
| dashboard(驾驶舱) | 12 | 首页核心入口,多角色视图 |
| action_plans(改善行动) | 5 | 预警下游,管理闭环 |
**P0小计:29个API,约90-120个测试用例**
### 第二批(P1)——关键支撑层
| 模块 | API数 | 优先级原因 |
|------|-------|-----------|
| notifications(通知渠道) | 7 | 多渠道推送,依赖外部服务 |
| data(数据对接) | 6 | Excel导入、数据源配置 |
| users(用户管理) | 4 | admin管理功能 |
| cache(缓存层) | 1 | 缓存工具类 |
| calc_engine(计算引擎) | 1 | KPI计算引擎 |
| cost_engine(成本引擎) | 1 | 成本分析引擎 |
| deviation_engine(差异引擎) | 1 | 差异预警引擎 |
| predict_engine(预测引擎) | 1 | 预测模拟引擎 |
| notifier(推送器) | 1 | 多渠道通知推送工具 |
**P1小计:26个API + 6个工具层,约70-100个测试用例**
### 第三批(P2)——后台管理/辅助模块
| 模块 | API数 | 优先级原因 |
|------|-------|-----------|
| templatesKPI模板) | 6 | 模板CRUD,相对独立 |
| budget(预算管理) | 10 | 预算计划CRUD+分解 |
| cost(成本分析) | 14 | 成本卡片/差异分析 |
| org(组织管理) | 6 | 组织树CRUD |
| objectives(地图目标) | 5 | 战略目标管理 |
| alignment(目标对齐) | 4 | 对齐模式管理 |
| permissions(权限管理) | 3 | 角色权限配置 |
| versions(版本管理) | 3 | 地图版本管理 |
| alert_rules(预警规则) | 2 | 规则配置 |
| thresholds(阈值设置) | 1 | 阈值配置 |
| auth(补全) | ~2 | 现有8例,补全password/reset等 |
| kpis(补全) | ~3 | 现有7例,补全filter/batch等 |
| maps(补全) | ~3 | 现有7例,补全delete/duplicate等 |
**P2小计:约64个API,约80-120个测试用例**
---
## 三、分批详细测试用例清单
### 3.1 第一批(P0
#### 3.1.1 Alerts(预警)— 6 API → ~20 个测试用例
| 序号 | API路径 | 方法 | 测试场景 | 预估用例 |
|------|---------|------|---------|---------|
| A01 | `GET /api/cma/alerts` | GET | 空列表、有数据列表、按status过滤、分页 | 4 |
| A02 | `POST /api/cma/alerts/{id}/process` | POST | 正常处理、缺少assignee报400、不存在的alert报404、已resolved重复处理报400 | 4 |
| A03 | `POST /api/cma/alerts/{id}/resolve` | POST | 正常解决、不存在的alert、附带resolution文本 | 3 |
| A04 | `POST /api/cma/alerts/{id}/escalate` | POST | yellow→red升级、red保持red、缺少assignee | 3 |
| A05 | `GET /api/cma/alerts/check-timeout` | GET | 无超时项、有超时项自动升级 | 3 |
| A06 | `POST /api/cma/alerts/{id}/create-action-plan` | POST | 正常创建、已关联报400、不存在的alert | 3 |
**工作量:约 1.5 人天**
#### 3.1.2 AI AnalysisAI分析)— 6 API → ~12 个测试用例
| 序号 | API路径 | 方法 | 测试场景 | 预估用例 |
|------|---------|------|---------|---------|
| B01 | `GET /api/cma/ai/dashboard-analysis` | GET | 无数据返回模板结论、有数据正常返回、缓存命中 | 3 |
| B02 | `GET /api/cma/ai/kpi-analysis/{id}` | GET | 存在KPI返回分析、不存在KPI报404 | 2 |
| B03 | `GET /api/cma/ai/dashboard-analysis-stream` | GET | SSE流式返回、缓存命中走缓存流 | 2 |
| B04 | `POST /api/cma/ai/ask` | POST | 有效问题返回、空问题返回400 | 2 |
| B05 | `POST /api/cma/ai/review-plans` | POST | 有plans返回分析、无plans返回提示 | 2 |
| B06 | `GET /api/cma/ai/brief` | GET | 无数据返回默认brief、有数据解析brief | 2 |
> 注:AI分析模块依赖DeepSeek外部API,测试中应mock `_call_deepseek` 函数,避免网络依赖。
**工作量:约 1 人天(含mock搭建)**
#### 3.1.3 Dashboard(驾驶舱)— 12 API → ~35 个测试用例
| 序号 | API路径 | 方法 | 测试场景 | 预估用例 |
|------|---------|------|---------|---------|
| C01 | `GET /api/cma/dashboard/summary` | GET | 空数据库、有KPI/Alert数据、缓存命中 | 4 |
| C02 | `GET /api/cma/dashboard/kpis` | GET | 无数据、有数据、period=month/quarter/year/custom | 5 |
| C03 | `GET /api/cma/dashboard/my-kpis` | GET | business角色筛选、其他角色全量、无数据 | 3 |
| C04 | `GET /api/cma/dashboard/finance-analysis` | GET | 无数据、有典型KPISALES_TOTAL等) | 3 |
| C05 | `GET /api/cma/dashboard/predict` | GET | 无历史数据、<3个点跳过、3+个点正常预测 | 3 |
| C06 | `GET /api/cma/dashboard/my-dashboard` | GET | 不同角色返回不同KPI、有action_plans、reminders | 4 |
| C07 | `GET /api/cma/dashboard/erp-trends` | GET | 部分KPI存在、全部存在 | 2 |
| C08 | `GET /api/cma/dashboard/dupont` | GET | 完整数据计算ROE、部分数据缺省 | 3 |
| C09 | `GET /api/cma/dashboard/kpis/enhanced` | GET | 带趋势数据返回 | 2 |
| C10 | `GET /api/cma/dashboard/trend-analysis` | GET | 多KPI趋势对比、空ids | 2 |
| C11 | `GET /api/cma/dashboard/alert-stats` | GET | 按等级统计、按维度统计 | 2 |
| C12 | `GET /api/cma/dashboard/export` | GET | CSV导出、指定kpi_ids过滤 | 2 |
**工作量:约 2.5 人天**
#### 3.1.4 Action Plans(改善行动)— 5 API → ~20 个测试用例
| 序号 | API路径 | 方法 | 测试场景 | 预估用例 |
|------|---------|------|---------|---------|
| D01 | `GET /api/cma/action-plans` | GET | 空列表、有数据、各种筛选参数、分页、business角色过滤 | 6 |
| D02 | `GET /api/cma/action-plans/stats` | GET | 各状态和逾期统计、无数据 | 2 |
| D03 | `POST /api/cma/action-plans` | POST | 正常创建、缺少必填字段、带所有字段 | 3 |
| D04 | `PUT /api/cma/action-plans/{id}` | PUT | 更新各字段(title/status/progress等)、不存在报404 | 5 |
| D05 | `DELETE /api/cma/action-plans/{id}` | DELETE | 正常删除、不存在报404 | 2+ |
| D06 | 已存在关联alert_id的创建 | POST | 边界情况 | 2 |
**工作量:约 1.5 人天**
---
### 3.2 第二批(P1
#### 3.2.1 Notifications(通知)— 7 API → ~20 个测试用例
| 序号 | API路径 | 方法 | 测试场景 |
|------|---------|------|---------|
| E01 | `GET /api/cma/notifications/channels` | GET | 空列表、有渠道列表 |
| E02 | `POST /api/cma/notifications/channels` | POST | 创建各类型渠道(wecom/email |
| E03 | `PUT /api/cma/notifications/channels/{id}` | PUT | 更新配置、不存在报404 |
| E04 | `DELETE /api/cma/notifications/channels/{id}` | DELETE | 正常删除 |
| E05 | `POST /api/cma/notifications/channels/{id}/test` | POST | 正常测试推送(mock notifier |
| E06 | `POST /api/cma/notifications/alerts/push` | POST | 手动推送(mock push_pending_alerts |
| E07 | `GET /api/cma/notifications/logs` | GET | 空日志、有日志、分页 |
**工作量:约 1.5 人天**
#### 3.2.2 Data(数据对接)— 6 API → ~15 个测试用例
| 序号 | API路径 | 方法 | 测试场景 |
|------|---------|------|---------|
| F01 | `POST /api/cma/data/import-excel` | POST | 合法Excel导入、缺少列报400、部分无效行 |
| F02-06 | 其他data API | 各种 | 数据源配置CRUD、操作日志查询等 |
**工作量:约 1.5 人天**
#### 3.2.3 Users(用户管理)— 4 API → ~10 个测试用例
| 序号 | API路径 | 方法 | 测试场景 |
|------|---------|------|---------|
| G01 | `GET /api/cma/users` | GET | 用户列表 |
| G02 | `POST /api/cma/users` | POST | 创建用户、重复用户名报400 |
| G03 | `PUT /api/cma/users/{id}` | PUT | 更新用户 |
| G04 | `DELETE /api/cma/users/{id}` | DELETE | 删除用户 |
**工作量:约 0.5 人天**
#### 3.2.4 工具层 Utils(单元测试)— 6文件 → ~25 个测试用例
| 文件名 | 行数 | 核心函数 | 测试场景 | 用例数 |
|--------|------|---------|---------|--------|
| `utils/notifier.py` | 251 | send_wecom_robot, send_email, push_alert, push_pending_alerts | 各渠道发送成功/失败、无渠道跳过 | 6 |
| `utils/calc_engine.py` | 93 | calculate_all | ERP数据获取、KPI计算 | 4 |
| `utils/cost_engine.py` | 282 | calc_variance, get_cost_overview, get_cost_breakdown, calc_driver_rate, allocate_cost | 量差价差计算、ABC分配 | 6 |
| `utils/deviation_engine.py` | 311 | calc_deviation, check_trend_anomaly | 差异额/率计算、趋势检测 | 5 |
| `utils/predict_engine.py` | 260 | cvp_analysis, npv_irr, sensitivity_analysis, scenario_simulation | CVP分析、NPV/IRR、敏感性分析 | 6 |
| `utils/cache.py` | 100 | get, set, delete, clear_all | Redis可用/不可用、读/写/删 | 4 |
**工作量:约 2 人天(纯单元测试,不依赖HTTP)**
---
### 3.3 第三批(P2
#### 3.3.1 各模块测试用例汇总
| 模块 | API数 | 建议用例数 | 预估工作量(人天) |
|------|-------|-----------|-----------------|
| templatesKPI模板) | 6 | 12-15 | 1 |
| budget(预算管理) | 10 | 20-25 | 2 |
| cost(成本分析) | 14 | 25-30 | 2.5 |
| org(组织管理) | 6 | 12-15 | 1 |
| objectives(地图目标) | 5 | 10-12 | 0.8 |
| alignment(目标对齐) | 4 | 8-10 | 0.5 |
| permissions(权限管理) | 3 | 6-8 | 0.5 |
| versions(版本管理) | 3 | 6-8 | 0.4 |
| alert_rules(预警规则) | 2 | 4-6 | 0.3 |
| thresholds(阈值设置) | 1 | 2-4 | 0.2 |
| auth(补全) | ~2 | 3-5 | 0.3 |
| kpis(补全) | ~3 | 4-6 | 0.3 |
| maps(补全) | ~3 | 4-6 | 0.3 |
**工作量:约 10 人天**
---
## 四、现有 conftest.py 评估与改进
### 4.1 评估结论
**当前conftest.py基本可用,但需要以下增强:**
### 4.2 需要补充的fixture
| 序号 | fixture名 | 用途 | 优先级 |
|------|-----------|------|--------|
| 1 | `create_test_kpi_value` | 创建KPIValue测试数据(含不同period | P0 |
| 2 | `create_test_alert` | 创建KPIAlert测试数据(含各种状态和等级) | P0 |
| 3 | `create_test_action_plan` | 创建ActionPlan测试数据 | P0 |
| 4 | `create_test_notification_channel` | 创建NotificationChannel测试数据 | P1 |
| 5 | `create_test_budget_plan` | 创建BudgetPlan测试数据 | P2 |
| 6 | `create_test_org_node` | 创建OrgNode测试数据(含父子层级) | P2 |
| 7 | `create_test_template` | 创建KPITemplate测试数据 | P2 |
| 8 | `mock_deepseek` | mock `_call_deepseek` 避免外部API调用 | P0 |
| 9 | `mock_notifier` | mock `push_alert` 等推送函数 | P1 |
| 10 | `authenticated_client` | 预置auth的client fixture,简化认证测试 | P0 |
| 11 | `create_test_kpis_batch` | 批量创建KPIfor dashboard趋势测试) | P0 |
| 12 | `create_test_standard_cost` | 创建标准成本卡片数据 | P2 |
| 13 | `mock_erp_api` | mock ERP API HTTP调用 | P1/P2 |
### 4.3 conftest.py 需要修改的部分
```python
# 1. 补充 model 导入(已有conftest只导入部分model,需补全)
from app.models import (
User, StrategicMap, KPIDefinition, KPIValue, KPIAlert,
ActionPlan, OrgNode, StrategicMapVersion,
NotificationChannel, NotificationLog, # 新增
BudgetPlan, # 新增
KPITemplate, # 新增
StandardCost, ActualCost, AbcActivity, # 新增
MapObjective, # 新增
RolePermission, # 新增
DataSourceConfig, OperationLog, # 新增
)
# 2. 新增 authenticated_client fixture
@pytest.fixture
def authenticated_client(client, db):
"""预创建测试用户并返回已登录的client + token"""
user = create_test_user(db)
token = get_token_for_user(client)
client.headers.update({"Authorization": f"Bearer {token}"})
return client, user, token
# 3. 新增批量创建工厂函数(P0必须)
```
---
## 五、与现有测试框架融合方案
### 5.1 保持架构一致
沿用现有模式:
```
tests/
├── conftest.py # 统一fixture和工厂函数(集中扩展)
├── test_auth.py # 已有
├── test_kpis.py # 已有
├── test_maps.py # 已有
├── test_alerts.py # 新增(P0)
├── test_ai_analysis.py # 新增(P0)
├── test_dashboard.py # 新增(P0)
├── test_action_plans.py # 新增(P0)
├── test_notifications.py # 新增(P1)
├── test_data.py # 新增(P1)
├── test_users.py # 新增(P1)
├── test_utils_notifier.py # 新增(P1) 工具层单元测试
├── test_utils_calc_engine.py # 新增(P1)
├── test_utils_cost_engine.py # 新增(P1)
├── test_utils_deviation_engine.py # 新增(P1)
├── test_utils_predict_engine.py # 新增(P1)
├── test_utils_cache.py # 新增(P1)
├── test_templates.py # 新增(P2)
├── test_budget.py # 新增(P2)
├── test_cost.py # 新增(P2)
├── test_org.py # 新增(P2)
├── test_objectives.py # 新增(P2)
├── test_alignment.py # 新增(P2)
├── test_permissions.py # 新增(P2)
├── test_versions.py # 新增(P2)
├── test_alert_rules.py # 新增(P2)
└── test_thresholds.py # 新增(P2)
```
### 5.2 测试运行配置
`backend/` 目录下创建 `pytest.ini`(如果不存在):
```ini
[pytest]
testpaths = tests
python_files = test_*.py
python_classes = Test*
python_functions = test_*
addopts = -v --tb=short --strict-markers
markers =
slow: 慢速测试(涉及外部API)
unit: 纯单元测试(不依赖HTTP)
integration: 集成测试(依赖HTTP client
```
### 5.3 运行方式
```bash
# 全部测试
cd /root/cma-management/backend
python -m pytest
# 按优先级批次
python -m pytest tests/test_alerts.py tests/test_dashboard.py tests/test_ai_analysis.py tests/test_action_plans.py -v
# 工具层单元测试(不依赖HTTP
python -m pytest tests/test_utils_*.py -v
# 带覆盖率
python -m pytest --cov=app --cov-report=term --cov-report=html:coverage_report
```
### 5.4 关键注意事项
1. **数据库隔离**SQLite 不支持 MySQL 的JSON类型,conftest.py 中 `StrategicMap.dimensions` 等 JSON 字段在 SQLAlchemy 层面应使用 `Text``JSON` 类型。当前已有 `dimensions``canvas_data` 字段,测试中传入 Python dict/list 即可——SQLite 模式下 SQLAlchemy 的 JSON 类型会回退为 PickleType 或 Text。
2. **Redis依赖**`auth_middleware.py``cache.py` 尝试连接 Redis 会优雅降级。测试环境中 Redis 不可用,token 和缓存自动走内存模式,不影响测试。
3. **DeepSeek API**`ai_analysis.py` 所有路由在实际测试中必须 mock `_call_deepseek` 函数(用 `unittest.mock.patch`),避免真实的网络请求。
4. **ERP API**`calc_engine.py` 等工具层调用 `http://127.0.0.1:8300` 必须在测试中 mock HTTP 响应。
5. **Notifier**`notifier.py``send_wecom_robot` 等发送函数必须在测试中 mock。
6. **日志文件**`dashboard.py` 中读取 `/var/log/cma-daily-sync.log`,测试环境中不会存在,需确保函数优雅处理 `FileNotFoundError`
---
## 六、前端测试方案建议
### 6.1 框架选择
| 框架 | 推荐度 | 说明 |
|------|--------|------|
| **Vitest** | ⭐⭐⭐⭐⭐ | Vite原生,与项目vite.config.ts无缝集成,社区活跃 |
| Vue Test Utils | 配合Vitest | Vue官方组件测试工具 |
| Playwright | ⭐⭐⭐⭐ | E2E测试,适合CMA这样需要验证复杂交互的系统 |
| Cypress | ⭐⭐⭐ | 较重,但社区成熟 |
**推荐方案:Vitest + @vue/test-utils(单元测试)+ PlaywrightE2E测试)**
### 6.2 安装命令
```bash
cd /root/cma-management/frontend
npm install -D vitest @vue/test-utils jsdom @playwright/test
# 或用 yarn/pnpm
```
`vite.config.ts` 中添加:
```ts
/// <reference types="vitest" />
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
test: {
environment: 'jsdom',
globals: true,
setupFiles: ['./tests/setup.ts'],
},
})
```
### 6.3 组件测试覆盖建议(按优先级)
#### P0 核心组件(立即覆盖)
| 组件 | 测试重点 |
|------|---------|
| Dashboard.vue | 各角色视图渲染、空状态、数据加载状态 |
| AlertPanel.vue | 预警列表渲染、状态流转操作、空状态 |
| KpiCard.vue | 数据展示、预警灯显示、趋势图标 |
| LoginForm.vue | 表单验证、登录成功/失败反馈 |
| StrategicMap.vue | 地图渲染、连线交互、版本切换 |
| AiSidebar.vue | 分析结果展示、负载状态、错误状态 |
#### P1 功能组件
| 组件 | 测试重点 |
|------|---------|
| ActionPlanList.vue | 列表渲染、筛选、状态更新 |
| NotificationChannel.vue | 渠道配置表单验证 |
| DataImport.vue | 文件上传、导入结果展示 |
| MyDashboard.vue | 个人工作台数据展示 |
#### P2 管理组件
| 组件 | 测试重点 |
|------|---------|
| UserManage.vue | 用户CRUD表格 |
| OrgTree.vue | 组织树渲染、节点操作 |
| BudgetForm.vue | 预算值编辑、版本切换 |
| PermissionConfig.vue | 权限矩阵渲染、异步保存 |
### 6.4 E2E测试建议
使用 Playwright 覆盖以下核心用户流:
1. **登录 → 驾驶舱 → 查看KPI → 查看预警**
2. **登录 → 战略地图 → 编辑 → 发布 → 创建行动计划**
3. **预警处理:列表 → 处理 → 解决 → 创建行动计划**
4. **AI分析:打开分析面板 → 查看简报 → 提问**
5. **管理后台:用户管理 → 组织管理 → 权限配置**
### 6.5 前端测试目录结构
```
frontend/
├── tests/
│ ├── setup.ts # 测试环境初始化
│ ├── components/
│ │ ├── Dashboard.spec.ts
│ │ ├── AlertPanel.spec.ts
│ │ ├── KpiCard.spec.ts
│ │ ├── LoginForm.spec.ts
│ │ ├── StrategicMap.spec.ts
│ │ └── ...
│ ├── views/
│ │ ├── DashboardView.spec.ts
│ │ └── ...
│ ├── stores/
│ │ ├── authStore.spec.ts
│ │ └── ...
│ └── e2e/
│ ├── auth.spec.ts
│ ├── dashboard.spec.ts
│ └── alerts.spec.ts
├── package.json
└── vite.config.ts
```
---
## 七、总体工作量预估
| 批次 | 模块 | 测试用例数 | 工作量(人天) |
|------|------|-----------|--------------|
| P0 | alerts | 20 | 1.5 |
| P0 | ai_analysis | 12 | 1.0 |
| P0 | dashboard | 35 | 2.5 |
| P0 | action_plans | 20 | 1.5 |
| | **P0小计** | **87** | **6.5** |
| P1 | notifications | 20 | 1.5 |
| P1 | data | 15 | 1.5 |
| P1 | users | 10 | 0.5 |
| P1 | utils(6) | 25 | 2.0 |
| | **P1小计** | **70** | **5.5** |
| P2 | 其余12模块+补全 | 90-140 | 10.0 |
| | **P2小计** | ~110 | **10.0** |
| 前端 | 组件+E2E | 40-60 | 5.0 |
| | **总计** | **~310** | **~27** |
### 建议排期
```
第1-2周: P0 (6.5人天) → alerts + dashboard + action_plans + ai_analysis
第3-4周: P1 (5.5人天) → notifications + data + users + utils
第5-7周: P2 (10人天) → 其余模块
第8-9周: 前端测试 (5人天) → 组件+E2E
第10周: 补丁、覆盖率优化、文档完善
```
---
## 八、测试质量目标
| 指标 | 当前 | 目标(P0后) | 目标(全部) |
|------|------|-----------|----------|
| 模块覆盖率 | 13.6% | 45% | 100% |
| API覆盖率 | 18.2% | 50%+ | 90%+ |
| 行覆盖率(backend) | ~5% | 30% | 70%+ |
| 工具层覆盖率 | 0% | 60% | 85%+ |
| 前端组件覆盖率 | 0% | 20% | 60%+ |
---
## 九、风险与缓解
| 风险 | 影响 | 缓解方案 |
|------|------|---------|
| SQLite与MySQL JSON字段不兼容 | 部分测试失败 | 用SQLAlchemy JSON类型;测试数据避免复杂JSON查询 |
| DeepSeek API 在CI中不可用 | AI模块测试失败 | 所有AI测试强制mock外部调用 |
| Redis不可用 | auth/token测试受影响 | conftest已降级到内存,无需额外处理 |
| ERP HTTP API不可用 | 工具层测试失败 | 工具层测试用 `httpx.MockTransport``respx` |
| 通知推送真实服务 | 测试可能触发真实推送 | 所有notifier函数在测试中mock |
| 前端组件依赖Element Plus | 组件测试渲染异常 | Vitest配置global stubs |
---
*文档结束,建议在执行测试开发前review确认。*