fix: 批量任务进度实时汇总,暂停/中断时前端不再显示 0/总数 0%

batch_jobs.done 此前只在任务整体完成时一次性汇总,处理中途(尤其被暂停)
恒为 0,导致前端显示 "0/431 完成 0%" 而实际已处理多个视频
(回归 batch_fee668175444:已处理 15 个仍显示 0/431)。

- db: 新增 sync_batch_job_progress(按明细实时重算 done=COMPLETED+SKIPPED、
  failed=FAILED 并落库)与 refresh_batch_job(对齐后返回最新任务)
- batch 引擎: 暂停返回、SKIPPED/COMPLETED continue、视频缺失、单视频异常后、
  任务收尾等边界统一调用实时对齐,替代收尾一次性 sum
- routers/batch: 列表/详情读取前实时对齐,即使引擎不在运行也返回真实进度
- tests: 新增 6 条 TDD 回归测试覆盖 db 助手、引擎暂停、SKIPPED、API 读取侧

同时按用户要求:移除 100% 行覆盖率强制门槛(pytest 不再 --cov-fail-under),
约定小改动只跑相关测试、保证功能可用即可(AGENTS.md 与 pyproject.toml)。
This commit is contained in:
2026-09-06 16:57:05 +08:00
parent fbcb5115d8
commit 52512c26e5
6 changed files with 243 additions and 18 deletions
+10 -6
View File
@@ -28,7 +28,7 @@ vrsub/
├── web/ # 静态前端(index/tasks/admin/workflow + assets
├── model/ # 本地 whisper 权重(gitignored
├── data/ # SQLite + 上传/产物存储(gitignored
└── tests/ # 全部单元/API/冒烟测试(100% 覆盖率
└── tests/ # 单元/API/冒烟测试(覆盖核心路径,不强制 100%
```
### 核心机制
@@ -333,10 +333,14 @@ http://127.0.0.1:8000/docs API 文档
(默认 1.0)。
## 测试与覆盖率
## 测试
- 必须达到 100% 行覆盖率(pytest 已配置 `--cov-fail-under=100`,范围
`src/` 与 `nodes/`)。
- 测试以保证功能可用为目标,**不强制 100% 行覆盖率**pytest 已移除
`--cov-fail-under=100` 门槛);需要查看覆盖率时可手动追加
`uv run pytest --cov=src --cov=nodes`。
- **小改动只跑相关测试**,避免每次都完整跑全量测试浪费时间;改动涉及
哪个模块就跑对应测试文件(如 `uv run pytest tests/test_batch.py`),
确认相关用例通过、功能可用即可。完整跑全量测试只在改动影响面大时进行。
- 测试必须调用真实代码路径,不得在测试类中重写业务逻辑来模拟被测功能。
- **测试必须使用真实数据**:真实音频(合法 WAV/PCM)、真实 JSON/数据库/文件;
禁止用占位字节(如 `b"x"`)或伪造结构冒充被测数据——假数据测试只能凑覆盖率,
@@ -361,8 +365,8 @@ http://127.0.0.1:8000/docs API 文档
- **开发流程强制 TDD(红-绿-重构)**:任何新功能/修复必须先写失败测试(红),
再实现最小代码让其通过(绿),最后重构保持整洁;不允许先写实现后补测试。
- 测试运行:`uv run pytest`;全部测试位于 `tests/`。
- 100% 行覆盖率只保证代码路径被覆盖,不覆盖端口占用、防火墙、权限等
外部环境状态;端口问题用启动检查、端口检查与 uvicorn 冒烟测试补充。
- 测试(无论是否测覆盖率只保证代码路径被执行,不覆盖端口占用、防火墙、
权限等外部环境状态;端口问题用启动检查、端口检查与 uvicorn 冒烟测试补充。
- 本地出现 `WinError 10013` / `WinError 10048` 时,先用
`netstat -ano | findstr :<port>` 确认是否有残留监听进程。