diff --git a/AGENTS.md b/AGENTS.md index b491f64e..7533b742 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -225,6 +225,18 @@ return AjaxResult.success(result); - 返回结果仅展示失败数据 - 大数据量导入优先采用 EasyExcel + 异步处理 +### 导入页面测试规范 + +- 导入功能测试必须进入真实业务页面执行,先在页面内下载当前导入模板,再基于该模板生成测试文件,禁止手工凭记忆新建表头或脱离页面直接构造上传文件 +- 双 Sheet 模板的导入测试必须覆盖两个 Sheet 的联动关系;除“缺少 Sheet / 空 Sheet”专项场景外,默认两个 Sheet 都要准备测试数据 +- 导入测试文件优先放在 `output/spreadsheet/` 或 `output/playwright/`,不提交到 git +- 需要按场景拆分测试文件,避免多个互斥校验互相覆盖;至少覆盖空模板、主信息必填、主信息格式与金额、主从关系异常、供应商校验、缺少/空 Sheet、成功导入、成功与失败混合、失败记录查看、导入后清理回滚 +- 主从关系异常测试至少覆盖:已存在主键、供应商有数据但主信息缺失、主信息重复、供应商 Sheet 中采购事项 ID 为空 +- 供应商校验测试至少覆盖:重复供应商、多条中标、供应商名称为空、名称超长、联系人超长、银行账户超长、联系电话非法、统一信用代码非法、是否中标枚举非法 +- 页面上传后必须核对页面提示、导入状态、失败记录弹窗和列表总数变化;异步导入场景还要核对任务状态从 `PROCESSING` 到最终状态的变化 +- 对“成功导入 + 异常数据混合”的样本,必须额外核对成功数据是否真正入库、异常数据是否被拦截,以及是否存在被静默忽略的行 +- 导入测试结束后,必须删除本轮成功写入的测试数据,清理页面本地导入任务缓存,并关闭测试过程中启动的前后端进程 + --- ## 当前仓库结构 @@ -348,4 +360,3 @@ ccdi/ - `sql/migration/` 用于增量迁移脚本,新增修复脚本优先按日期或功能命名 - 启动前后端或 Mock 服务做验证后,结束测试时要主动停止进程,避免残留占用端口 - 前端相关安装、构建、调试、测试命令执行前,必须先通过 `nvm` 切换并确认 Node 版本 - diff --git a/docs/reports/implementation/2026-04-22-bidding-import-browser-test-and-agents-update-implementation.md b/docs/reports/implementation/2026-04-22-bidding-import-browser-test-and-agents-update-implementation.md new file mode 100644 index 00000000..64a3b1a3 --- /dev/null +++ b/docs/reports/implementation/2026-04-22-bidding-import-browser-test-and-agents-update-implementation.md @@ -0,0 +1,65 @@ +# 2026-04-22 招投标导入页面测试与 AGENTS 规范补充实施记录 + +## 1. 本次变更 + +- 更新 `AGENTS.md`,补充“导入页面测试规范” +- 基于真实页面下载模板,生成招投标信息维护导入测试样本并完成页面实测 + +## 2. 文档落点确认 + +- 规范更新文件:`/Users/wkc/Desktop/ccdi/ccdi/AGENTS.md` +- 实施记录文件:`/Users/wkc/Desktop/ccdi/ccdi/docs/reports/implementation/2026-04-22-bidding-import-browser-test-and-agents-update-implementation.md` + +## 3. 页面测试方式沉淀 + +- 先启动真实前端页面并进入 `招投标信息维护` 页面,在页面内下载当前导入模板 +- 基于页面下载的双 Sheet 模板生成测试文件,不手工重建表头 +- 将测试样本按校验维度拆分成多个工作簿,避免多个互斥错误互相覆盖 +- 每个测试样本都通过页面“导入”弹窗上传,不走原型页、不绕过页面直接调用导入服务完成主验证 +- 每次上传后同时核对页面提示、导入状态、失败记录弹窗、列表总数变化,以及后端日志中的导入任务结果 +- 对成功导入的测试数据在测试结束前执行删除回滚,保证列表数据恢复到测试前状态 + +## 4. 本次覆盖的导入场景 + +- 空模板上传 +- 主信息必填校验 +- 主信息工号/金额格式校验 +- 主从关系异常:已存在采购事项 ID、供应商有数据但主信息缺失、主信息重复、供应商 Sheet 中采购事项 ID 为空 +- 供应商校验:多条中标、重复供应商、供应商名称为空、名称超长、联系人超长、银行账户超长、联系电话非法、统一信用代码非法、是否中标枚举非法 +- 缺少供应商 Sheet +- 成功导入 +- 成功导入与异常主信息混合 +- 页面内查看导入失败记录 + +## 5. 关键测试结论 + +- 主信息必填、主信息格式/金额、主从关系异常、供应商校验等页面导入链路均已通过真实页面验证 +- “重复供应商”场景单独补充了专用样本后已命中 `采购事项ID[...]存在重复供应商` +- “缺少供应商 Sheet” 当前实现不会报错,而是允许主信息成功导入,导入记录中供应商信息为空 +- “成功导入 + 空采购事项ID主信息” 场景中,后端按 `总数 1 / 成功 1 / 失败 0` 处理,说明空采购事项 ID 的主信息行被实现层静默过滤,未触发 `采购事项ID不能为空` +- 因此,`采购事项ID不能为空` 这条校验目前无法通过真实页面导入样本直接命中,需要结合实现修正后再补测 + +## 6. 生成的测试文件 + +- 测试文件统一放在 `output/spreadsheet/` 与 `output/playwright/` 下,未纳入 git +- 本次使用的样本包括: +- `bidding_import_empty_template.xlsx` +- `bidding_import_main_required.xlsx` +- `bidding_import_main_numeric.xlsx` +- `bidding_import_structure.xlsx` +- `bidding_import_supplier_validation.xlsx` +- `bidding_import_supplier_duplicate.xlsx` +- `bidding_import_missing_supplier_sheet.xlsx` +- `bidding_import_success_and_gap.xlsx` + +## 7. 环境与清理 + +- 页面测试期间使用真实浏览器会话完成导入、失败记录查看与状态确认 +- 本轮成功写入的测试数据 `IMPCOV20260422154511SUP02`、`IMPCOV20260422154511MS01`、`IMPCOV20260422154511OK01` 已全部删除 +- 页面本地导入任务缓存已清理 +- 刷新真实页面后,列表总数已恢复到 `2004` + +## 8. 风险备注 + +- 测试过程中后端日志出现过 Redis 超时与应用重启记录,个别导入提交存在等待时间偏长现象 +- 虽然最终所有目标场景都已完成验证,但后续若继续执行批量页面导入测试,建议优先关注 Redis 连接稳定性