433 lines
9.6 KiB
Markdown
433 lines
9.6 KiB
Markdown
|
|
# 修改拉取行内流水接口返回值 - 实施计划
|
|||
|
|
|
|||
|
|
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
|
|||
|
|
|
|||
|
|
**Goal:** 修改拉取行内流水接口的返回格式,从错误格式改为返回随机 logId 数组
|
|||
|
|
|
|||
|
|
**Architecture:** 修改 `FileService.fetch_inner_flow()` 方法,使用随机数生成 logId(10000-99999),返回包含 logId 数组的成功响应,保留错误模拟功能
|
|||
|
|
|
|||
|
|
**Tech Stack:** Python 3.11, FastAPI, pytest
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Task 1: 添加测试夹具
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Modify: `tests/conftest.py:35-35` (在文件末尾添加)
|
|||
|
|
|
|||
|
|
**Step 1: 添加测试夹具**
|
|||
|
|
|
|||
|
|
在 `tests/conftest.py` 文件末尾添加:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
|
|||
|
|
@pytest.fixture
|
|||
|
|
def sample_inner_flow_request():
|
|||
|
|
"""示例拉取行内流水请求"""
|
|||
|
|
return {
|
|||
|
|
"groupId": 1001,
|
|||
|
|
"customerNo": "test_customer_001",
|
|||
|
|
"dataChannelCode": "test_code",
|
|||
|
|
"requestDateId": 20240101,
|
|||
|
|
"dataStartDateId": 20240101,
|
|||
|
|
"dataEndDateId": 20240131,
|
|||
|
|
"uploadUserId": 902001,
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 2: 验证夹具定义正确**
|
|||
|
|
|
|||
|
|
运行: `python -c "from tests.conftest import sample_inner_flow_request; print('OK')"`
|
|||
|
|
预期输出: `OK`
|
|||
|
|
|
|||
|
|
**Step 3: 提交**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add tests/conftest.py
|
|||
|
|
git commit -m "test: add sample_inner_flow_request fixture"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Task 2: 编写成功场景的失败测试
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Modify: `tests/test_api.py` (在文件末尾添加)
|
|||
|
|
|
|||
|
|
**Step 1: 编写测试用例**
|
|||
|
|
|
|||
|
|
在 `tests/test_api.py` 文件末尾添加:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
|
|||
|
|
|
|||
|
|
def test_fetch_inner_flow_success(client, sample_inner_flow_request):
|
|||
|
|
"""测试拉取行内流水 - 成功场景"""
|
|||
|
|
response = client.post(
|
|||
|
|
"/watson/api/project/getJZFileOrZjrcuFile",
|
|||
|
|
data=sample_inner_flow_request
|
|||
|
|
)
|
|||
|
|
assert response.status_code == 200
|
|||
|
|
data = response.json()
|
|||
|
|
assert data["code"] == "200"
|
|||
|
|
assert data["successResponse"] == True
|
|||
|
|
assert isinstance(data["data"], list)
|
|||
|
|
assert len(data["data"]) == 1
|
|||
|
|
assert isinstance(data["data"][0], int)
|
|||
|
|
assert 10000 <= data["data"][0] <= 99999
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 2: 运行测试验证失败**
|
|||
|
|
|
|||
|
|
运行: `pytest tests/test_api.py::test_fetch_inner_flow_success -v`
|
|||
|
|
|
|||
|
|
预期输出:
|
|||
|
|
```
|
|||
|
|
FAILED - assert data["successResponse"] == True
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 3: 暂不提交(等待实现)**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Task 3: 实现 fetch_inner_flow 方法修改
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Modify: `services/file_service.py:135-150` (修改 `fetch_inner_flow` 方法)
|
|||
|
|
|
|||
|
|
**Step 1: 读取当前实现**
|
|||
|
|
|
|||
|
|
运行: `grep -n "def fetch_inner_flow" services/file_service.py`
|
|||
|
|
|
|||
|
|
预期输出: `135: def fetch_inner_flow(self, request: Union[Dict, object]) -> Dict:`
|
|||
|
|
|
|||
|
|
**Step 2: 修改方法实现**
|
|||
|
|
|
|||
|
|
将 `services/file_service.py` 中的 `fetch_inner_flow` 方法替换为:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
def fetch_inner_flow(self, request: Union[Dict, object]) -> Dict:
|
|||
|
|
"""拉取行内流水(返回随机logId)
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
request: 拉取流水请求(可以是字典或对象)
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
流水响应字典,包含随机生成的logId数组
|
|||
|
|
"""
|
|||
|
|
import random
|
|||
|
|
|
|||
|
|
# 随机生成一个logId(范围:10000-99999)
|
|||
|
|
log_id = random.randint(10000, 99999)
|
|||
|
|
|
|||
|
|
# 返回成功的响应,包含logId数组
|
|||
|
|
return {
|
|||
|
|
"code": "200",
|
|||
|
|
"data": [log_id],
|
|||
|
|
"status": "200",
|
|||
|
|
"successResponse": True,
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 3: 运行测试验证通过**
|
|||
|
|
|
|||
|
|
运行: `pytest tests/test_api.py::test_fetch_inner_flow_success -v`
|
|||
|
|
|
|||
|
|
预期输出:
|
|||
|
|
```
|
|||
|
|
PASSED
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 4: 提交实现**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add services/file_service.py tests/test_api.py
|
|||
|
|
git commit -m "feat: modify fetch_inner_flow to return random logId array"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Task 4: 编写错误场景测试
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Modify: `tests/test_api.py` (在 test_fetch_inner_flow_success 后添加)
|
|||
|
|
|
|||
|
|
**Step 1: 编写错误场景测试**
|
|||
|
|
|
|||
|
|
在 `tests/test_api.py` 的 `test_fetch_inner_flow_success` 后添加:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
|
|||
|
|
|
|||
|
|
def test_fetch_inner_flow_error_501014(client):
|
|||
|
|
"""测试拉取行内流水 - 错误场景 501014"""
|
|||
|
|
request_data = {
|
|||
|
|
"groupId": 1001,
|
|||
|
|
"customerNo": "test_error_501014",
|
|||
|
|
"dataChannelCode": "test_code",
|
|||
|
|
"requestDateId": 20240101,
|
|||
|
|
"dataStartDateId": 20240101,
|
|||
|
|
"dataEndDateId": 20240131,
|
|||
|
|
"uploadUserId": 902001,
|
|||
|
|
}
|
|||
|
|
response = client.post(
|
|||
|
|
"/watson/api/project/getJZFileOrZjrcuFile",
|
|||
|
|
data=request_data
|
|||
|
|
)
|
|||
|
|
assert response.status_code == 200
|
|||
|
|
data = response.json()
|
|||
|
|
assert data["code"] == "501014"
|
|||
|
|
assert data["successResponse"] == False
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 2: 运行错误场景测试**
|
|||
|
|
|
|||
|
|
运行: `pytest tests/test_api.py::test_fetch_inner_flow_error_501014 -v`
|
|||
|
|
|
|||
|
|
预期输出:
|
|||
|
|
```
|
|||
|
|
PASSED
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 3: 提交测试**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add tests/test_api.py
|
|||
|
|
git commit -m "test: add error scenario test for fetch_inner_flow"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Task 5: 运行完整测试套件
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- 无文件修改
|
|||
|
|
|
|||
|
|
**Step 1: 运行所有 fetch_inner_flow 相关测试**
|
|||
|
|
|
|||
|
|
运行: `pytest tests/test_api.py -k "fetch_inner_flow" -v`
|
|||
|
|
|
|||
|
|
预期输出:
|
|||
|
|
```
|
|||
|
|
test_fetch_inner_flow_success PASSED
|
|||
|
|
test_fetch_inner_flow_error_501014 PASSED
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 2: 运行完整测试套件确保无破坏**
|
|||
|
|
|
|||
|
|
运行: `pytest tests/ -v`
|
|||
|
|
|
|||
|
|
预期输出:
|
|||
|
|
```
|
|||
|
|
所有测试 PASSED
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 3: 无需提交**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Task 6: 更新 README.md 文档
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Modify: `README.md` (更新行内流水接口说明)
|
|||
|
|
|
|||
|
|
**Step 1: 找到接口说明位置**
|
|||
|
|
|
|||
|
|
运行: `grep -n "拉取行内流水" README.md`
|
|||
|
|
|
|||
|
|
预期输出: 找到行内流水接口的说明位置
|
|||
|
|
|
|||
|
|
**Step 2: 更新接口说明**
|
|||
|
|
|
|||
|
|
在 README.md 中找到行内流水接口的说明,将"模拟无数据场景"相关描述改为:
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
### 3. 拉取行内流水
|
|||
|
|
|
|||
|
|
返回随机生成的 logId 数组(范围:10000-99999),支持通过 `error_XXXX` 标记触发错误场景。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
同时更新成功响应示例(如果有的话):
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": "200",
|
|||
|
|
"data": [19154],
|
|||
|
|
"status": "200",
|
|||
|
|
"successResponse": true
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 3: 验证文档更新**
|
|||
|
|
|
|||
|
|
运行: `grep -A 5 "拉取行内流水" README.md`
|
|||
|
|
|
|||
|
|
预期输出: 显示更新后的说明
|
|||
|
|
|
|||
|
|
**Step 4: 提交文档更新**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add README.md
|
|||
|
|
git commit -m "docs: update fetch_inner_flow interface description"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Task 7: 更新 CLAUDE.md 文档
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Modify: `CLAUDE.md` (补充行内流水接口说明)
|
|||
|
|
|
|||
|
|
**Step 1: 找到架构设计部分**
|
|||
|
|
|
|||
|
|
运行: `grep -n "### 服务类职责" CLAUDE.md`
|
|||
|
|
|
|||
|
|
预期输出: 找到服务类职责说明的位置
|
|||
|
|
|
|||
|
|
**Step 2: 更新服务类职责说明**
|
|||
|
|
|
|||
|
|
在 `CLAUDE.md` 的"服务类职责"部分,找到 `FileService` 的说明,补充:
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
- **FileService**: 管理文件记录、解析状态、支持后台任务
|
|||
|
|
- `fetch_inner_flow()`: 返回随机 logId 数组(简化管理,不存储记录)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 3: 添加行内流水接口特殊性说明**
|
|||
|
|
|
|||
|
|
在合适的位置(如"注意事项"部分)添加:
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
- **行内流水接口特殊性**:
|
|||
|
|
- 简化管理:不存储到 file_records
|
|||
|
|
- 随机 logId:无需持久化,仅用于返回
|
|||
|
|
- 无后续操作:不支持解析状态检查、删除或查询流水
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 4: 提交文档更新**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add CLAUDE.md
|
|||
|
|
git commit -m "docs: update CLAUDE.md with inner flow interface details"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Task 8: 验证 Swagger UI 文档
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- 无文件修改
|
|||
|
|
|
|||
|
|
**Step 1: 启动服务器**
|
|||
|
|
|
|||
|
|
运行: `python main.py` (后台运行或新终端)
|
|||
|
|
|
|||
|
|
预期输出:
|
|||
|
|
```
|
|||
|
|
INFO: Uvicorn running on http://0.0.0.0:8000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 2: 访问 Swagger UI**
|
|||
|
|
|
|||
|
|
打开浏览器访问: `http://localhost:8000/docs`
|
|||
|
|
|
|||
|
|
预期: 看到 `/watson/api/project/getJZFileOrZjrcuFile` 接口
|
|||
|
|
|
|||
|
|
**Step 3: 测试接口**
|
|||
|
|
|
|||
|
|
在 Swagger UI 中:
|
|||
|
|
1. 点击 `/watson/api/project/getJZFileOrZjrcuFile` 接口
|
|||
|
|
2. 点击 "Try it out"
|
|||
|
|
3. 填写测试数据:
|
|||
|
|
- groupId: 1001
|
|||
|
|
- customerNo: test_customer
|
|||
|
|
- dataChannelCode: test_code
|
|||
|
|
- requestDateId: 20240101
|
|||
|
|
- dataStartDateId: 20240101
|
|||
|
|
- dataEndDateId: 20240131
|
|||
|
|
- uploadUserId: 902001
|
|||
|
|
4. 点击 "Execute"
|
|||
|
|
5. 查看响应
|
|||
|
|
|
|||
|
|
预期响应:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": "200",
|
|||
|
|
"data": [12345],
|
|||
|
|
"status": "200",
|
|||
|
|
"successResponse": true
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 4: 停止服务器**
|
|||
|
|
|
|||
|
|
运行: `Ctrl+C` 或关闭终端
|
|||
|
|
|
|||
|
|
**Step 5: 无需提交**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Task 9: 最终验收
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- 无文件修改
|
|||
|
|
|
|||
|
|
**Step 1: 运行完整测试套件**
|
|||
|
|
|
|||
|
|
运行: `pytest tests/ -v --cov=. --cov-report=term`
|
|||
|
|
|
|||
|
|
预期输出:
|
|||
|
|
```
|
|||
|
|
所有测试 PASSED
|
|||
|
|
覆盖率报告显示 file_service.py 覆盖率提升
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 2: 验证验收标准**
|
|||
|
|
|
|||
|
|
检查以下验收标准是否全部满足:
|
|||
|
|
|
|||
|
|
- [x] 修改后接口返回正确的格式(包含 logId 数组)
|
|||
|
|
- [x] logId 在指定范围内(10000-99999)
|
|||
|
|
- [x] 错误模拟功能正常工作
|
|||
|
|
- [x] 所有测试用例通过
|
|||
|
|
- [x] 文档已更新
|
|||
|
|
- [x] 代码通过 pytest 测试
|
|||
|
|
|
|||
|
|
**Step 3: 查看提交历史**
|
|||
|
|
|
|||
|
|
运行: `git log --oneline -5`
|
|||
|
|
|
|||
|
|
预期输出:
|
|||
|
|
```
|
|||
|
|
docs: update CLAUDE.md with inner flow interface details
|
|||
|
|
docs: update fetch_inner_flow interface description
|
|||
|
|
test: add error scenario test for fetch_inner_flow
|
|||
|
|
feat: modify fetch_inner_flow to return random logId array
|
|||
|
|
test: add sample_inner_flow_request fixture
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Step 4: 完成**
|
|||
|
|
|
|||
|
|
实施完成!代码已通过所有测试,文档已更新。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 总结
|
|||
|
|
|
|||
|
|
**修改文件:**
|
|||
|
|
- `tests/conftest.py` - 添加测试夹具
|
|||
|
|
- `tests/test_api.py` - 添加 2 个测试用例
|
|||
|
|
- `services/file_service.py` - 修改 1 个方法
|
|||
|
|
- `README.md` - 更新接口说明
|
|||
|
|
- `CLAUDE.md` - 补充架构说明
|
|||
|
|
|
|||
|
|
**测试用例:**
|
|||
|
|
- `test_fetch_inner_flow_success` - 验证成功场景
|
|||
|
|
- `test_fetch_inner_flow_error_501014` - 验证错误场景
|
|||
|
|
|
|||
|
|
**提交记录:**
|
|||
|
|
- 5 个清晰的提交,遵循原子提交原则
|
|||
|
|
- 提交信息符合约定式提交规范
|
|||
|
|
|
|||
|
|
**实施时间:** 约 30 分钟
|