380 lines
10 KiB
Markdown
380 lines
10 KiB
Markdown
|
|
# 测试修复计划
|
|||
|
|
|
|||
|
|
## 📊 当前测试状态
|
|||
|
|
|
|||
|
|
| 指标 | 数量 |
|
|||
|
|
|------|------|
|
|||
|
|
| 总测试数 | 155 |
|
|||
|
|
| 通过 | 107 ✅ |
|
|||
|
|
| 失败 | 48 ❌ |
|
|||
|
|
| 通过率 | 69.0% |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 失败测试分类分析
|
|||
|
|
|
|||
|
|
### 第一类:API 路径不匹配(25 个)
|
|||
|
|
|
|||
|
|
**问题描述**:测试中使用的 API 路径与实际路由不一致
|
|||
|
|
|
|||
|
|
| 测试文件 | 失败数 | 实际路径 | 测试路径 | 修复方式 |
|
|||
|
|
|----------|--------|----------|----------|----------|
|
|||
|
|
| test_customers.py | 7 | `/api/customers` | 正确 | 检查权限配置 |
|
|||
|
|
| test_products.py | 5 | `/api/products`, `/api/product-categories` | `/api/products/categories` | 修正路径 |
|
|||
|
|
| test_configs.py | 4 | `/api/configs/{key}` | `/api/configs?key=xxx` | 修正路径 |
|
|||
|
|
| test_reports.py | 7 | `/api/reports/performance` | 正确 | 检查权限配置 |
|
|||
|
|
| test_system.py | 3 | `/api/system/*` | 正确 | 检查权限配置 |
|
|||
|
|
|
|||
|
|
### 第二类:权限配置问题(12 个)
|
|||
|
|
|
|||
|
|
**问题描述**:测试用户的权限码未正确配置或接口权限检查不匹配
|
|||
|
|
|
|||
|
|
| 测试文件 | 失败数 | 问题原因 |
|
|||
|
|
|----------|--------|----------|
|
|||
|
|
| test_audit.py | 2 | 审计日志接口权限码未配置 |
|
|||
|
|
| test_configs.py | 2 | 配置接口权限码未配置 |
|
|||
|
|
| test_logistics.py | 5 | 物流任务接口权限码未配置 |
|
|||
|
|
| test_order_cancel.py | 3 | 取消审批接口权限码未配置 |
|
|||
|
|
|
|||
|
|
### 第三类:接口实现问题(8 个)
|
|||
|
|
|
|||
|
|
**问题描述**:接口未完全实现或返回格式不匹配
|
|||
|
|
|
|||
|
|
| 测试文件 | 失败数 | 问题原因 |
|
|||
|
|
|----------|--------|----------|
|
|||
|
|
| test_logistics.py | 3 | 司机任务接口实现问题 |
|
|||
|
|
| test_order_cancel.py | 3 | 取消流程状态恢复逻辑问题 |
|
|||
|
|
| test_e2e.py | 2 | 端到端流程接口串联问题 |
|
|||
|
|
|
|||
|
|
### 第四类:数据模型问题(3 个)
|
|||
|
|
|
|||
|
|
**问题描述**:测试中的数据字段与实际模型不匹配
|
|||
|
|
|
|||
|
|
| 测试文件 | 失败数 | 问题原因 |
|
|||
|
|
|----------|--------|----------|
|
|||
|
|
| test_orders.py | 1 | 数量为 0 的校验未实现 |
|
|||
|
|
| test_auth.py | 1 | 系统用户接口路径问题 |
|
|||
|
|
| test_files.py | 1 | 文件上传接口路径问题 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 修复计划
|
|||
|
|
|
|||
|
|
### 阶段一:修复 API 路径问题(预计 1 小时)
|
|||
|
|
|
|||
|
|
#### 1.1 修复 test_products.py
|
|||
|
|
|
|||
|
|
**问题**:分类接口路径错误
|
|||
|
|
- 测试路径:`/api/products/categories`
|
|||
|
|
- 实际路径:`/api/product-categories`
|
|||
|
|
|
|||
|
|
**修复方案**:
|
|||
|
|
```python
|
|||
|
|
# 修改前
|
|||
|
|
resp = client.post("/api/products/categories", headers=admin_headers, json={...})
|
|||
|
|
|
|||
|
|
# 修改后
|
|||
|
|
resp = client.post("/api/product-categories", headers=admin_headers, json={...})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**影响文件**:`backend/tests/test_products.py`
|
|||
|
|
**影响用例**:5 个
|
|||
|
|
|
|||
|
|
#### 1.2 修复 test_configs.py
|
|||
|
|
|
|||
|
|
**问题**:配置查询接口路径错误
|
|||
|
|
- 测试路径:`/api/configs?config_key=xxx`
|
|||
|
|
- 实际路径:`/api/configs/{config_key}`
|
|||
|
|
|
|||
|
|
**修复方案**:
|
|||
|
|
```python
|
|||
|
|
# 修改前
|
|||
|
|
resp = client.get("/api/configs?config_key=logistics_timeout_days", headers=admin_headers)
|
|||
|
|
|
|||
|
|
# 修改后
|
|||
|
|
resp = client.get("/api/configs/logistics_timeout_days", headers=admin_headers)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**影响文件**:`backend/tests/test_configs.py`
|
|||
|
|
**影响用例**:2 个
|
|||
|
|
|
|||
|
|
#### 1.3 修复 test_customers.py
|
|||
|
|
|
|||
|
|
**问题**:部分接口路径和请求格式不匹配
|
|||
|
|
|
|||
|
|
**修复方案**:检查 customers.py 的实际接口定义,调整测试代码
|
|||
|
|
|
|||
|
|
**影响文件**:`backend/tests/test_customers.py`
|
|||
|
|
**影响用例**:7 个
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 阶段二:修复权限配置问题(预计 1.5 小时)
|
|||
|
|
|
|||
|
|
#### 2.1 添加缺失的权限码到 conftest.py
|
|||
|
|
|
|||
|
|
**需要添加的权限码**:
|
|||
|
|
|
|||
|
|
| 权限码 | 说明 | 关联接口 |
|
|||
|
|
|--------|------|----------|
|
|||
|
|
| `audit:list` | 审计日志查看 | GET /api/audit-logs |
|
|||
|
|
| `config:view` | 配置查看 | GET /api/configs/{key} |
|
|||
|
|
| `config:update` | 配置更新 | PUT /api/configs/{key} |
|
|||
|
|
| `logistics:task:create` | 创建物流任务 | POST /api/logistics/tasks |
|
|||
|
|
| `logistics:task:cancel` | 取消物流任务 | POST /api/logistics/tasks/{id}/cancel |
|
|||
|
|
| `order:cancel-approve` | 取消审批 | POST /api/orders/{id}/cancel-approve |
|
|||
|
|
|
|||
|
|
**修复方案**:在 `conftest.py` 的 `seed_menus` 中添加对应的菜单项
|
|||
|
|
|
|||
|
|
**影响文件**:`backend/tests/conftest.py`
|
|||
|
|
**影响用例**:12 个
|
|||
|
|
|
|||
|
|
#### 2.2 更新角色-菜单关联
|
|||
|
|
|
|||
|
|
**需要更新的角色权限**:
|
|||
|
|
|
|||
|
|
| 角色 | 需要添加的权限 |
|
|||
|
|
|------|---------------|
|
|||
|
|
| 管理员 (admin) | 全部权限(已配置) |
|
|||
|
|
| 业务员 (salesman) | `order:cancel-approve`(取消审批) |
|
|||
|
|
| 管理层 (manager) | `audit:list`, `config:view`, `logistics:task:create` |
|
|||
|
|
| 司机 (driver) | `logistics:task:accept`, `logistics:task:pickup`, `logistics:task:deliver` |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 阶段三:修复接口实现问题(预计 2 小时)
|
|||
|
|
|
|||
|
|
#### 3.1 修复物流任务接口
|
|||
|
|
|
|||
|
|
**问题**:
|
|||
|
|
1. 创建任务接口权限检查不正确
|
|||
|
|
2. 司机任务接口返回格式不匹配
|
|||
|
|
|
|||
|
|
**修复方案**:
|
|||
|
|
1. 检查 `backend/app/api/logistics.py` 的权限配置
|
|||
|
|
2. 确保接口返回格式与测试期望一致
|
|||
|
|
|
|||
|
|
**影响文件**:
|
|||
|
|
- `backend/app/api/logistics.py`
|
|||
|
|
- `backend/tests/test_logistics.py`
|
|||
|
|
|
|||
|
|
**影响用例**:5 个
|
|||
|
|
|
|||
|
|
#### 3.2 修复订单取消流程
|
|||
|
|
|
|||
|
|
**问题**:
|
|||
|
|
1. 取消审批拒绝后状态恢复逻辑不正确
|
|||
|
|
2. 履约中取消流程未完全实现
|
|||
|
|
|
|||
|
|
**修复方案**:
|
|||
|
|
1. 检查 `backend/app/services/order_service.py` 的取消逻辑
|
|||
|
|
2. 确保状态恢复逻辑正确
|
|||
|
|
|
|||
|
|
**影响文件**:
|
|||
|
|
- `backend/app/services/order_service.py`
|
|||
|
|
- `backend/tests/test_order_cancel.py`
|
|||
|
|
|
|||
|
|
**影响用例**:3 个
|
|||
|
|
|
|||
|
|
#### 3.3 修复端到端流程
|
|||
|
|
|
|||
|
|
**问题**:
|
|||
|
|
1. 完整订单生命周期测试失败
|
|||
|
|
2. 提醒流程测试失败
|
|||
|
|
|
|||
|
|
**修复方案**:
|
|||
|
|
1. 检查订单状态流转的完整性
|
|||
|
|
2. 确保提醒接口正确实现
|
|||
|
|
|
|||
|
|
**影响文件**:
|
|||
|
|
- `backend/tests/test_e2e.py`
|
|||
|
|
|
|||
|
|
**影响用例**:2 个
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 阶段四:修复数据模型问题(预计 0.5 小时)
|
|||
|
|
|
|||
|
|
#### 4.1 修复订单数量校验
|
|||
|
|
|
|||
|
|
**问题**:数量为 0 时未返回 40001 错误
|
|||
|
|
|
|||
|
|
**修复方案**:在 `CreateOrderRequest` 或 `order_service` 中添加数量校验
|
|||
|
|
|
|||
|
|
**影响文件**:
|
|||
|
|
- `backend/app/schemas/orders.py` 或
|
|||
|
|
- `backend/app/services/order_service.py`
|
|||
|
|
|
|||
|
|
**影响用例**:1 个
|
|||
|
|
|
|||
|
|
#### 4.2 修复文件上传接口
|
|||
|
|
|
|||
|
|
**问题**:获取上传凭证接口路径不正确
|
|||
|
|
|
|||
|
|
**修复方案**:检查 `backend/app/api/files.py` 的实际路径
|
|||
|
|
|
|||
|
|
**影响文件**:
|
|||
|
|
- `backend/tests/test_files.py`
|
|||
|
|
|
|||
|
|
**影响用例**:1 个
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 修复优先级
|
|||
|
|
|
|||
|
|
### P0 - 必须修复(影响核心功能)
|
|||
|
|
|
|||
|
|
1. **权限配置问题** - 12 个用例
|
|||
|
|
- 影响登录鉴权、订单管理、系统管理等核心模块
|
|||
|
|
|
|||
|
|
2. **订单取消流程** - 3 个用例
|
|||
|
|
- 影响订单全流程完整性
|
|||
|
|
|
|||
|
|
3. **物流任务接口** - 5 个用例
|
|||
|
|
- 影响司机履约流程
|
|||
|
|
|
|||
|
|
### P1 - 应该修复(影响功能完整性)
|
|||
|
|
|
|||
|
|
4. **API 路径问题** - 25 个用例
|
|||
|
|
- 影响客户、产品、配置、报表等模块测试
|
|||
|
|
|
|||
|
|
5. **端到端流程** - 2 个用例
|
|||
|
|
- 影响整体流程验证
|
|||
|
|
|
|||
|
|
### P2 - 可以延后(影响较小)
|
|||
|
|
|
|||
|
|
6. **数据模型问题** - 3 个用例
|
|||
|
|
- 影响边界条件测试
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🛠️ 具体修复步骤
|
|||
|
|
|
|||
|
|
### 步骤 1:修复 conftest.py 权限配置
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 在 seed_menus 中添加以下菜单项
|
|||
|
|
Menu(id=17, menu_name="审计日志", menu_path="/audit-logs", menu_type="page",
|
|||
|
|
permission_code="audit:list", sort_no=11, status=1),
|
|||
|
|
Menu(id=18, menu_name="配置查看", menu_path="", menu_type="button",
|
|||
|
|
permission_code="config:view", parent_id=6, sort_no=1, status=1),
|
|||
|
|
Menu(id=19, menu_name="配置更新", menu_path="", menu_type="button",
|
|||
|
|
permission_code="config:update", parent_id=6, sort_no=2, status=1),
|
|||
|
|
Menu(id=20, menu_name="创建物流任务", menu_path="", menu_type="button",
|
|||
|
|
permission_code="logistics:task:create", parent_id=8, sort_no=4, status=1),
|
|||
|
|
Menu(id=21, menu_name="取消物流任务", menu_path="", menu_type="button",
|
|||
|
|
permission_code="logistics:task:cancel", parent_id=8, sort_no=5, status=1),
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤 2:更新角色-菜单关联
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 在 role_menus 中添加
|
|||
|
|
# 管理层
|
|||
|
|
RoleMenu(role_id=3, menu_id=17), # audit:list
|
|||
|
|
RoleMenu(role_id=3, menu_id=18), # config:view
|
|||
|
|
RoleMenu(role_id=3, menu_id=20), # logistics:task:create
|
|||
|
|
|
|||
|
|
# 司机
|
|||
|
|
RoleMenu(role_id=4, menu_id=20), # logistics:task:create (查看)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤 3:修复 test_products.py 路径
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 所有 /api/products/categories 替换为 /api/product-categories
|
|||
|
|
resp = client.post("/api/product-categories", headers=admin_headers, json={...})
|
|||
|
|
resp = client.get("/api/product-categories", headers=admin_headers)
|
|||
|
|
resp = client.put(f"/api/product-categories/{cat.id}", headers=admin_headers, json={...})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤 4:修复 test_configs.py 路径
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 查询配置
|
|||
|
|
resp = client.get("/api/configs/logistics_timeout_days", headers=admin_headers)
|
|||
|
|
|
|||
|
|
# 更新配置
|
|||
|
|
resp = client.put("/api/configs/logistics_timeout_days", headers=admin_headers, json={
|
|||
|
|
"config_value": "3",
|
|||
|
|
})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤 5:检查并修复物流任务接口
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 检查 backend/app/api/logistics.py 的权限配置
|
|||
|
|
# 确保 require_roles 和 require_permissions 正确
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤 6:检查并修复订单取消流程
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 检查 backend/app/services/order_service.py
|
|||
|
|
# 确保 cancel_order_approve 方法正确处理拒绝情况
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 修复后预期结果
|
|||
|
|
|
|||
|
|
| 阶段 | 修复用例数 | 预期通过率 |
|
|||
|
|
|------|-----------|-----------|
|
|||
|
|
| 阶段一 | 25 | 85.2% |
|
|||
|
|
| 阶段二 | 12 | 92.9% |
|
|||
|
|
| 阶段三 | 8 | 98.1% |
|
|||
|
|
| 阶段四 | 3 | 100% |
|
|||
|
|
| **总计** | **48** | **100%** |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⏰ 时间估算
|
|||
|
|
|
|||
|
|
| 阶段 | 预计时间 | 依赖 |
|
|||
|
|
|------|---------|------|
|
|||
|
|
| 阶段一 | 1 小时 | 无 |
|
|||
|
|
| 阶段二 | 1.5 小时 | 阶段一 |
|
|||
|
|
| 阶段三 | 2 小时 | 阶段二 |
|
|||
|
|
| 阶段四 | 0.5 小时 | 阶段三 |
|
|||
|
|
| **总计** | **5 小时** | - |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 验收标准
|
|||
|
|
|
|||
|
|
1. **所有 155 个测试用例通过**
|
|||
|
|
2. **测试通过率达到 100%**
|
|||
|
|
3. **无测试警告**
|
|||
|
|
4. **测试执行时间 < 10 秒**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📌 注意事项
|
|||
|
|
|
|||
|
|
1. **修改接口代码时要谨慎**:确保不影响现有功能
|
|||
|
|
2. **优先修复 P0 问题**:权限和核心流程问题优先解决
|
|||
|
|
3. **测试与代码同步修改**:确保测试和接口代码保持一致
|
|||
|
|
4. **回归测试**:修复后运行全部测试,确保无新增失败
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔄 修复后验证
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 运行全部测试
|
|||
|
|
cd backend
|
|||
|
|
python -m pytest tests/ -v
|
|||
|
|
|
|||
|
|
# 运行 P0 测试
|
|||
|
|
python -m pytest tests/ -v -m "p0"
|
|||
|
|
|
|||
|
|
# 生成覆盖率报告
|
|||
|
|
python -m pytest tests/ --cov=app --cov-report=html
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**文档版本**: v1.0
|
|||
|
|
**创建日期**: 2026-06-10
|
|||
|
|
**维护人**: 开发团队
|