跳转至

06-测试数据管理(v3_seed × CPT 订单生成 × 数据清理 FK 倒序)

【重建推定版 V1.0】 / DOC-BT-06 / 版本 V1.0(2026-08-21 听写重建) 依据:COLLAB-02 §B3 v3_seed 组成 + WDE-002(17 账号 ON CONFLICT)+ WDE-005(demo.py _cleanup FK 倒序)+ DIP1-Schema §种子管理


一、v3 种子组成(5 大类 + 17 demo 账号)

所有种子通过 python -m backend.seed.v3_seed 一键执行,幂等 = ON CONFLICT DO NOTHING(WDE-002 验收标准)。

# 种子类别 数据量 目标表 说明
1 UFCS 统一表单(V3 新) 21 份表单模板 ufcs_form_templates 21 份覆盖 8 阶段:L1 线索、L2 需求确认、L3 报价、L4 预约、L5 到店、L6 作业、L7 交付、L8 售后(× 客户/师傅/运营 3 方)
2 VQR 二维码预设 16 份预设 vqr_presets 6 类 NPS 采集码(L6 现场、L7 交付、L8 售后、返修、推荐、口碑)× 2~3 场景 = 16
3 MFR 专项演示数据 1 份演示(宜家 PAX) mfr_special_projects + mfr_checklists 含 24 项 checklist(6 前 + 12 中 + 6 后)、MFR 认证师傅=张师傅 wkr_special_01
4 LGD 运费模板 1 份默认模板(香港岛内) lgd_shipping_templates 首 3kg=40 HKD、续 1kg=+5 HKD、逆向回收=60 HKD、跨境 B2B2C=+120 HKD
5 MDS 四库基础数据 7 大楼宇 × 8 大品类 × 3 级师傅 × 5 客户画像 基准 scl_service_catalogues / bpl_buildings / wpl_workers / cpl_customers SCL top5 品类=衣柜/厨柜/窗帘/灯具/空调;BPL 楼宇类型:住宅/公屋/居屋/工商厦/村屋/独栋/写字楼
6 17 个 Demo 账号 17 个账号 + 对应 RBAC 角色 users + rbac_role_users 清单见 04-账号与权限 §一,全部 bcrypt(Dip1@2026) 幂等

二、CPT 订单测试数据生成(订单 ID 冲突策略)

2.1 订单 ID 规范

CPT-<YYYYMMDD>-<NNNN>
    ├── YYYYMMDD:下单日期
    └── NNNN:当日序号(0001~9999,UAT 环境 = 0001~0099,避免占用生产号段)

2.2 订单生成脚本(backend/tests/scripts/generate_cpt_orders.py

参数 可选值 默认值 说明
--count 1~200 26(基线用例数) 生成订单数
--scenario std / anomaly / b2b2c_local / b2b2c_crossborder / logistics / mfr / ops_management std 对应 §二 8 阶段中 7 个大场景
--customer cus_demo_01 ~ 03 / b2b_corp_01 cus_demo_01 下单客户
--start-date 2026-08-19 格式 当天 订单日期
--cleanup-first true / false true 运行前先执行 demo.py _cleanup(FK 倒序删除)

2.3 订单 ID 冲突策略(WDE-002 延伸)

  • 冲突发生条件:同一 ID 重复写入 → 409 Conflict 返回;
  • UAT 策略--cleanup-first=true 默认每次首删后写,不冲突;
  • 幂等性:重复执行脚本结果一致(同一 --seed 输入 → 同一订单集合);
  • 数据库保留:保留 collab_test_ 前缀订单用于缺陷复现,不自动清理。

三、数据清理 FK 倒序(WDE-005 _cleanup 验收)

3.1 外键依赖链(删除必须严格倒序)

业务顺序(插入)正序:
users → rbac_role_users → cpl_customers → wpl_workers → bpl_buildings → scl_service_catalogues
→ qsv_quotes → cpt_projects → cpt_stage_logs → cpt_collected_artifacts
→ mfr_special_projects → mfr_checklist_items
→ lgd_shipments → lgd_tracking_events
→ ufcs_form_submissions → vqr_scan_records
→ rbac_audit_logs

清理顺序(删除)**必须严格倒序**(WDE-005):
rbac_audit_logs → vqr_scan_records → ufcs_form_submissions
→ lgd_tracking_events → lgd_shipments
→ mfr_checklist_items → mfr_special_projects
→ cpt_collected_artifacts → cpt_stage_logs → cpt_projects → qsv_quotes
→ scl_service_catalogues → bpl_buildings → wpl_workers → cpl_customers
→ rbac_role_users → users

3.2 _cleanup 验证脚本(每次 UAT 前自动运行)

验证点 通过标准
顺序验证 python -m backend.seed.demo _cleanup 执行 0 error(无 FK violation)
行数验证 执行后 29 V3 表行数 = v3_seed 初始值(UFCS 21/VQR 16/MFR 1/LGD 1/17 账号无业务数据)
重复执行验证 连续 3 次执行 _cleanup + v3_seed,第 3 次结果与第 1 次完全一致

四、UAT 数据隔离(避免污染生产)

维度 UAT 隔离策略 验证点
库级 数据库名:dip1_uat(生产=dip1_prod SELECT current_database(); = dip1_uat
Schema 级 所有测试对象 schema=uat_ 前缀(如 uat_.cpt_projects 表名前缀正确
订单号段 UAT 订单号 = CPT-YYYYMMDD-0001~0099 生产 ≥ 0100
账号 17 账号 UAT 密码与生产不同(生产密码通过 env 注入,不入库) demo 登录失败=UAT 正确
PDF/邮件 UAT PDF 统一输出 /data/dip1/pdf/uat/;邮件全部进入 Mailpit(不发真实客户) Mailpit 8025 可查
第三方 API OQS_ORL_BASE_URL = UAT mock 服务(UAT 调用 sandbox,返回 mock 数据不真实扣款) ORL 响应 mock 标志位

本文档为【重建推定版】,§一 v3 种子组成来源于 COLLAB-20260820-02 §B3 v3 种子(5 大类);§三 FK 倒序对应 WDE-005(demo.py _cleanup 修复);§四 数据隔离来源于 DIP1-UAT §二 首次初始化。