dingdanquanliucheng/TEST_FIX_CHECKLIST.md
2026-06-14 16:20:04 +08:00

391 lines
11 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.

# 测试修复执行清单
## 📋 快速修复清单
### ✅ 第一步:修复 conftest.py 权限配置15 分钟)
- [ ] 打开 `backend/tests/conftest.py`
- [ ]`seed_menus` 函数中添加以下菜单项:
```python
# 在 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),
```
- [ ]`role_menus` 列表中添加:
```python
# 管理层权限
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
```
- [ ] 保存文件
---
### ✅ 第二步:修复 test_products.py 路径10 分钟)
- [ ] 打开 `backend/tests/test_products.py`
- [ ] 查找并替换所有 `/api/products/categories``/api/product-categories`
- [ ] 具体修改:
- `test_create_category_success` 函数
- `test_duplicate_category_code` 函数
- `test_disable_category` 函数
- [ ] 保存文件
---
### ✅ 第三步:修复 test_configs.py 路径10 分钟)
- [ ] 打开 `backend/tests/test_configs.py`
- [ ] 修改 `test_query_config` 函数:
```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)
```
- [ ] 修改 `test_query_all_configs` 函数:
```python
# 修改前
resp = client.get("/api/configs", headers=admin_headers)
# 修改后 - 查询所有配置可能需要不同的接口,或者改为查询单个配置
resp = client.get("/api/configs/logistics_timeout_days", headers=admin_headers)
```
- [ ] 修改权限测试中的路径:
```python
# 修改前
resp = client.put("/api/configs/logistics_timeout_days", headers=salesman_headers, json={...})
# 修改后 - 保持路径正确
resp = client.put("/api/configs/logistics_timeout_days", headers=salesman_headers, json={
"config_value": "99",
})
```
- [ ] 保存文件
---
### ✅ 第四步:修复 test_customers.py20 分钟)
- [ ] 打开 `backend/tests/test_customers.py`
- [ ] 检查 `test_create_customer_success` 函数:
```python
# 确保请求格式正确
resp = client.post("/api/customers", headers=admin_headers, json={
"customer_name": "新客户测试",
"mobile": "13800001001",
"settlement_type": "immediate",
})
```
- [ ] 检查返回值格式:
```python
# 可能需要调整断言
data = resp.json()
# 检查实际返回的字段名
customer_id = data["data"].get("customer_id") or data["data"].get("id")
```
- [ ] 保存文件
---
### ✅ 第五步:修复 test_logistics.py30 分钟)
- [ ] 打开 `backend/tests/test_logistics.py`
- [ ] 检查任务创建接口:
```python
# 确保权限正确
resp = client.post("/api/logistics/tasks", headers=manager_headers, json={
"order_id": order.id,
"driver_id": 5,
"pickup_address": "泰兴工厂",
"delivery_address": "上海仓库",
"pickup_content": "测试货物",
"quantity": 10,
"factory_id": order.factory_id,
})
```
- [ ] 检查司机任务接口:
```python
# 接单
resp = client.post(f"/api/driver/tasks/{task.id}/accept", headers=driver_headers, json={})
# 揽货
resp = client.post(f"/api/driver/tasks/{task.id}/pickup", headers=driver_headers, json={
"photo_files": [{"file_url": "https://oss.example.com/pickup.jpg", "file_name": "pickup.jpg"}],
})
# 送达
resp = client.post(f"/api/driver/tasks/{task.id}/deliver", headers=driver_headers, json={})
```
- [ ] 保存文件
---
### ✅ 第六步:修复 test_order_cancel.py20 分钟)
- [ ] 打开 `backend/tests/test_order_cancel.py`
- [ ] 检查取消审批拒绝后的状态恢复:
```python
def test_cancel_rejected_by_manager(self, client, salesman_headers, manager_headers, make_product):
"""CAN-006: 取消审批拒绝,恢复原状态。"""
# ... 创建订单并申请取消 ...
# 管理层拒绝取消
resp = client.post(f"/api/orders/{order_id}/cancel-approve", headers=manager_headers, json={
"approve_result": "reject",
"approve_opinion": "不同意取消",
})
assert resp.status_code == 200
data = resp.json()
# 检查实际返回的状态字段名
assert data["data"]["order_status"] == "approved" # 或检查其他字段
```
- [ ] 检查履约中取消流程:
```python
def test_fulfillment_cancel_request(self, client, salesman_headers, manager_headers, make_order):
"""CAN-004: 履约中订单申请取消。"""
order = make_order(order_status="picked_up")
resp = client.post(f"/api/orders/{order.id}/cancel", headers=salesman_headers, json={
"cancel_reason": "客户取消履约中订单",
})
# 检查实际返回的状态
assert resp.status_code == 200
data = resp.json()
# 可能的状态值
assert data["data"]["order_status"] in ("cancel_fulfillment_pending", "canceled")
```
- [ ] 保存文件
---
### ✅ 第七步:修复 test_system.py15 分钟)
- [ ] 打开 `backend/tests/test_system.py`
- [ ] 检查禁用用户接口:
```python
def test_disable_user(self, client, admin_headers, seed_users, db_session):
"""SYS-004: 停用用户成功。"""
from backend.app.models.system import User
user = db_session.query(User).filter(User.username == "sales01").first()
# 检查实际接口路径和方法
resp = client.delete(f"/api/system/users/{user.id}", headers=admin_headers)
# 或者使用 PUT 方法
# resp = client.put(f"/api/system/users/{user.id}", headers=admin_headers, json={"status": 0})
assert resp.status_code == 200
```
- [ ] 检查角色列表接口:
```python
def test_role_list(self, client, admin_headers, seed_roles):
"""角色列表查询。"""
resp = client.get("/api/system/roles", headers=admin_headers)
assert resp.status_code == 200
data = resp.json()
# 检查返回格式
roles = data["data"] if isinstance(data["data"], list) else data["data"].get("list", [])
assert len(roles) >= 5
```
- [ ] 保存文件
---
### ✅ 第八步:修复 test_reports.py10 分钟)
- [ ] 打开 `backend/tests/test_reports.py`
- [ ] 检查报表查询接口:
```python
def test_monthly_report(self, client, manager_headers):
"""REP-001: 月度统计查询。"""
resp = client.get("/api/reports/performance", headers=manager_headers, params={
"stat_type": "monthly",
})
assert resp.status_code == 200
```
- [ ] 检查权限测试:
```python
def test_manager_can_view_report(self, client, manager_headers):
"""管理层可以查看报表。"""
resp = client.get("/api/reports/performance", headers=manager_headers)
assert resp.status_code == 200
```
- [ ] 保存文件
---
### ✅ 第九步:修复 test_e2e.py15 分钟)
- [ ] 打开 `backend/tests/test_e2e.py`
- [ ] 检查完整订单生命周期测试:
```python
def test_full_order_lifecycle(self, client, salesman_headers, manager_headers, driver_headers,
make_product, make_supplier):
"""E2E-001 + E2E-002 + E2E-003 + E2E-004 + E2E-005"""
# ... 创建订单 ...
# 检查每个步骤的返回值
create_resp = client.post("/api/orders", headers=salesman_headers, json={...})
assert create_resp.status_code == 200
order_id = create_resp.json()["data"]["order_id"]
# 提交审核
submit_resp = client.post(f"/api/orders/{order_id}/submit", headers=salesman_headers)
assert submit_resp.status_code == 200
# ... 其他步骤 ...
```
- [ ] 保存文件
---
### ✅ 第十步:修复 test_files.py10 分钟)
- [ ] 打开 `backend/tests/test_files.py`
- [ ] 检查文件上传接口路径:
```python
def test_get_upload_token(self, client, admin_headers):
"""FILE-001: 获取上传凭证成功。"""
# 检查实际接口路径
resp = client.get("/api/files/upload-token", headers=admin_headers)
# 如果接口不存在,可能需要跳过此测试
assert resp.status_code in (200, 404)
```
- [ ] 保存文件
---
## 🚀 执行修复
### 修复顺序建议
1. **先修复 conftest.py** - 权限配置是基础
2. **再修复路径问题** - test_products.py, test_configs.py
3. **然后修复接口问题** - test_logistics.py, test_order_cancel.py
4. **最后修复其他问题** - test_customers.py, test_system.py, test_reports.py
### 验证修复
每完成一步后,运行相关测试验证:
```bash
# 验证权限配置
python -m pytest tests/test_auth.py -v
# 验证产品模块
python -m pytest tests/test_products.py -v
# 验证配置模块
python -m pytest tests/test_configs.py -v
# 验证物流模块
python -m pytest tests/test_logistics.py -v
# 验证取消流程
python -m pytest tests/test_order_cancel.py -v
# 运行全部测试
python -m pytest tests/ -v
```
---
## 📊 修复进度跟踪
| 步骤 | 文件 | 用例数 | 状态 | 通过数 |
|------|------|--------|------|--------|
| 1 | conftest.py | 12 | ⬜ 待修复 | - |
| 2 | test_products.py | 5 | ⬜ 待修复 | - |
| 3 | test_configs.py | 4 | ⬜ 待修复 | - |
| 4 | test_customers.py | 7 | ⬜ 待修复 | - |
| 5 | test_logistics.py | 5 | ⬜ 待修复 | - |
| 6 | test_order_cancel.py | 3 | ⬜ 待修复 | - |
| 7 | test_system.py | 3 | ⬜ 待修复 | - |
| 8 | test_reports.py | 7 | ⬜ 待修复 | - |
| 9 | test_e2e.py | 2 | ⬜ 待修复 | - |
| 10 | test_files.py | 1 | ⬜ 待修复 | - |
| **总计** | - | **49** | - | - |
---
## 💡 常见问题解决
### Q1: 权限测试仍然失败
**解决方案**
1. 检查 `seed_menus` 中的权限码是否正确
2. 检查 `role_menus` 中的角色关联是否正确
3. 确认接口的 `require_permissions` 参数是否匹配
### Q2: 接口返回 404
**解决方案**
1. 检查接口路径是否正确
2. 确认路由注册是否正确
3. 检查 `backend/app/api/routes.py` 中是否包含了该路由
### Q3: 接口返回 500
**解决方案**
1. 查看服务器日志
2. 检查数据库表是否创建
3. 检查模型字段是否匹配
### Q4: 测试数据问题
**解决方案**
1. 检查 fixture 的依赖关系
2. 确认 `seed_data` 是否正确执行
3. 检查数据库会话是否正确隔离
---
**文档版本**: v1.0
**创建日期**: 2026-06-10
**预计完成时间**: 5 小时