Files
cmshoppe/docs/reviews/2026-06-27-T201-T205-acceptance.md
chengma 5892de5303 test: 修正Phase2验收口径并补预检断言
收录Claude对T-201到T-205的验收报告,并把报告中的GUI用例数量、T-205最终方案和T-203未登录语义改为当前口径。

同步任务文档、API文档、当前状态和progress,明确匹配账号未登录由T-205预检blocked拦截,不进入逐条采集、不写skipped或failed;别名未匹配仍由T-203逐条mark_skipped。

补强test_gui中未登录预检分支断言,确认被拦截任务保持imported/pending且last_error为空。
2026-06-27 15:28:33 +08:00

4.9 KiB
Raw Permalink Blame History

验收报告 · T-201 ~ T-205(含 T-204b)· Phase 2 导入采集

  • 日期:2026-06-27
  • 范围:Codex 完成的 Phase 2——T-201 app/excel.py 导入、T-202/T-202b Tab① 列表与汇总栏、T-203 采集旧数据、T-204 回写原 Excel、T-204b 采集后自动回写、T-205 账号就绪引导保护
  • 评审方式:编译检查 + 单元测试 + 逐模块源码阅读 + 对照 docs/06-tasks.md 验收要点
  • 结论:通过,质量偏上。T-205 采用“预检拦截 + 弹窗说明 + 自动跳④”的实现,已与当前任务文档对齐。

一、验证方法与结果

python3 -m unittest discover -s tests -p "test_excel.py"   # Ran 7 tests, OK(本机实跑,已临时装 openpyxl)
python3 -m compileall app main.py                          # OK
  • 本评审在 WSL 沙箱进行:python3 缺 PySide6/openpyxl。临时安装 openpyxl 后 excel 测试 7/7 本机实跑通过。
  • GUI/worker 测试(tests/test_gui.py 18 个用例、tests/test_workers.py)因本机无 PySide6 只能读源码 + 测试清单核对;其“绿”以 Codex 在 Windows(python = PySide6 6.5.3)的运行为准。

二、逐任务核对

任务 结论 关键核对
T-201 excel.py 导入 ✅ 多文件解析;记 source_file_abs/source_sheet/source_row/row_key;缺必需列→拒整文件记 file_errors;脏行(别名空/商品id空/非数字)逐行跳过计 invalid+row_errors;写 batches/tasks;row_key 唯一性由 DB IntegrityError 兜底;表头别名归一化(中英/空格/下划线)到位
T-202 Tab① 列表+导入+匹配标记 ✅ QTableView+TaskTableModel;未匹配别名阶段显示「略过」并有 tooltip;导入即刷新
T-202b 导入汇总栏 ✅ 文件数/行数/有效/无效/匹配/未匹配;「未匹配(n)」可点击筛出,「全部」复位
T-203 采集旧数据 ✅ CollectWorker 走后台线程;逐条 set_collected;旧封面落 images/<slug>/<item_id>_old.jpg;未匹配账号→mark_skipped 记原因;T-205 后匹配账号未登录会先被预检 blocked=True 拦截,不进入逐条采集、不写 skipped/failed;stop 协作式取消
T-204 回写原 Excel ✅ write_back 写回原文件;锁检测(winerror 5/32/33 + errno 13/16 + PermissionError)→明确提示;export_copy 另存副本退路。本机实跑验证通过
T-204b 采集后自动回写 ✅ 采集成功>0 自动触发回写;锁占用提示转「手动重试/另存」,SQLite 保留结果。合理增项

三、T-205 实现方式确认

T-205 的实现方式已确认接受。

  • 当前文档口径:无账号、Chrome 未启动、未登录时,允许用“执行按钮禁用或采集前汇总提示”的方式阻断;被阻断时提示去④账号管理处理。
  • 当前实现:采集按钮不静态置灰,点击后由 CollectWorker._preflight 预检。无账号 / Chrome 未起 / 未登录时返回 blocked=True,弹窗说明具体账号原因,并自动跳到 ④(open_accounts_callback → MainWindow.open_accounts_tab)。
  • 最终语义:匹配账号未登录属于 T-205 预检阻断,不进入 T-203 的逐条采集分支,因此不写 skipped/failed;只有别名未匹配等逐条可判定问题继续按 T-203 逻辑 mark_skipped。

评审判断:接受该实现,作为最终方案记录。静态置灰需要 UI 线程提前轮询每个账号的 CDP 登录态,成本高且容易变慢;点击时预检能给出“为什么不能跑”的具体原因,并自动导航到 ④,体验和可维护性都更合适。

四、小问题(不影响验收)

  • _on_collect_row_updated 每条 row_updated 都整表 refresh_tasks()(重查 DB + 重建 model)。大批量时偏向 O(n²) 次 DB 读,属性能小瑕,非正确性问题;可改单行局部更新。
  • 本机无法跑 GUI 测试(WSL 无 PySide6);18 个 GUI 用例(含 4 个预检/引导分支:无账号 / Chrome 未起 / 未登录 / 弹窗跳转④)的通过以 Codex 在 Windows 的运行为准——环境限制,非代码问题。

五、待办 / 边界

  • ⚠️ CollectWorker / editor.collect 对真实 Shopee 仍是 mock 覆盖,未真机冒烟;T-203“采集旧标题+旧封面下载”的真连 CDP 路径尚未跑过一次。
  • 建议:进 Phase 3(AI 生成)前,账号④走通(启动→人工登录→检测)后,对 Tab① 做一次真机采集冒烟(导入小 Excel → 采集 1~2 条 → 看 images/<slug>/ 出图 + 回写原 Excel),确认 CDP 链路在新代码下无回归。

六、总评

合格偏上的工程交付:excel 解析/回写健壮且本机实测通过,worker 线程纪律与预检引导到位,测试覆盖密(含 4 个预检/引导分支)。T-205 的“预检拦截 + 引导去④”方案已接受并与当前文档对齐。可推进 Phase 3(T-301 app/ai.py)。